Drop OP_CHANGE_VAO
authorMatthias Clasen <mclasen@redhat.com>
Fri, 11 Oct 2019 17:59:58 +0000 (13:59 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 15 Oct 2019 23:44:26 +0000 (19:44 -0400)
Instead, we accumulate vertices in a separate
array, which simplifies various things and lets
us avoid the extra copying step for the vao.

gsk/gl/gskglrenderer.c
gsk/gl/gskglrenderops.c
gsk/gl/gskglrenderopsprivate.h
gsk/gl/opbuffer.c
gsk/gl/opbuffer.h

index 07d7938d19a3430270b0323489ec357a56d0bb32..999a57e467de6a194c5a794ce1022093a77fc6e3 100644 (file)
@@ -2976,9 +2976,7 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
                             gsize          vertex_data_size)
 {
   const Program *program = NULL;
-  gsize buffer_index = 0;
-  float *vertex_data = g_malloc (vertex_data_size);
-  OpBuffer *buffer;
+  float *vertex_data = (float*)self->op_builder.vertices->data;
   OpBufferIter iter;
   OpKind kind;
   gpointer ptr;
@@ -2993,20 +2991,6 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
   glGenBuffers (1, &buffer_id);
   glBindBuffer (GL_ARRAY_BUFFER, buffer_id);
 
-  // Fill buffer data
-  buffer = ops_get_buffer (&self->op_builder);
-  op_buffer_iter_init (&iter, buffer);
-  while ((ptr = op_buffer_iter_next (&iter, &kind)))
-    {
-      if (kind == OP_CHANGE_VAO)
-        {
-          const OpVao *vao = ptr;
-
-          memcpy (vertex_data + buffer_index, &vao->vertex_data, sizeof (GskQuadVertex) * GL_N_VERTICES);
-          buffer_index += sizeof (GskQuadVertex) * GL_N_VERTICES / sizeof (float);
-        }
-    }
-
   // Set buffer data
   glBufferData (GL_ARRAY_BUFFER, vertex_data_size, vertex_data, GL_STATIC_DRAW);
 
@@ -3026,7 +3010,7 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
   op_buffer_iter_init (&iter, ops_get_buffer (&self->op_builder));
   while ((ptr = op_buffer_iter_next (&iter, &kind)))
     {
-      if (kind == OP_NONE || kind == OP_CHANGE_VAO)
+      if (kind == OP_NONE)
         continue;
 
       if (program == NULL &&
@@ -3167,7 +3151,6 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
           gdk_gl_context_pop_debug_group (self->gl_context);
           break;
 
-        case OP_CHANGE_VAO:
         case OP_NONE:
         case OP_LAST:
         default:
@@ -3177,9 +3160,6 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
       OP_PRINT ("\n");
     }
 
-  /* Done drawing, destroy the buffer again.
-   * TODO: Can we reuse the memory, though? */
-  g_free (vertex_data);
   glDeleteVertexArrays (1, &vao_id);
   glDeleteBuffers (1, &buffer_id);
 }
index 663403aa2b466240f9823c98080c2f6845f8a09c..724aacfa4244e0b099bba1d65746ad0cf6f9b57d 100644 (file)
@@ -183,6 +183,7 @@ ops_init (RenderOpBuilder *builder)
   builder->current_opacity = 1.0f;
 
   op_buffer_init (&builder->render_ops);
+  builder->vertices = g_array_new (FALSE, TRUE, sizeof (GskQuadVertex));
 
   for (i = 0; i < GL_N_PROGRAMS; i ++)
     {
@@ -200,6 +201,7 @@ ops_free (RenderOpBuilder *builder)
       gsk_transform_unref (builder->program_state[i].modelview);
     }
 
+  g_array_unref (builder->vertices);
   op_buffer_destroy (&builder->render_ops);
 }
 
