panvk/csf: skip draws without position output in draw entry points

Replace the vs->spd check with VARYING_BIT_POS — the position SPD
is legitimately unallocated for no_position pipelines. Move the VS
assertion into a shared skip_draw() helper used by both draw entry
points.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41349>
This commit is contained in:
m1234n 2026-05-07 19:02:54 +08:00 committed by Marge Bot
parent 61acf0e781
commit 08fcd762dd

View file

@ -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 =