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; } }