panvk: Add get_tiler_idvs_flags

To prepare for factoring out a larger part of panvk_cmd_draw to a
separate prepare function, move tiler idvs flag calculation to a
separate function.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31314>
This commit is contained in:
Lars-Ivar Hesselberg Simonsen
2024-09-23 17:09:27 +02:00
committed by Marge Bot
parent fb67fc6d08
commit 1fa364bfe3

View File

@@ -1216,6 +1216,44 @@ clear_dirty(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
vk_dynamic_graphics_state_clear_dirty(&cmdbuf->vk.dynamic_graphics_state);
}
static struct mali_primitive_flags_packed
get_tiler_idvs_flags(struct panvk_cmd_buffer *cmdbuf,
struct panvk_draw_info *draw)
{
const struct panvk_shader *vs = cmdbuf->state.gfx.vs.shader;
const struct vk_input_assembly_state *ia =
&cmdbuf->vk.dynamic_graphics_state.ia;
struct mali_primitive_flags_packed tiler_idvs_flags;
bool writes_point_size =
vs->info.vs.writes_point_size &&
ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
pan_pack(&tiler_idvs_flags, PRIMITIVE_FLAGS, cfg) {
cfg.draw_mode = translate_prim_topology(ia->primitive_topology);
cfg.index_type = index_size_to_index_type(draw->index.size);
if (writes_point_size) {
cfg.point_size_array_format = MALI_POINT_SIZE_ARRAY_FORMAT_FP16;
cfg.position_fifo_format = MALI_FIFO_FORMAT_EXTENDED;
} else {
cfg.point_size_array_format = MALI_POINT_SIZE_ARRAY_FORMAT_NONE;
cfg.position_fifo_format = MALI_FIFO_FORMAT_BASIC;
}
if (vs->info.outputs_written & VARYING_BIT_LAYER) {
cfg.layer_index_enable = true;
cfg.position_fifo_format = MALI_FIFO_FORMAT_EXTENDED;
}
cfg.secondary_shader =
vs->info.vs.secondary_enable && fs_required(cmdbuf);
cfg.primitive_restart = ia->primitive_restart_enable;
}
return tiler_idvs_flags;
}
static void
panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
{
@@ -1224,8 +1262,6 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
struct panvk_descriptor_state *desc_state = &cmdbuf->state.gfx.desc_state;
const struct vk_rasterization_state *rs =
&cmdbuf->vk.dynamic_graphics_state.rs;
const struct vk_input_assembly_state *ia =
&cmdbuf->vk.dynamic_graphics_state.ia;
bool idvs = vs->info.vs.idvs;
VkResult result;
@@ -1290,33 +1326,6 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
return;
}
struct mali_primitive_flags_packed tiler_idvs_flags;
bool writes_point_size =
vs->info.vs.writes_point_size &&
ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
pan_pack(&tiler_idvs_flags, PRIMITIVE_FLAGS, cfg) {
cfg.draw_mode = translate_prim_topology(ia->primitive_topology);
cfg.index_type = index_size_to_index_type(draw->index.size);
if (writes_point_size) {
cfg.point_size_array_format = MALI_POINT_SIZE_ARRAY_FORMAT_FP16;
cfg.position_fifo_format = MALI_FIFO_FORMAT_EXTENDED;
} else {
cfg.point_size_array_format = MALI_POINT_SIZE_ARRAY_FORMAT_NONE;
cfg.position_fifo_format = MALI_FIFO_FORMAT_BASIC;
}
if (vs->info.outputs_written & VARYING_BIT_LAYER) {
cfg.layer_index_enable = true;
cfg.position_fifo_format = MALI_FIFO_FORMAT_EXTENDED;
}
cfg.secondary_shader =
vs->info.vs.secondary_enable && fs_required(cmdbuf);
cfg.primitive_restart = ia->primitive_restart_enable;
}
uint32_t varying_size = 0;
if (vs && fs) {
@@ -1361,6 +1370,9 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
clear_dirty(cmdbuf, draw);
struct mali_primitive_flags_packed tiler_idvs_flags =
get_tiler_idvs_flags(cmdbuf, draw);
uint32_t idvs_count = DIV_ROUND_UP(cmdbuf->state.gfx.render.layer_count,
MAX_LAYERS_PER_TILER_DESC);