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 <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31314>
This commit is contained in:
Lars-Ivar Hesselberg Simonsen
2024-09-20 16:00:48 +02:00
committed by Marge Bot
parent 9da908838a
commit fb67fc6d08
+21 -9
View File
@@ -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). */