vulkan: Batch together multiple draw calls
authorBenjamin Otte <otte@redhat.com>
Sun, 9 Jul 2023 14:50:19 +0000 (16:50 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:13:00 +0000 (12:13 +0200)
If multiple instances of the same op appear in order, we can emit one
vkCmdDraw() for all of them together.

So do that.

gsk/vulkan/gskvulkanop.c

index 657e4e31a7ae39a5f4c7d148be0c0e18993ab9a1..6ce89a25914f5a43b293ee7c5ff0d820ab393bb3 100644 (file)
@@ -98,11 +98,25 @@ gsk_vulkan_op_draw_command_n (GskVulkanOp      *op,
                               VkCommandBuffer   command_buffer,
                               gsize             instance_scale)
 {
+  GskVulkanOp *next;
+  gsize stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
+  gsize i;
+
+  i = 1;
+  for (next = op->next; next; next = next->next)
+    {
+      if (next->op_class != op->op_class ||
+          next->vertex_offset != op->vertex_offset + i * stride)
+        break;
+
+      i++;
+    }
+
   vkCmdDraw (command_buffer,
-             6 * instance_scale, 1,
-             0, op->vertex_offset / op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride);
+             6 * instance_scale, i,
+             0, op->vertex_offset / stride);
 
-  return op->next;
+  return next;
 }
 
 GskVulkanOp *