From 0018b6cff10d7c8195a7966b3a2dd6d3d11da6c8 Mon Sep 17 00:00:00 2001 From: Olivia Lee Date: Fri, 13 Jun 2025 17:22:02 -0700 Subject: [PATCH] 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 Reviewed-by: John Anthony Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 4 ++-- src/panfrost/vulkan/panvk_vX_cmd_draw.c | 22 +++++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 4e953290a31..ff124574abd 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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 = { diff --git a/src/panfrost/vulkan/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/panvk_vX_cmd_draw.c index e22558e1593..0d968197973 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_draw.c @@ -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); }