From fb67fc6d0881699deff00d609e2f4f317cae9348 Mon Sep 17 00:00:00 2001 From: Lars-Ivar Hesselberg Simonsen Date: Fri, 20 Sep 2024 16:00:48 +0200 Subject: [PATCH] panvk: Only set index buffer size for DrawIndexed There is no need to update the index_array_size register unless the draw is indexed and the index buffer has changed. For non-indexed draws, this field is not read. To achieve this, add a new function prepare_index_buffer that updates both the size and the pointer registers in case the state is dirty. As this decouples the index buffer size register from the drawcall, set the full index buffer size. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index a6857810271..9b9bc96adf0 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1170,6 +1170,26 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf) } } +static void +prepare_index_buffer(struct panvk_cmd_buffer *cmdbuf, + struct panvk_draw_info *draw) +{ + struct cs_builder *b = + panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); + + if (draw->index.size && cmdbuf->state.gfx.ib.dirty) { + uint64_t ib_size = + panvk_buffer_range(cmdbuf->state.gfx.ib.buffer, + cmdbuf->state.gfx.ib.offset, VK_WHOLE_SIZE); + assert(ib_size <= UINT32_MAX); + cs_move32_to(b, cs_sr_reg32(b, 39), ib_size); + + cs_move64_to(b, cs_sr_reg64(b, 54), + panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer, + cmdbuf->state.gfx.ib.offset)); + } +} + static void clear_dirty(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) { @@ -1319,15 +1339,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) /* We don't use the resource dep system yet. */ cs_move32_to(b, cs_sr_reg32(b, 38), 0); - cs_move32_to( - b, cs_sr_reg32(b, 39), - (draw->index.offset + draw->vertex.count) * draw->index.size); - - if (draw->index.size && cmdbuf->state.gfx.ib.dirty) { - cs_move64_to(b, cs_sr_reg64(b, 54), - panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer, - cmdbuf->state.gfx.ib.offset)); - } + prepare_index_buffer(cmdbuf, draw); /* TODO: Revisit to avoid passing everything through the override flags * (likely needed for state preservation in secondary command buffers). */