@@ -681,35 +683,21 @@ ops_draw (RenderOpBuilder     *builder,
           const GskQuadVertex  vertex_data[GL_N_VERTICES])
 {
   OpDraw *op;
-  OpVao *vao;
 
   if ((op = op_buffer_peek_tail_checked (&builder->render_ops, OP_DRAW)))
     {
-      gsize old_vao_offset = op->vao_offset;
-      gsize old_vao_size = op->vao_size;
-
-      op_buffer_pop_tail (&builder->render_ops);
-
-      vao = op_buffer_add (&builder->render_ops, OP_CHANGE_VAO);
-      memcpy (vao->vertex_data, vertex_data, sizeof vao->vertex_data);
-
-      op = op_buffer_add (&builder->render_ops, OP_DRAW);
-      op->vao_offset = old_vao_offset;
-      op->vao_size = old_vao_size + GL_N_VERTICES;
+      op->vao_size += GL_N_VERTICES;
     }
   else
     {
       gsize offset = builder->buffer_size / sizeof (GskQuadVertex);
 
-      vao = op_buffer_add (&builder->render_ops, OP_CHANGE_VAO);
-      memcpy (vao->vertex_data, vertex_data, sizeof vao->vertex_data);
-
       op = op_buffer_add (&builder->render_ops, OP_DRAW);
       op->vao_offset = offset;
       op->vao_size = GL_N_VERTICES;
     }
 
-  /* We added new vertex data in both cases so increase the buffer size */
+  g_array_append_vals (builder->vertices, vertex_data, GL_N_VERTICES);
   builder->buffer_size += sizeof (GskQuadVertex) * GL_N_VERTICES;
 }
 
@@ -736,6 +724,7 @@ void
 ops_reset (RenderOpBuilder *builder)
 {
   op_buffer_clear (&builder->render_ops);
+  g_array_set_size (builder->vertices, 0);
 }
 
 OpBuffer *
index 85765ad44f3e07946f1f09be136b5e7d87843674..f01097b65f64cbc7c601ee766a2ed28a88e58067 100644 (file)
@@ -156,6 +156,7 @@ typedef struct
   gsize buffer_size;
 
   OpBuffer render_ops;
+  GArray *vertices;
 
   GskGLRenderer *renderer;
 
index 2d3b16ffb62d3a201f77b45ffc705dfee724c857..b85127b5dd5cbbbe6150c7b3797e9648f9cc41e5 100644 (file)
@@ -13,7 +13,7 @@ static guint op_sizes[OP_LAST] = {
   sizeof (OpClip),
   sizeof (OpViewport),
   sizeof (OpTexture),
-  sizeof (OpVao),
+  sizeof (OpRepeat),
   sizeof (OpLinearGradient),
   sizeof (OpColorMatrix),
   sizeof (OpBlur),
@@ -30,7 +30,6 @@ static guint op_sizes[OP_LAST] = {
   sizeof (OpDebugGroup),
   0,
   sizeof (OpBlend),
-  sizeof (OpRepeat),
 };
 
 void
index d777e2ae41f9fd7cc9fa5c8ddeada935f329aac1..51242916288f5485f3a72e4523a1d3b36de067ab 100644 (file)
@@ -21,7 +21,7 @@ typedef enum
   OP_CHANGE_CLIP                       =  7,
   OP_CHANGE_VIEWPORT                   =  8,
   OP_CHANGE_SOURCE_TEXTURE             =  9,
-  OP_CHANGE_VAO                        = 10,
+  OP_CHANGE_REPEAT                     = 10,
   OP_CHANGE_LINEAR_GRADIENT            = 11,
   OP_CHANGE_COLOR_MATRIX               = 12,
   OP_CHANGE_BLUR                       = 13,
@@ -38,7 +38,6 @@ typedef enum
   OP_PUSH_DEBUG_GROUP                  = 24,
   OP_POP_DEBUG_GROUP                   = 25,
   OP_CHANGE_BLEND                      = 26,
-  OP_CHANGE_REPEAT                     = 27,
   OP_LAST
 } OpKind;
 
@@ -107,11 +106,6 @@ typedef struct
   gsize vao_size;
 } OpDraw;
 
-typedef struct
-{
-  GskQuadVertex vertex_data[6];
-} OpVao;
-
 typedef struct
 {
   float color_offsets[8];