diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 794da0f16d7..cb400f6f2e4 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -840,9 +840,14 @@ get_vs_all_spd(const struct panvk_cmd_buffer *cmdbuf) 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); + struct panvk_priv_mem spd = + ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST + ? vs->spds.all_points + : vs->spds.all_triangles; + + assert(panvk_priv_mem_check_alloc(spd) || + !"Invalid/incomplete vertex shader"); + return panvk_priv_mem_dev_addr(spd); } #else static inline uint64_t @@ -853,9 +858,14 @@ get_vs_pos_spd(const struct panvk_cmd_buffer *cmdbuf) 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); + struct panvk_priv_mem spd = + ia->primitive_topology == VK_PRIMITIVE_TOPOLOGY_POINT_LIST + ? vs->spds.pos_points + : vs->spds.pos_triangles; + + assert(panvk_priv_mem_check_alloc(spd) || + !"Invalid/incomplete vertex shader"); + return panvk_priv_mem_dev_addr(spd); } #endif @@ -2221,8 +2231,6 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) ASSERTED bool idvs = vs->info.vs.idvs; VkResult result; - assert(vs); - /* FIXME: support non-IDVS. */ assert(idvs); @@ -2434,19 +2442,32 @@ update_prims_generated_query(struct panvk_cmd_buffer *cmdbuf, } } +static bool +skip_draw(struct panvk_cmd_buffer *cmdbuf) +{ + const struct panvk_shader_variant *vs = + panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); + + assert(vs || !"Unspecified vertex shader"); + + /* If no position is written, we can skip the draw. */ + if (!(vs->info.outputs_written & VARYING_BIT_POS)) + return true; + + return false; +} + + static void panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { const struct cs_tracing_ctx *tracing_ctx = &cmdbuf->state.cs[PANVK_SUBQUEUE_VERTEX_TILER].tracing; - const struct panvk_shader_variant *vs = - panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); struct cs_builder *b = panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); VkResult result; - /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_check_alloc(vs->spd)) + if (skip_draw(cmdbuf)) return; /* Needs to be done before get_fs() is called because it depends on @@ -2608,14 +2629,11 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, { const struct cs_tracing_ctx *tracing_ctx = &cmdbuf->state.cs[PANVK_SUBQUEUE_VERTEX_TILER].tracing; - const struct panvk_shader_variant *vs = - panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); struct cs_builder *b = panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); VkResult result; - /* If there's no vertex shader, we can skip the draw. */ - if (!panvk_priv_mem_check_alloc(vs->spd)) + if (skip_draw(cmdbuf)) return; /* Needs to be done before get_fs() is called because it depends on @@ -2645,6 +2663,8 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, update_prims_generated_query(cmdbuf, draw); + const struct panvk_shader_variant *vs = + panvk_shader_hw_variant(cmdbuf->state.gfx.vs.shader); struct panvk_shader_desc_state *vs_desc_state = &cmdbuf->state.gfx.vs.desc; const struct vk_dynamic_graphics_state *dyns =