[gtk/wip/baedert/gl-rework: 2/2] gl renderer: Load vertex data directly into vertices GArray



commit b09d4afafaa21df5b7677d2c5c5b3f8b5865a0db
Author: Timm Bäder <mail baedert org>
Date:   Wed Dec 18 09:06:16 2019 +0100

    gl renderer: Load vertex data directly into vertices GArray

 gsk/gl/gskglrenderer.c         | 34 +++++++---------------------------
 gsk/gl/gskglrenderops.c        | 11 +++++++++--
 gsk/gl/gskglrenderopsprivate.h |  2 +-
 3 files changed, 17 insertions(+), 30 deletions(-)
---
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index a8991e2afc..eca808a65b 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -856,13 +856,9 @@ render_color_node (GskGLRenderer   *self,
                    GskRenderNode   *node,
                    RenderOpBuilder *builder)
 {
-  GskQuadVertex vertex_data[GL_N_VERTICES];
-
-  load_vertex_data (vertex_data, node, builder);
-
   ops_set_program (builder, &self->color_program);
   ops_set_color (builder, gsk_color_node_peek_color (node));
-  ops_draw (builder, vertex_data);
+  load_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
@@ -1131,7 +1127,6 @@ render_linear_gradient_node (GskGLRenderer   *self,
                              GskRenderNode   *node,
                              RenderOpBuilder *builder)
 {
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   OpLinearGradient *op;
   int n_color_stops = MIN (8, gsk_linear_gradient_node_get_n_color_stops (node));
   const GskColorStop *stops = gsk_linear_gradient_node_peek_color_stops (node);
@@ -1147,9 +1142,7 @@ render_linear_gradient_node (GskGLRenderer   *self,
   op->end_point.x = end->x + builder->dx;
   op->end_point.y = end->y + builder->dy;
 
-  load_vertex_data (vertex_data, node, builder);
-
-  ops_draw (builder, vertex_data);
+  load_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
@@ -1496,7 +1489,6 @@ render_blur_node (GskGLRenderer   *self,
 {
   const float blur_radius = gsk_blur_node_get_radius (node);
   GskRenderNode *child = gsk_blur_node_get_child (node);
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   TextureRegion blurred_region;
 
   if (blur_radius <= 0)
@@ -1512,10 +1504,9 @@ render_blur_node (GskGLRenderer   *self,
   g_assert (blurred_region.texture_id != 0);
 
   /* Draw the result */
-  load_offscreen_vertex_data (vertex_data, node, builder);
   ops_set_program (builder, &self->blit_program);
   ops_set_texture (builder, blurred_region.texture_id);
-  ops_draw (builder, vertex_data); /* Render result to screen */
+  load_offscreen_vertex_data (ops_draw (builder, NULL), node, builder); /* Render result to screen */
 
   /* Add to cache for the blur node */
   gsk_gl_driver_set_texture_for_pointer (self->gl_driver, node, blurred_region.texture_id);
@@ -1526,7 +1517,6 @@ render_unblurred_inset_shadow_node (GskGLRenderer   *self,
                                     GskRenderNode   *node,
                                     RenderOpBuilder *builder)
 {
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   const float scale = ops_get_scale (builder);
   const float blur_radius = gsk_inset_shadow_node_get_blur_radius (node);
   const float dx = gsk_inset_shadow_node_get_dx (node);
@@ -1544,9 +1534,7 @@ render_unblurred_inset_shadow_node (GskGLRenderer   *self,
   op->offset[0] = dx * scale;
   op->offset[1] = dy * scale;
 
-  load_vertex_data (vertex_data, node, builder);
-
-  ops_draw (builder, vertex_data);
+  load_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
@@ -1715,7 +1703,6 @@ render_unblurred_outset_shadow_node (GskGLRenderer   *self,
   const float spread = gsk_outset_shadow_node_get_spread (node);
   const float dx = gsk_outset_shadow_node_get_dx (node);
   const float dy = gsk_outset_shadow_node_get_dy (node);
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   OpShadow *op;
 
   ops_set_program (builder, &self->unblurred_outset_shadow_program);
@@ -1726,8 +1713,7 @@ render_unblurred_outset_shadow_node (GskGLRenderer   *self,
   op->offset[0] = dx * scale;
   op->offset[1] = dy * scale;
 
-  load_vertex_data (vertex_data, node, builder);
-  ops_draw (builder, vertex_data);
+  load_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
@@ -2209,7 +2195,6 @@ render_cross_fade_node (GskGLRenderer   *self,
                         GskRenderNode   *node,
                         RenderOpBuilder *builder)
 {
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   GskRenderNode *start_node = gsk_cross_fade_node_get_start_child (node);
   GskRenderNode *end_node = gsk_cross_fade_node_get_end_child (node);
   float progress = gsk_cross_fade_node_get_progress (node);
@@ -2218,8 +2203,6 @@ render_cross_fade_node (GskGLRenderer   *self,
   gboolean is_offscreen1, is_offscreen2;
   OpCrossFade *op;
 
-  load_offscreen_vertex_data (vertex_data, node, builder);
-
   /* TODO: We create 2 textures here as big as the cross-fade node, but both the
    * start and the end node might be a lot smaller than that. */
 
@@ -2245,7 +2228,7 @@ render_cross_fade_node (GskGLRenderer   *self,
 
   ops_set_texture (builder, start_region.texture_id);
 
-  ops_draw (builder, vertex_data);
+  load_offscreen_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
@@ -2253,7 +2236,6 @@ render_blend_node (GskGLRenderer   *self,
                    GskRenderNode   *node,
                    RenderOpBuilder *builder)
 {
-  GskQuadVertex vertex_data[GL_N_VERTICES];
   GskRenderNode *top_child = gsk_blend_node_get_top_child (node);
   GskRenderNode *bottom_child = gsk_blend_node_get_bottom_child (node);
   TextureRegion top_region;
@@ -2261,8 +2243,6 @@ render_blend_node (GskGLRenderer   *self,
   gboolean is_offscreen1, is_offscreen2;
   OpBlend *op;
 
-  load_offscreen_vertex_data (vertex_data, node, builder);
-
   /* TODO: We create 2 textures here as big as the blend node, but both the
    * start and the end node might be a lot smaller than that. */
   if (!add_offscreen_ops (self, builder,
@@ -2286,7 +2266,7 @@ render_blend_node (GskGLRenderer   *self,
   op->source2 = top_region.texture_id;
   op->mode = gsk_blend_node_get_blend_mode (node);
 
-  ops_draw (builder, vertex_data);
+  load_offscreen_vertex_data (ops_draw (builder, NULL), node, builder);
 }
 
 static inline void
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index efa092acf0..24e9eca847 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -698,7 +698,7 @@ ops_set_border_color (RenderOpBuilder *builder,
   current_program_state->border.color = *color;
 }
 
-void
+GskQuadVertex *
 ops_draw (RenderOpBuilder     *builder,
           const GskQuadVertex  vertex_data[GL_N_VERTICES])
 {
@@ -715,7 +715,14 @@ ops_draw (RenderOpBuilder     *builder,
       op->vao_size = GL_N_VERTICES;
     }
 
-  g_array_append_vals (builder->vertices, vertex_data, GL_N_VERTICES);
+  if (vertex_data)
+    {
+      g_array_append_vals (builder->vertices, vertex_data, GL_N_VERTICES);
+      return NULL; /* Better not use this on the caller side */
+    }
+
+  g_array_set_size (builder->vertices, builder->vertices->len + GL_N_VERTICES);
+  return &g_array_index (builder->vertices, GskQuadVertex, builder->vertices->len - GL_N_VERTICES);
 }
 
 /* The offset is only valid for the current modelview.
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index 38bc7e72a4..4cebd362fd 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -213,7 +213,7 @@ void              ops_set_border_width   (RenderOpBuilder         *builder,
 void              ops_set_border_color   (RenderOpBuilder         *builder,
                                           const GdkRGBA           *color);
 
-void              ops_draw               (RenderOpBuilder        *builder,
+GskQuadVertex *   ops_draw               (RenderOpBuilder        *builder,
                                           const GskQuadVertex     vertex_data[GL_N_VERTICES]);
 
 void              ops_offset             (RenderOpBuilder        *builder,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]