From 0ea139523f3a66bce99de811a91896fd2e9c7e7d Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Mon, 9 Feb 2026 12:55:28 +0100 Subject: [PATCH] nvk: Early return in draw commands when no draw will be performed Follows what other drivers do, if we do not need to emit a draw, just bail out early. Signed-off-by: Mary Guillemard Reviewed-by: Mel Henning Part-of: --- src/nouveau/vulkan/nvk_cmd_draw.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index fd3c308f147..9054264d7b3 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -4417,6 +4417,9 @@ nvk_CmdDraw(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + if (unlikely(!vertexCount || !instanceCount)) + return; + nvk_cmd_flush_gfx_state(cmd); struct nv_push *p = nvk_cmd_buffer_push(cmd, 6); @@ -4438,6 +4441,9 @@ nvk_CmdDrawMultiEXT(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + if (unlikely(!drawCount || !pVertexInfo->vertexCount || !instanceCount)) + return; + nvk_cmd_flush_gfx_state(cmd); for (uint32_t draw_index = 0; draw_index < drawCount; draw_index++) { @@ -4580,6 +4586,9 @@ nvk_CmdDrawIndexed(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + if (unlikely(!indexCount || !instanceCount)) + return; + nvk_cmd_flush_gfx_state(cmd); struct nv_push *p = nvk_cmd_buffer_push(cmd, 7); @@ -4603,6 +4612,9 @@ nvk_CmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, { VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + if (unlikely(!drawCount || !pIndexInfo->indexCount || !instanceCount)) + return; + nvk_cmd_flush_gfx_state(cmd); for (uint32_t draw_index = 0; draw_index < drawCount; draw_index++) { @@ -4671,6 +4683,9 @@ nvk_CmdDrawIndirect(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); VK_FROM_HANDLE(nvk_buffer, buffer, _buffer); + if (unlikely(!drawCount)) + return; + /* From the Vulkan 1.3.238 spec: * * VUID-vkCmdDrawIndirect-drawCount-00476 @@ -5036,6 +5051,9 @@ nvk_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); VK_FROM_HANDLE(nvk_buffer, counter_buffer, counterBuffer); + if (unlikely(!instanceCount)) + return; + nvk_cmd_flush_gfx_state(cmd); uint64_t counter_addr = vk_buffer_address(&counter_buffer->vk,