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:
committed by
Marge Bot
parent
9da908838a
commit
fb67fc6d08
@@ -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). */
|
||||
|
||||
Reference in New Issue
Block a user