gl renderer: Fix program uniform updating code
authorTimm Bäder <mail@baedert.org>
Sat, 14 Dec 2019 14:43:12 +0000 (15:43 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 7 Jan 2020 16:27:15 +0000 (17:27 +0100)
This breaks the initial uniform value, but we will fix that in a later
commit in a different way.

gsk/gl/gskglrenderops.c

index 5ab089493f13bcd762bb777e062136213101d26b..da725b8bbf9362c5d9a561c9f8ad94d7af62f453 100644 (file)
@@ -8,6 +8,29 @@ rect_equal (const graphene_rect_t *a,
   return memcmp (a, b, sizeof (graphene_rect_t)) == 0;
 }
 
+static inline gboolean
+rounded_rect_equal (const GskRoundedRect *r1,
+                    const GskRoundedRect *r2)
+{
+  int i;
+
+  if (!r1)
+    return FALSE;
+
+  if (r1->bounds.origin.x != r2->bounds.origin.x ||
+      r1->bounds.origin.y != r2->bounds.origin.y ||
+      r1->bounds.size.width != r2->bounds.size.width ||
+      r1->bounds.size.height != r2->bounds.size.height)
+    return FALSE;
+
+  for (i = 0; i < 4; i ++)
+    if (r1->corner[i].width != r2->corner[i].width ||
+        r1->corner[i].height != r2->corner[i].height)
+      return FALSE;
+
+  return TRUE;
+}
+
 static inline gboolean
 rounded_rect_corners_equal (const GskRoundedRect *r1,
                             const GskRoundedRect *r2)
@@ -212,11 +235,6 @@ void
 ops_set_program (RenderOpBuilder *builder,
                  const Program   *program)
 {
-  /* The tricky part about this is that we want to initialize all uniforms of a program
-   * to the current value from the builder, but only once. */
-  static const GskRoundedRect empty_clip;
-  static const graphene_matrix_t empty_matrix;
-  static const graphene_rect_t empty_rect;
   OpProgram *op;
   ProgramState *program_state;
 
@@ -230,9 +248,7 @@ ops_set_program (RenderOpBuilder *builder,
 
   program_state = &builder->program_state[program->index];
 
-  /* If the projection is not yet set for this program, we use the current one. */
-  if (memcmp (&empty_matrix, &program_state->projection, sizeof (graphene_matrix_t)) == 0 ||
-      memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0)
+  if (memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0)
     {
       OpMatrix *opm;
 
@@ -252,8 +268,7 @@ ops_set_program (RenderOpBuilder *builder,
       program_state->modelview = gsk_transform_ref (builder->current_modelview);
     }
 
-  if (rect_equal (&empty_rect, &program_state->viewport) ||
-      !rect_equal (&builder->current_viewport, &program_state->viewport))
+  if (!rect_equal (&builder->current_viewport, &program_state->viewport))
     {
       OpViewport *opv;
 
@@ -262,8 +277,7 @@ ops_set_program (RenderOpBuilder *builder,
       program_state->viewport = builder->current_viewport;
     }
 
-  if (memcmp (&empty_clip, &program_state->clip, sizeof (GskRoundedRect)) == 0 ||
-      memcmp (&builder->current_clip, &program_state->clip, sizeof (GskRoundedRect)) != 0)
+  if (!rounded_rect_equal (builder->current_clip, &program_state->clip))
     {
       OpClip *opc;