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:
@@ -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 = {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user