vulkan: Make Op->command() return the next op
authorBenjamin Otte <otte@redhat.com>
Sun, 9 Jul 2023 13:56:30 +0000 (15:56 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:13:00 +0000 (12:13 +0200)
This way, ops can batch themselves.

They don't dothat yet, but you know where this is going...

20 files changed:
gsk/vulkan/gskvulkanblendmodeop.c
gsk/vulkan/gskvulkanblurop.c
gsk/vulkan/gskvulkanborderop.c
gsk/vulkan/gskvulkancolormatrixop.c
gsk/vulkan/gskvulkancolorop.c
gsk/vulkan/gskvulkancrossfadeop.c
gsk/vulkan/gskvulkanglyphop.c
gsk/vulkan/gskvulkaninsetshadowop.c
gsk/vulkan/gskvulkanlineargradientop.c
gsk/vulkan/gskvulkanmaskop.c
gsk/vulkan/gskvulkanoffscreenop.c
gsk/vulkan/gskvulkanop.c
gsk/vulkan/gskvulkanopprivate.h
gsk/vulkan/gskvulkanoutsetshadowop.c
gsk/vulkan/gskvulkanpushconstantsop.c
gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanscissorop.c
gsk/vulkan/gskvulkantextureop.c
gsk/vulkan/gskvulkanuploadcairoop.c
gsk/vulkan/gskvulkanuploadop.c

index fa2922eeb211597b76fe4e7a941bb644eff0ab8d..8201e727701e64d4220dbd065f2ead1c091cdd0c 100644 (file)
@@ -105,7 +105,7 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                           GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_blend_mode_op_command (GskVulkanOp      *op,
                                   GskVulkanRender  *render,
                                   VkPipelineLayout  pipeline_layout,
@@ -116,6 +116,8 @@ gsk_vulkan_blend_mode_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_blend_mode_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
index 1cf3efdefbafa7316a22743e04273060d02dc849..31bf6dc3f41d1fd6c83e59b06a157477eda01206 100644 (file)
@@ -93,7 +93,7 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_blur_op_command (GskVulkanOp      *op,
                             GskVulkanRender *render,
                             VkPipelineLayout  pipeline_layout,
@@ -104,6 +104,8 @@ gsk_vulkan_blur_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_blur_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_BLUR_OP_CLASS = {
index 71fc9411b4eec2b955cd85bb8c604db6ed261671..18ffc5d0f56fe1bd8488a9f756ffdac26b6c1c07 100644 (file)
@@ -101,7 +101,7 @@ gsk_vulkan_border_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_border_op_command (GskVulkanOp      *op,
                               GskVulkanRender *render,
                               VkPipelineLayout  pipeline_layout,
@@ -112,6 +112,8 @@ gsk_vulkan_border_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6 * 8, 1,
              0, self->vertex_offset / gsk_vulkan_border_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_BORDER_OP_CLASS = {
index d8de45597970735f0af853987c565bcbeba9ad81..a8b9750a4b230ce8c2309164d82cd106701cda6e 100644 (file)
@@ -100,7 +100,7 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                    GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_color_matrix_op_command (GskVulkanOp      *op,
                                     GskVulkanRender *render,
                                     VkPipelineLayout  pipeline_layout,
@@ -111,6 +111,8 @@ gsk_vulkan_color_matrix_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_color_matrix_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
index ee0c11cdb3041aa6f85e01d44dfd4fc4848197ad..fc099d6cdfa43e9f823ecb7aa5e7da2a657eb696 100644 (file)
@@ -86,7 +86,7 @@ gsk_vulkan_color_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_color_op_command (GskVulkanOp      *op,
                              GskVulkanRender  *render,
                              VkPipelineLayout  pipeline_layout,
@@ -97,6 +97,8 @@ gsk_vulkan_color_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_color_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_COLOR_OP_CLASS = {
index 322a69ccaa438b971ca3686a216ca3a2b7cd3226..246042b7c61613b8b94c5f462517e4d57763030f 100644 (file)
@@ -105,7 +105,7 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp     *op,
                                                                        GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_cross_fade_op_command (GskVulkanOp      *op,
                                   GskVulkanRender  *render,
                                   VkPipelineLayout  pipeline_layout,
@@ -116,6 +116,8 @@ gsk_vulkan_cross_fade_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_cross_fade_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
index b907ee193ab8a4a64fe6134a954b8d4213bad383..c5d1effae210d521144da64d2be8feecb16a937c 100644 (file)
@@ -91,7 +91,7 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_glyph_op_command (GskVulkanOp      *op,
                              GskVulkanRender  *render,
                              VkPipelineLayout  pipeline_layout,
@@ -102,6 +102,8 @@ gsk_vulkan_glyph_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_glyph_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
index 54a7845707fc527026aacb11b6b28de53248d67e..85601c2b469356b2c2fb0c1f6e686119c5aba53d 100644 (file)
@@ -88,7 +88,7 @@ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_inset_shadow_op_command (GskVulkanOp      *op,
                                     GskVulkanRender *render,
                                     VkPipelineLayout  pipeline_layout,
@@ -99,6 +99,8 @@ gsk_vulkan_inset_shadow_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_inset_shadow_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
index 2ead08eb674f66a59808d3105605266a33209287..af6484ccc2e0d8b26dca764ea657e9ddd95f79a5 100644 (file)
@@ -99,7 +99,7 @@ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp     *op,
   memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop));
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_linear_gradient_op_command (GskVulkanOp      *op,
                                        GskVulkanRender  *render,
                                        VkPipelineLayout  pipeline_layout,
@@ -110,6 +110,8 @@ gsk_vulkan_linear_gradient_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_linear_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
index dd13efa15ad6fe758d89286c5c5bf045152c0af9..2f40f9a3e7a670581bd642884e7a0394080ecf64 100644 (file)
@@ -116,7 +116,7 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->mask.image, GSK_VULKAN_SAMPLER_DEFAULT);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_mask_op_command (GskVulkanOp      *op,
                             GskVulkanRender  *render,
                             VkPipelineLayout  pipeline_layout,
@@ -127,6 +127,8 @@ gsk_vulkan_mask_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_mask_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
index 08865fa844ff20acbb9ed9cfadd5b3d6cd98c23d..8a48ebea6c816f10552ae2c34a5de893c7c3ca74 100644 (file)
@@ -78,7 +78,7 @@ gsk_vulkan_offscreen_op_reserve_descriptor_sets (GskVulkanOp     *op,
   gsk_vulkan_render_pass_reserve_descriptor_sets (self->render_pass, render);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_offscreen_op_command (GskVulkanOp      *op,
                                  GskVulkanRender  *render,
                                  VkPipelineLayout  pipeline_layout,
@@ -87,6 +87,8 @@ gsk_vulkan_offscreen_op_command (GskVulkanOp      *op,
   GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
 
   gsk_vulkan_render_draw_pass (render, self->render_pass, VK_NULL_HANDLE);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_OFFSCREEN_OP_CLASS = {
@@ -158,12 +160,13 @@ gsk_vulkan_offscreen_end_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_offscreen_end_op_command (GskVulkanOp      *op,
                                      GskVulkanRender  *render,
                                      VkPipelineLayout  pipeline_layout,
                                      VkCommandBuffer   command_buffer)
 {
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_OFFSCREEN_END_OP_CLASS = {
index bbfc46f8b71badc818c08a1d29ff6c56ef4c4906..55b8140e3953a4b4bbe296dfc5bd6e934811f91e 100644 (file)
@@ -57,12 +57,12 @@ gsk_vulkan_op_reserve_descriptor_sets (GskVulkanOp     *op,
   op->op_class->reserve_descriptor_sets (op, render);
 }
 
-void
+GskVulkanOp *
 gsk_vulkan_op_command (GskVulkanOp      *op,
                        GskVulkanRender  *render,
                        VkPipelineLayout  pipeline_layout,
                        VkCommandBuffer   command_buffer)
 {
-  op->op_class->command (op, render, pipeline_layout, command_buffer);
+  return op->op_class->command (op, render, pipeline_layout, command_buffer);
 }
 
index cd0a02531c66932acc6fd5af8d7da76759ffcb7d..cfb1e65cebae87e8302b5770ceeef7b15dd41e33 100644 (file)
@@ -47,7 +47,7 @@ struct _GskVulkanOpClass
                                                                          guchar                 *data);
   void                  (* reserve_descriptor_sets)                     (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render);
-  void                  (* command)                                     (GskVulkanOp            *op,
+  GskVulkanOp *         (* command)                                     (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render,
                                                                          VkPipelineLayout        pipeline_layout,
                                                                          VkCommandBuffer         command_buffer);
@@ -72,7 +72,7 @@ void                    gsk_vulkan_op_collect_vertex_data               (GskVulk
                                                                          guchar                 *data);
 void                    gsk_vulkan_op_reserve_descriptor_sets           (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render);
-void                    gsk_vulkan_op_command                           (GskVulkanOp            *op,
+GskVulkanOp *           gsk_vulkan_op_command                           (GskVulkanOp            *op,
                                                                          GskVulkanRender        *render,
                                                                          VkPipelineLayout        pipeline_layout,
                                                                          VkCommandBuffer         command_buffer);
index 1366a617e3b330e42d619c61bf343f27b6d59ad6..d29fbd0ca6ec805e0b473f516bddcb546066b2fd 100644 (file)
@@ -88,7 +88,7 @@ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_outset_shadow_op_command (GskVulkanOp      *op,
                                      GskVulkanRender *render,
                                      VkPipelineLayout  pipeline_layout,
@@ -99,6 +99,8 @@ gsk_vulkan_outset_shadow_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_outset_shadow_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
index 7c5db0f9e7552cd60ba69073807d38232f6801c1..2dc1d7dc1903f8b9035fcef31baee6488a597908 100644 (file)
@@ -82,7 +82,7 @@ gsk_vulkan_push_constants_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_push_constants_op_command (GskVulkanOp      *op,
                                       GskVulkanRender  *render,
                                       VkPipelineLayout  pipeline_layout,
@@ -96,6 +96,8 @@ gsk_vulkan_push_constants_op_command (GskVulkanOp      *op,
                       0,
                       sizeof (self->instance),
                       &self->instance);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS = {
index beb162bb85b50cc1feb3051c5ee159e326e10344..008328329a362daf6a74def5f3c80c11172640a4 100644 (file)
@@ -1411,7 +1411,8 @@ gsk_vulkan_render_pass_draw_rect (GskVulkanRenderPass     *self,
   const char *current_pipeline_clip_type = NULL;
   GskVulkanOp *op;
 
-  for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
+  op = gsk_vulkan_render_pass_get_first_op (self);
+  while (op)
     {
       if (op->op_class->shader_name &&
           (op->op_class != current_pipeline_class ||
@@ -1429,7 +1430,7 @@ gsk_vulkan_render_pass_draw_rect (GskVulkanRenderPass     *self,
           current_pipeline_clip_type = op->clip_type;
         }
 
-      gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
+      op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
     }
 }
 
index 27e64a676b810c9a271626e97636c67c624a78aa..c2fa3dff7b555c18881e1a94b37a7abc60e289ab 100644 (file)
@@ -56,7 +56,7 @@ gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_scissor_op_command (GskVulkanOp      *op,
                                GskVulkanRender  *render,
                                VkPipelineLayout  pipeline_layout,
@@ -71,6 +71,8 @@ gsk_vulkan_scissor_op_command (GskVulkanOp      *op,
                      { self->rect.x, self->rect.y },
                      { self->rect.width, self->rect.height },
                    });
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
index d6264d33ca2af4518e5053719b81d59b6840597d..d621e5ae1999ef17542657adcce9cffc97c59300 100644 (file)
@@ -96,7 +96,7 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp     *op,
   self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler);
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_texture_op_command (GskVulkanOp      *op,
                                GskVulkanRender  *render,
                                VkPipelineLayout  pipeline_layout,
@@ -107,6 +107,8 @@ gsk_vulkan_texture_op_command (GskVulkanOp      *op,
   vkCmdDraw (command_buffer,
              6, 1,
              0, self->vertex_offset / gsk_vulkan_texture_info.pVertexBindingDescriptions[0].stride);
+
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
index 8464ea91601cf2d4c6840ee1906a96da569f1635..72bc6272edeabd8bf39c39086e6535bd4be37539 100644 (file)
@@ -90,12 +90,13 @@ gsk_vulkan_upload_cairo_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_upload_cairo_op_command (GskVulkanOp      *op,
                                     GskVulkanRender  *render,
                                     VkPipelineLayout  pipeline_layout,
                                     VkCommandBuffer   command_buffer)
 {
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
index 84092522a6f133939846eafc4caf2e066383604e..1a0eb6dfc0b92fe7ef71c405c063dac1c57482f8 100644 (file)
@@ -71,12 +71,13 @@ gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp     *op,
 {
 }
 
-static void
+static GskVulkanOp *
 gsk_vulkan_upload_op_command (GskVulkanOp      *op,
                               GskVulkanRender  *render,
                               VkPipelineLayout  pipeline_layout,
                               VkCommandBuffer   command_buffer)
 {
+  return op->next;
 }
 
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_OP_CLASS = {