vulkan: Set offsets when counting
authorBenjamin Otte <otte@redhat.com>
Thu, 18 May 2023 21:10:16 +0000 (23:10 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 4 Jun 2023 17:42:01 +0000 (19:42 +0200)
We can set the vertex offset while counting the data, this gets rid of
the need of passing all the counting machinery into the actual data
collection code.

gsk/vulkan/gskvulkanrenderpass.c

index 321ba9b0cdd2bc4a6d829c4530cd2edd4bcd38a7..97774ac595aecbf76e7e6d9d517cca333bcffd15 100644 (file)
@@ -1625,7 +1625,7 @@ static gsize
 gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self)
 {
   GskVulkanOp *op;
-  gsize n_bytes;
+  gsize n_bytes, vertex_stride;
   guint i;
 
   n_bytes = 0;
@@ -1650,13 +1650,17 @@ gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self)
         case GSK_VULKAN_OP_OUTSET_SHADOW:
         case GSK_VULKAN_OP_CROSS_FADE:
         case GSK_VULKAN_OP_BLEND_MODE:
-          op->render.vertex_count = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline);
+          vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline);
+          op->render.vertex_offset = n_bytes;
+          op->render.vertex_count = vertex_stride;
           n_bytes += op->render.vertex_count;
           break;
 
         case GSK_VULKAN_OP_TEXT:
         case GSK_VULKAN_OP_COLOR_TEXT:
-          op->text.vertex_count = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline) * op->text.num_glyphs;
+          vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline);
+          op->text.vertex_offset = n_bytes;
+          op->text.vertex_count = vertex_stride * op->text.num_glyphs;
           n_bytes += op->text.vertex_count;
           break;
 
@@ -1674,14 +1678,11 @@ gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self)
 static void
 gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
                                             GskVulkanRender     *render,
-                                            guchar              *data,
-                                            gsize                total)
+                                            guchar              *data)
 {
   GskVulkanOp *op;
-  gsize offset;
   guint i;
 
-  offset = 0;
   for (i = 0; i < self->render_ops->len; i++)
     {
       op = &g_array_index (self->render_ops, GskVulkanOp, i);
@@ -1692,98 +1693,74 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
         case GSK_VULKAN_OP_FALLBACK_CLIP:
         case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
         case GSK_VULKAN_OP_TEXTURE:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
-                                                             data + offset,
-                                                             &op->render.offset,
-                                                             &op->render.node->bounds,
-                                                             &op->render.source_rect);
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
+                                                           data + op->render.vertex_offset,
+                                                           &op->render.offset,
+                                                           &op->render.node->bounds,
+                                                           &op->render.source_rect);
           break;
 
         case GSK_VULKAN_OP_REPEAT:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
-                                                             data + offset,
-                                                             &op->render.offset,
-                                                             &op->render.node->bounds,
-                                                             &op->render.source_rect);
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
+                                                           data + op->render.vertex_offset,
+                                                           &op->render.offset,
+                                                           &op->render.node->bounds,
+                                                           &op->render.source_rect);
           break;
 
         case GSK_VULKAN_OP_TEXT:
-          {
-            op->text.vertex_offset = offset;
-            gsk_vulkan_text_pipeline_collect_vertex_data (GSK_VULKAN_TEXT_PIPELINE (op->text.pipeline),
-                                                          data + offset,
-                                                          GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
-                                                          &op->text.node->bounds,
-                                                          (PangoFont *)gsk_text_node_get_font (op->text.node),
-                                                          gsk_text_node_get_num_glyphs (op->text.node),
-                                                          gsk_text_node_get_glyphs (op->text.node, NULL),
-                                                          gsk_text_node_get_color (op->text.node),
-                                                          &GRAPHENE_POINT_INIT (
-                                                            gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
-                                                            gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
-                                                          ),
-                                                          op->text.start_glyph,
-                                                          op->text.num_glyphs,
-                                                          op->text.scale);
-            offset += op->text.vertex_count;
-          }
+          gsk_vulkan_text_pipeline_collect_vertex_data (GSK_VULKAN_TEXT_PIPELINE (op->text.pipeline),
+                                                        data + op->text.vertex_offset,
+                                                        GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
+                                                        &op->text.node->bounds,
+                                                        (PangoFont *)gsk_text_node_get_font (op->text.node),
+                                                        gsk_text_node_get_num_glyphs (op->text.node),
+                                                        gsk_text_node_get_glyphs (op->text.node, NULL),
+                                                        gsk_text_node_get_color (op->text.node),
+                                                        &GRAPHENE_POINT_INIT (
+                                                          gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+                                                          gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+                                                        ),
+                                                        op->text.start_glyph,
+                                                        op->text.num_glyphs,
+                                                        op->text.scale);
           break;
 
         case GSK_VULKAN_OP_COLOR_TEXT:
