diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index a114f6b0303..49b7b7c6fb4 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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); } } diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 63a6e28dc96..df8a52f0ed5 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -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), }; diff --git a/src/panfrost/vulkan/panvk_cmd_draw.h b/src/panfrost/vulkan/panvk_cmd_draw.h index f7fc384753b..b25af9145e5 100644 --- a/src/panfrost/vulkan/panvk_cmd_draw.h +++ b/src/panfrost/vulkan/panvk_cmd_draw.h @@ -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; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/panvk_vX_cmd_draw.c index 171a99ec94b..125b42e2879 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_draw.c @@ -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); }