mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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:
parent
b632ac7e3b
commit
51e46ed57f
4 changed files with 21 additions and 23 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue