From d90cbf263fbc19dfa4e47a52c836f38e6a57bcf7 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 7 Nov 2025 15:16:33 -0500 Subject: [PATCH] panvk/csf: Inline the SPD addr helpers We're already grabbing the VS for VERTEX_VARY_SPD on v11 and earlier and we're already carrying the code to check for IA_PRIMITIVE_TOPOLOGY. It makes sense to have the code which selects shader descriptor there, too. Otherwise the helper is a little too magic and can lead to bugs if someone isn't paying attention. (See also the previous commit.) Signed-off-by: Olivia Lee Reviewed-by: Boris Brezillon Reviewed-by: Christian Gmeiner Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 49 +++++++-------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index ee0f91f52a1..a975bb8d21c 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -837,34 +837,6 @@ prepare_vp(struct panvk_cmd_buffer *cmdbuf) } #endif -#if PAN_ARCH >= 12 -static inline uint64_t -get_vs_all_spd(const struct panvk_cmd_buffer *cmdbuf) -{ - const struct panvk_shader_variant *vs = - panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); - assert(vs); - const struct vk_input_assembly_state *ia = - &cmdbuf->vk.dynamic_graphics_state.ia; - return ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST - ? panvk_priv_mem_dev_addr(vs->spds.all_points) - : panvk_priv_mem_dev_addr(vs->spds.all_triangles); -} -#else -static inline uint64_t -get_vs_pos_spd(const struct panvk_cmd_buffer *cmdbuf) -{ - const struct panvk_shader_variant *vs = - panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); - assert(vs); - const struct vk_input_assembly_state *ia = - &cmdbuf->vk.dynamic_graphics_state.ia; - return ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST - ? panvk_priv_mem_dev_addr(vs->spds.pos_points) - : panvk_priv_mem_dev_addr(vs->spds.pos_triangles); -} -#endif - static void prepare_tiler_primitive_size(struct panvk_cmd_buffer *cmdbuf) { @@ -1726,6 +1698,8 @@ get_render_ctx(struct panvk_cmd_buffer *cmdbuf) static VkResult prepare_vs(struct panvk_cmd_buffer *cmdbuf, const struct panvk_draw_info *draw) { + const struct vk_input_assembly_state *ia = + &cmdbuf->vk.dynamic_graphics_state.ia; struct panvk_descriptor_state *desc_state = &cmdbuf->state.gfx.desc_state; struct panvk_shader_desc_state *vs_desc_state = &cmdbuf->state.gfx.vs.desc; const struct panvk_shader_variant *vs = @@ -1761,13 +1735,22 @@ prepare_vs(struct panvk_cmd_buffer *cmdbuf, const struct panvk_draw_info *draw) #if PAN_ARCH >= 12 if (gfx_state_dirty(cmdbuf, VS) || - dyn_gfx_state_dirty(cmdbuf, IA_PRIMITIVE_TOPOLOGY)) - cs_move64_to(b, cs_sr_reg64(b, IDVS, VERTEX_SPD), get_vs_all_spd(cmdbuf)); + dyn_gfx_state_dirty(cmdbuf, IA_PRIMITIVE_TOPOLOGY)) { + const uint64_t spd_addr = + ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST + ? panvk_priv_mem_dev_addr(vs->spds.all_points) + : panvk_priv_mem_dev_addr(vs->spds.all_triangles); + cs_move64_to(b, cs_sr_reg64(b, IDVS, VERTEX_SPD), spd_addr); + } #else if (gfx_state_dirty(cmdbuf, VS) || - dyn_gfx_state_dirty(cmdbuf, IA_PRIMITIVE_TOPOLOGY)) - cs_move64_to(b, cs_sr_reg64(b, IDVS, VERTEX_POS_SPD), - get_vs_pos_spd(cmdbuf)); + dyn_gfx_state_dirty(cmdbuf, IA_PRIMITIVE_TOPOLOGY)) { + const uint64_t pos_spd_addr = + ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST + ? panvk_priv_mem_dev_addr(vs->spds.pos_points) + : panvk_priv_mem_dev_addr(vs->spds.pos_triangles); + cs_move64_to(b, cs_sr_reg64(b, IDVS, VERTEX_POS_SPD), pos_spd_addr); + } if (gfx_state_dirty(cmdbuf, VS)) cs_move64_to(b, cs_sr_reg64(b, IDVS, VERTEX_VARY_SPD),