If multiple instances of the same op appear in order, we can emit one
vkCmdDraw() for all of them together.
So do that.
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 *