-          {
-            op->text.vertex_offset = offset;
-            gsk_vulkan_color_text_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_TEXT_PIPELINE (op->text.pipeline),
-                                                                data + offset,
-                                                                GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
-                                                                &op->text.node->bounds,
-                                                                (PangoFont *)gsk_text_node_get_font (op->text.node),
-                                                                gsk_text_node_get_num_glyphs (op->text.node),
-                                                                gsk_text_node_get_glyphs (op->text.node, NULL),
-                                                                &GRAPHENE_POINT_INIT (
-                                                                  gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
-                                                                  gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
-                                                                ),
-                                                                op->text.start_glyph,
-                                                                op->text.num_glyphs,
-                                                                op->text.scale);
-            offset += op->text.vertex_count;
-          }
+          gsk_vulkan_color_text_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_TEXT_PIPELINE (op->text.pipeline),
+                                                              data + op->text.vertex_offset,
+                                                              GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
+                                                              &op->text.node->bounds,
+                                                              (PangoFont *)gsk_text_node_get_font (op->text.node),
+                                                              gsk_text_node_get_num_glyphs (op->text.node),
+                                                              gsk_text_node_get_glyphs (op->text.node, NULL),
+                                                              &GRAPHENE_POINT_INIT (
+                                                                gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x,
+                                                                gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y
+                                                              ),
+                                                              op->text.start_glyph,
+                                                              op->text.num_glyphs,
+                                                              op->text.scale);
           break;
 
         case GSK_VULKAN_OP_COLOR:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline),
-                                                           data + offset,
-                                                           &op->render.offset,
-                                                           &op->render.node->bounds,
-                                                           gsk_color_node_get_color (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline),
+                                                         data + op->render.vertex_offset,
+                                                         &op->render.offset,
+                                                         &op->render.node->bounds,
+                                                         gsk_color_node_get_color (op->render.node));
           break;
 
         case GSK_VULKAN_OP_LINEAR_GRADIENT:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline),
-                                                                     data + offset,
-                                                                     &op->render.offset,
-                                                                     &op->render.node->bounds,
-                                                                     gsk_linear_gradient_node_get_start (op->render.node),
-                                                                     gsk_linear_gradient_node_get_end (op->render.node),
-                                                                     gsk_render_node_get_node_type (op->render.node) == GSK_REPEATING_LINEAR_GRADIENT_NODE,
-                                                                     gsk_linear_gradient_node_get_n_color_stops (op->render.node),
-                                                                     gsk_linear_gradient_node_get_color_stops (op->render.node, NULL));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline),
+                                                                   data + op->render.vertex_offset,
+                                                                   &op->render.offset,
+                                                                   &op->render.node->bounds,
+                                                                   gsk_linear_gradient_node_get_start (op->render.node),
+                                                                   gsk_linear_gradient_node_get_end (op->render.node),
+                                                                   gsk_render_node_get_node_type (op->render.node) == GSK_REPEATING_LINEAR_GRADIENT_NODE,
+                                                                   gsk_linear_gradient_node_get_n_color_stops (op->render.node),
+                                                                   gsk_linear_gradient_node_get_color_stops (op->render.node, NULL));
           break;
 
         case GSK_VULKAN_OP_OPACITY:
@@ -1799,117 +1776,87 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
                                                  0.0, 0.0, 0.0, gsk_opacity_node_get_opacity (op->render.node)
                                              });
             graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0);
-            op->render.vertex_offset = offset;
 
             gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
-                                                            data + offset,
+                                                            data + op->render.vertex_offset,
                                                             &op->render.offset,
                                                             &op->render.node->bounds,
                                                             &op->render.source_rect,
                                                             &color_matrix,
                                                             &color_offset);
-            offset += op->render.vertex_count;
           }
           break;
 
         case GSK_VULKAN_OP_BLUR:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline),
-                                                          data + offset,
-                                                          &op->render.offset,
-                                                          &op->render.node->bounds,
-                                                          &op->render.source_rect,
-                                                          gsk_blur_node_get_radius (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline),
+                                                        data + op->render.vertex_offset,
+                                                        &op->render.offset,
+                                                        &op->render.node->bounds,
+                                                        &op->render.source_rect,
+                                                        gsk_blur_node_get_radius (op->render.node));
           break;
 
         case GSK_VULKAN_OP_COLOR_MATRIX:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
-                                                            data + offset,
-                                                            &op->render.offset,
-                                                            &op->render.node->bounds,
-                                                            &op->render.source_rect,
-                                                            gsk_color_matrix_node_get_color_matrix (op->render.node),
-                                                            gsk_color_matrix_node_get_color_offset (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
+                                                          data + op->render.vertex_offset,
+                                                          &op->render.offset,
+                                                          &op->render.node->bounds,
+                                                          &op->render.source_rect,
+                                                          gsk_color_matrix_node_get_color_matrix (op->render.node),
+                                                          gsk_color_matrix_node_get_color_offset (op->render.node));
           break;
 
         case GSK_VULKAN_OP_BORDER:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline),
