panvk/csf: Emit INDEX_BUFFER[_SIZE] even for non-indexed draws

The index buffer and index buffer size don't affect whether or not we're
actually doing indexed rendering so we should just emit them whenever
they change.  Otherwise, if someone sets an index buffer and then does a
non-indexed draw and then an indexed draw, the first draw will clear the
dirty bits without setting the index buffer registers and the second
draw won't know to re-emit them.

Fixes: 5544d39f44 ("panvk: Add a CSF backend for panvk_queue/cmd_buffer")
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Reviewed-by: Marc Alcala Prieto <marc.alcalaprieto@arm.com>
(cherry picked from commit 9c8e8ed655)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41269>
This commit is contained in:
Faith Ekstrand 2025-11-07 10:07:14 -05:00 committed by Eric Engestrom
parent e47d584fed
commit 215cffa772
2 changed files with 4 additions and 5 deletions

View file

@ -1404,7 +1404,7 @@
"description": "panvk/csf: Emit INDEX_BUFFER[_SIZE] even for non-indexed draws",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "5544d39f4420da88c53aaf8dd48d86ac92bd0eaa",
"notes": null

View file

@ -2134,13 +2134,12 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf,
}
static void
prepare_index_buffer(struct panvk_cmd_buffer *cmdbuf,
struct panvk_draw_info *draw)
prepare_index_buffer(struct panvk_cmd_buffer *cmdbuf)
{
struct cs_builder *b =
panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER);
if (draw->index.size && gfx_state_dirty(cmdbuf, IB)) {
if (gfx_state_dirty(cmdbuf, IB)) {
cs_move32_to(b, cs_sr_reg32(b, IDVS, INDEX_BUFFER_SIZE),
cmdbuf->state.gfx.ib.size);
@ -2335,7 +2334,7 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
uint32_t varying_size = get_varying_slots(cmdbuf) * 16;
cs_update_vt_ctx(b) {
prepare_index_buffer(cmdbuf, draw);
prepare_index_buffer(cmdbuf);
set_tiler_idvs_flags(b, cmdbuf, draw);