From 63ad2343916f9a75fd7b068b4ccb0bc1a133f29f Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 9 Jul 2023 16:50:19 +0200 Subject: [PATCH] vulkan: Batch together multiple draw calls 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 | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/gsk/vulkan/gskvulkanop.c b/gsk/vulkan/gskvulkanop.c index 657e4e31a7..6ce89a2591 100644 --- a/gsk/vulkan/gskvulkanop.c +++ b/gsk/vulkan/gskvulkanop.c @@ -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 * -- 2.30.2