From 9912c734e96096dc0388e7bba9f7d88f476a1b4b Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Tue, 28 May 2024 08:30:31 +0200 Subject: [PATCH] v3dv: implement vkCmdBindIndexBuffer2KHR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is added with VK_KHR_maintenance5. It adds a size parameter to track the size of the index buffer data bound. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 18 ++++++++++++++---- src/broadcom/vulkan/v3dv_private.h | 1 + src/broadcom/vulkan/v3dvx_cmd_buffer.c | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index ed5e118a0b4..710b8777242 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3497,22 +3497,32 @@ v3dv_CmdBindVertexBuffers2(VkCommandBuffer commandBuffer, } VKAPI_ATTR void VKAPI_CALL -v3dv_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, - VkBuffer buffer, - VkDeviceSize offset, - VkIndexType indexType) +v3dv_CmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkDeviceSize size, + VkIndexType indexType) { V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); + assert(buffer != VK_NULL_HANDLE); + + if (size == VK_WHOLE_SIZE) { + assert(v3dv_buffer_from_handle(buffer)->size >= offset); + size = v3dv_buffer_from_handle(buffer)->size - offset; + } + const uint32_t index_size = vk_index_type_to_bytes(indexType); if (buffer == cmd_buffer->state.index_buffer.buffer && offset == cmd_buffer->state.index_buffer.offset && + size == cmd_buffer->state.index_buffer.size && index_size == cmd_buffer->state.index_buffer.index_size) { return; } cmd_buffer->state.index_buffer.buffer = buffer; cmd_buffer->state.index_buffer.offset = offset; + cmd_buffer->state.index_buffer.size = size; cmd_buffer->state.index_buffer.index_size = index_size; cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_INDEX_BUFFER; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 464f3bce233..912e9f14fc0 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1499,6 +1499,7 @@ struct v3dv_cmd_buffer_state { struct { VkBuffer buffer; VkDeviceSize offset; + VkDeviceSize size; uint8_t index_size; } index_buffer; diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c index 0b2df2c9def..7af6a2126fb 100644 --- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c @@ -2747,7 +2747,7 @@ v3dX(cmd_buffer_emit_index_buffer)(struct v3dv_cmd_buffer *cmd_buffer) assert(ibuffer->mem->bo->size >= offset); cl_emit(&job->bcl, INDEX_BUFFER_SETUP, ib) { ib.address = v3dv_cl_address(ibuffer->mem->bo, offset); - ib.size = ibuffer->mem->bo->size - offset; + ib.size = cmd_buffer->state.index_buffer.size; } }