panvk: Implement CmdBindIndexBuffer2()

This is needed for maintenance5.

While at it, move the buffer offseting opertaion to CmdBindVertexBuffers2()
instead of applying the offset at draw time.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34648>
This commit is contained in:
Boris Brezillon 2025-04-22 17:24:03 +02:00 committed by Marge Bot
parent b632ac7e3b
commit 51e46ed57f
4 changed files with 21 additions and 23 deletions

View file

@ -1780,15 +1780,11 @@ prepare_index_buffer(struct panvk_cmd_buffer *cmdbuf,
panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER);
if (draw->index.size && gfx_state_dirty(cmdbuf, IB)) {
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, IDVS, INDEX_BUFFER_SIZE), ib_size);
cs_move32_to(b, cs_sr_reg32(b, IDVS, INDEX_BUFFER_SIZE),
cmdbuf->state.gfx.ib.size);
cs_move64_to(b, cs_sr_reg64(b, IDVS, INDEX_BUFFER),
panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer,
cmdbuf->state.gfx.ib.offset));
cmdbuf->state.gfx.ib.dev_addr);
}
}

View file

@ -1409,14 +1409,9 @@ panvk_index_minmax_search(struct panvk_cmd_buffer *cmdbuf, uint32_t start,
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
struct panvk_instance *instance =
to_panvk_instance(dev->vk.physical->instance);
void *ptr =
cmdbuf->state.gfx.ib.buffer->host_ptr + cmdbuf->state.gfx.ib.offset;
void *ptr = cmdbuf->state.gfx.ib.host_addr;
assert(PAN_ARCH < 9 && cmdbuf->state.gfx.ib.buffer->host_ptr);
assert(cmdbuf->state.gfx.ib.buffer);
assert(cmdbuf->state.gfx.ib.buffer->bo);
assert(cmdbuf->state.gfx.ib.buffer->host_ptr);
assert(PAN_ARCH < 9 && ptr);
if (!(instance->debug_flags & PANVK_DEBUG_NO_KNOWN_WARN)) {
mesa_logw("Crawling index buffers from the CPU isn't valid in Vulkan\n");
@ -1487,8 +1482,7 @@ panvk_per_arch(CmdDrawIndexed)(VkCommandBuffer commandBuffer,
.vertex_range = vertex_range,
.padded_vertex_count =
padded_vertex_count(cmdbuf, vertex_range, instanceCount),
.indices = panvk_buffer_gpu_ptr(cmdbuf->state.gfx.ib.buffer,
cmdbuf->state.gfx.ib.offset) +
.indices = cmdbuf->state.gfx.ib.dev_addr +
(firstIndex * cmdbuf->state.gfx.ib.index_size),
};

View file

@ -154,8 +154,11 @@ struct panvk_cmd_graphics_state {
/* Index buffer */
struct {
struct panvk_buffer *buffer;
uint64_t offset;
uint64_t dev_addr;
#if PAN_ARCH <= 7
void *host_addr;
#endif
uint64_t size;
uint8_t index_size;
} ib;

View file

@ -815,15 +815,20 @@ panvk_per_arch(CmdBindVertexBuffers)(VkCommandBuffer commandBuffer,
}
VKAPI_ATTR void VKAPI_CALL
panvk_per_arch(CmdBindIndexBuffer)(VkCommandBuffer commandBuffer,
VkBuffer buffer, VkDeviceSize offset,
VkIndexType indexType)
panvk_per_arch(CmdBindIndexBuffer2)(VkCommandBuffer commandBuffer,
VkBuffer buffer, VkDeviceSize offset,
VkDeviceSize size, VkIndexType indexType)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, buf, buffer);
cmdbuf->state.gfx.ib.buffer = buf;
cmdbuf->state.gfx.ib.offset = offset;
cmdbuf->state.gfx.ib.size = panvk_buffer_range(buf, offset, size);
assert(cmdbuf->state.gfx.ib.size <= UINT32_MAX);
cmdbuf->state.gfx.ib.dev_addr = panvk_buffer_gpu_ptr(buf, offset);
#if PAN_ARCH <= 7
cmdbuf->state.gfx.ib.host_addr =
buf && buf->host_ptr ? buf->host_ptr + offset : NULL;
#endif
cmdbuf->state.gfx.ib.index_size = vk_index_type_to_bytes(indexType);
gfx_state_set_dirty(cmdbuf, IB);
}