-                                                            data + offset,
-                                                            &op->render.offset,
-                                                            gsk_border_node_get_outline (op->render.node),
-                                                            gsk_border_node_get_widths (op->render.node),
-                                                            gsk_border_node_get_colors (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline),
+                                                          data + op->render.vertex_offset,
+                                                          &op->render.offset,
+                                                          gsk_border_node_get_outline (op->render.node),
+                                                          gsk_border_node_get_widths (op->render.node),
+                                                          gsk_border_node_get_colors (op->render.node));
           break;
 
         case GSK_VULKAN_OP_INSET_SHADOW:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
-                                                                data + offset,
-                                                                &op->render.offset,
-                                                                gsk_inset_shadow_node_get_outline (op->render.node),
-                                                                gsk_inset_shadow_node_get_color (op->render.node),
-                                                                gsk_inset_shadow_node_get_dx (op->render.node),
-                                                                gsk_inset_shadow_node_get_dy (op->render.node),
-                                                                gsk_inset_shadow_node_get_spread (op->render.node),
-                                                                gsk_inset_shadow_node_get_blur_radius (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
+                                                              data + op->render.vertex_offset,
+                                                              &op->render.offset,
+                                                              gsk_inset_shadow_node_get_outline (op->render.node),
+                                                              gsk_inset_shadow_node_get_color (op->render.node),
+                                                              gsk_inset_shadow_node_get_dx (op->render.node),
+                                                              gsk_inset_shadow_node_get_dy (op->render.node),
+                                                              gsk_inset_shadow_node_get_spread (op->render.node),
+                                                              gsk_inset_shadow_node_get_blur_radius (op->render.node));
           break;
 
         case GSK_VULKAN_OP_OUTSET_SHADOW:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
-                                                                data + offset,
-                                                                &op->render.offset,
-                                                                gsk_outset_shadow_node_get_outline (op->render.node),
-                                                                gsk_outset_shadow_node_get_color (op->render.node),
-                                                                gsk_outset_shadow_node_get_dx (op->render.node),
-                                                                gsk_outset_shadow_node_get_dy (op->render.node),
-                                                                gsk_outset_shadow_node_get_spread (op->render.node),
-                                                                gsk_outset_shadow_node_get_blur_radius (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline),
+                                                              data + op->render.vertex_offset,
+                                                              &op->render.offset,
+                                                              gsk_outset_shadow_node_get_outline (op->render.node),
+                                                              gsk_outset_shadow_node_get_color (op->render.node),
+                                                              gsk_outset_shadow_node_get_dx (op->render.node),
+                                                              gsk_outset_shadow_node_get_dy (op->render.node),
+                                                              gsk_outset_shadow_node_get_spread (op->render.node),
+                                                              gsk_outset_shadow_node_get_blur_radius (op->render.node));
           break;
 
         case GSK_VULKAN_OP_CROSS_FADE:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
-                                                                data + offset,
-                                                                &op->render.offset,
-                                                                &op->render.node->bounds,
-                                                                &op->render.source_rect,
-                                                                &op->render.source2_rect,
-                                                                gsk_cross_fade_node_get_progress (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
+                                                              data + op->render.vertex_offset,
+                                                              &op->render.offset,
+                                                              &op->render.node->bounds,
+                                                              &op->render.source_rect,
+                                                              &op->render.source2_rect,
+                                                              gsk_cross_fade_node_get_progress (op->render.node));
           break;
 
         case GSK_VULKAN_OP_BLEND_MODE:
-          {
-            op->render.vertex_offset = offset;
-            gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
-                                                                data + offset,
-                                                                &op->render.offset,
-                                                                &op->render.node->bounds,
-                                                                &op->render.source_rect,
-                                                                &op->render.source2_rect,
-                                                                gsk_blend_node_get_blend_mode (op->render.node));
-            offset += op->render.vertex_count;
-          }
+          gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
+                                                              data + op->render.vertex_offset,
+                                                              &op->render.offset,
+                                                              &op->render.node->bounds,
+                                                              &op->render.source_rect,
+                                                              &op->render.source2_rect,
+                                                              gsk_blend_node_get_blend_mode (op->render.node));
           break;
 
         default:
@@ -1917,8 +1864,6 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
         case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
           continue;
         }
-
-      g_assert (offset <= total);
     }
 }
 
@@ -1937,7 +1882,7 @@ gsk_vulkan_render_pass_get_vertex_data (GskVulkanRenderPass *self,
 
       self->vertex_data = gsk_vulkan_buffer_new (self->vulkan, n_bytes);
       data = gsk_vulkan_buffer_map (self->vertex_data);
-      gsk_vulkan_render_pass_collect_vertex_data (self, render, data, n_bytes);
+      gsk_vulkan_render_pass_collect_vertex_data (self, render, data);
       gsk_vulkan_buffer_unmap (self->vertex_data);
     }