From 0bd5734349227d63207297823f3d98f4e23f7845 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 17 Nov 2025 22:21:09 -0500 Subject: [PATCH] panvk: Set primitive_index_override when prim ID is written by IDVS Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: Olivia Lee Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 6 ++++-- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index ec435daf40e..342ade42a54 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2155,6 +2155,8 @@ set_tiler_idvs_flags(struct cs_builder *b, struct panvk_cmd_buffer *cmdbuf, ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST; bool writes_layer = vs->info.outputs_written & VARYING_BIT_LAYER; bool extended_fifo = writes_point_size || vs->info.vs.needs_extended_fifo; + bool writes_prim_id = vs->info.outputs_written & VARYING_BIT_PRIMITIVE_ID; + bool fs_reads_prim_id = fs ? fs->info.fs.reads_primitive_id : false; bool dirty = gfx_state_dirty(cmdbuf, VS) || fs_user_dirty(cmdbuf) || dyn_gfx_state_dirty(cmdbuf, IA_PRIMITIVE_RESTART_ENABLE) || @@ -2165,8 +2167,8 @@ set_tiler_idvs_flags(struct cs_builder *b, struct panvk_cmd_buffer *cmdbuf, if (dirty) { pan_pack(&tiler_idvs_flags, PRIMITIVE_FLAGS, cfg) { cfg.draw_mode = translate_prim_topology(ia->primitive_topology); - cfg.primitive_index_enable = - fs ? fs->info.fs.reads_primitive_id : false; + cfg.primitive_index_enable = fs_reads_prim_id; + cfg.primitive_index_override = writes_prim_id && fs_reads_prim_id; #if PAN_ARCH < 13 cfg.point_size_array_format = writes_point_size diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index ce260945c29..e37055c3cb1 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -938,6 +938,7 @@ panvk_emit_tiler_primitive(struct panvk_cmd_buffer *cmdbuf, vs->info.vs.writes_point_size && ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST; bool secondary_shader = vs->info.vs.secondary_enable && fs != NULL; + assert(!(vs->info.outputs_written & VARYING_BIT_PRIMITIVE_ID)); bool fs_reads_primitive_id = fs ? fs->info.fs.reads_primitive_id : false; pan_pack(prim, PRIMITIVE, cfg) {