From 215cffa772ceebf884f427c283625931215302c1 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 7 Nov 2025 10:07:14 -0500 Subject: [PATCH] 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: 5544d39f4420 ("panvk: Add a CSF backend for panvk_queue/cmd_buffer") Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: Marc Alcala Prieto (cherry picked from commit 9c8e8ed655376a1a90c0d879dc40d2cc4a6f63c5) Part-of: --- .pick_status.json | 2 +- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b31a2d4a88a..28a22ece7aa 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index e99ca634837..ac63a344150 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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);