mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 02:38:04 +02:00
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:
parent
61acf0e781
commit
08fcd762dd
1 changed files with 36 additions and 16 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue