panvk: allow binding VK_NULL_HANDLE index buffers

This is required by VK_KHR_maintenance6. Because we don't
advertise nullDescriptor, it is only valid to draw with a null index
buffer if the draw accesses 0 indices. For direct draws, this is covered
by checks on instancedCount and indexCount. For indirect draws we need
to add an additional check, under the assumption that if the index
buffer is null, the draw must be empty.

Signed-off-by: Olivia Lee <olivia.lee@collabora.com>
Reviewed-by: John Anthony <john.anthony@arm.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35528>
This commit is contained in:
Olivia Lee
2025-06-13 17:22:02 -07:00
parent b9046ffa14
commit 0018b6cff1
2 changed files with 18 additions and 8 deletions
+2 -2
View File
@@ -2655,7 +2655,7 @@ panvk_per_arch(CmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer,
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, buffer, _buffer);
if (drawCount == 0)
if (drawCount == 0 || cmdbuf->state.gfx.ib.size == 0)
return;
struct panvk_draw_info draw = {
@@ -2708,7 +2708,7 @@ panvk_per_arch(CmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer,
VK_FROM_HANDLE(panvk_buffer, buffer, _buffer);
VK_FROM_HANDLE(panvk_buffer, count_buffer, countBuffer);
if (maxDrawCount == 0)
if (maxDrawCount == 0 || cmdbuf->state.gfx.ib.size == 0)
return;
struct panvk_draw_info draw = {
+16 -6
View File
@@ -891,13 +891,23 @@ panvk_per_arch(CmdBindIndexBuffer2)(VkCommandBuffer commandBuffer,
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, buf, buffer);
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 (buf) {
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;
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);
cmdbuf->state.gfx.ib.index_size = vk_index_type_to_bytes(indexType);
} else {
cmdbuf->state.gfx.ib.size = 0;
cmdbuf->state.gfx.ib.dev_addr = 0;
#if PAN_ARCH <= 7
cmdbuf->state.gfx.ib.host_addr = 0;
#endif
cmdbuf->state.gfx.ib.index_size = 0;
}
gfx_state_set_dirty(cmdbuf, IB);
}