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) {