v3dv/cmd_buffer: return early for draw commands if there is nothing to draw
authorAlejandro Piñeiro <apinheiro@igalia.com>
Thu, 25 Mar 2021 00:45:39 +0000 (01:45 +0100)
committerMarge Bot <eric+marge@anholt.net>
Thu, 25 Mar 2021 09:38:04 +0000 (09:38 +0000)
So for example, on v3dv_CmdDrawIndexed we can return early if
instanceCount is 0.

This fixes failures when using the simulator with tests with the
following pattern:
dEQP-VK.draw.instanced.draw_indexed_vk_primitive_topology*

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9820>

src/broadcom/vulkan/v3dv_cmd_buffer.c

index 871f79f..e7effa2 100644 (file)
@@ -4398,6 +4398,9 @@ v3dv_CmdDraw(VkCommandBuffer commandBuffer,
              uint32_t firstVertex,
              uint32_t firstInstance)
 {
+   if (vertexCount == 0 || instanceCount == 0)
+      return;
+
    V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
    struct v3dv_draw_info info = {};
    info.vertex_count = vertexCount;
@@ -4416,6 +4419,9 @@ v3dv_CmdDrawIndexed(VkCommandBuffer commandBuffer,
                     int32_t vertexOffset,
                     uint32_t firstInstance)
 {
+   if (indexCount == 0 || instanceCount == 0)
+      return;
+
    V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
 
    cmd_buffer_emit_pre_draw(cmd_buffer);
@@ -4474,6 +4480,9 @@ v3dv_CmdDrawIndirect(VkCommandBuffer commandBuffer,
                      uint32_t drawCount,
                      uint32_t stride)
 {
+   if (drawCount == 0)
+      return;
+
    V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
    V3DV_FROM_HANDLE(v3dv_buffer, buffer, _buffer);
 
@@ -4509,6 +4518,9 @@ v3dv_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
                             uint32_t drawCount,
                             uint32_t stride)
 {
+   if (drawCount == 0)
+      return;
+
    V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
    V3DV_FROM_HANDLE(v3dv_buffer, buffer, _buffer);