[gtk/ngl-vertex-attributes: 5/8] ngl: Set color as vertex attribute




commit 06d5c8e72dee3d63391fc05ebf081c6f63ed3ce6
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Mar 11 19:46:15 2021 -0500

    ngl: Set color as vertex attribute
    
    Instead of using uniforms for color used in multiple
    programs, pass it as vertex attributes. This will let
    us batch more draw calls, since we don't have to change
    uniforms so often. In particular, for syntax-highlighted
    text.

 gsk/ngl/gsknglcommandqueue.c                   |   6 +
 gsk/ngl/gskngldriver.c                         |   3 +-
 gsk/ngl/gskngldriverprivate.h                  |   8 +-
 gsk/ngl/gsknglprograms.defs                    |   8 +-
 gsk/ngl/gsknglrenderjob.c                      | 352 +++++++++++--------------
 gsk/ngl/gskngltypesprivate.h                   |   1 +
 gsk/ngl/resources/blend.glsl                   |   1 +
 gsk/ngl/resources/blit.glsl                    |   1 +
 gsk/ngl/resources/border.glsl                  |   3 +-
 gsk/ngl/resources/color.glsl                   |   4 +-
 gsk/ngl/resources/color_matrix.glsl            |   1 +
 gsk/ngl/resources/coloring.glsl                |   4 +-
 gsk/ngl/resources/conic_gradient.glsl          |   3 +-
 gsk/ngl/resources/cross_fade.glsl              |   1 +
 gsk/ngl/resources/inset_shadow.glsl            |   3 +-
 gsk/ngl/resources/outset_shadow.glsl           |   3 +-
 gsk/ngl/resources/preamble.fs.glsl             |   3 +-
 gsk/ngl/resources/preamble.vs.glsl             |   2 +
 gsk/ngl/resources/repeat.glsl                  |   2 +-
 gsk/ngl/resources/unblurred_outset_shadow.glsl |   3 +-
 20 files changed, 179 insertions(+), 233 deletions(-)
---
diff --git a/gsk/ngl/gsknglcommandqueue.c b/gsk/ngl/gsknglcommandqueue.c
index 9426c199b1..7d5a8b30be 100644
--- a/gsk/ngl/gsknglcommandqueue.c
+++ b/gsk/ngl/gsknglcommandqueue.c
@@ -1096,6 +1096,12 @@ gsk_ngl_command_queue_execute (GskNglCommandQueue   *self,
                          sizeof (GskNglDrawVertex),
                          (void *) G_STRUCT_OFFSET (GskNglDrawVertex, uv));
 
+  /* 2 = color location */
+  glEnableVertexAttribArray (2);
+  glVertexAttribPointer (2, 4, GL_FLOAT, GL_FALSE,
+                         sizeof (GskNglDrawVertex),
+                         (void *) G_STRUCT_OFFSET (GskNglDrawVertex, color));
+
   /* Setup initial scissor clip */
   if (scissor != NULL)
     {
diff --git a/gsk/ngl/gskngldriver.c b/gsk/ngl/gskngldriver.c
index 1b00b135ed..3d910e5d51 100644
--- a/gsk/ngl/gskngldriver.c
+++ b/gsk/ngl/gskngldriver.c
@@ -347,6 +347,7 @@ gsk_ngl_driver_load_programs (GskNglDriver  *self,
   /* Setup attributes that are provided via VBO */
   gsk_ngl_compiler_bind_attribute (compiler, "aPosition", 0);
   gsk_ngl_compiler_bind_attribute (compiler, "aUv", 1);
+  gsk_ngl_compiler_bind_attribute (compiler, "aColor", 2);
 
   /* Use XMacros to register all of our programs and their uniforms */
 #define GSK_NGL_NO_UNIFORMS
@@ -376,7 +377,6 @@ gsk_ngl_driver_load_programs (GskNglDriver  *self,
     uniforms                                                                                     \
                                                                                                  \
     gsk_ngl_program_uniforms_added (program, have_source);                                       \
-                                                                                                 \
     if (have_alpha)                                                                              \
       gsk_ngl_program_set_uniform1f (program, UNIFORM_SHARED_ALPHA, 0, 1.0f);                    \
                                                                                                  \
@@ -1045,6 +1045,7 @@ gsk_ngl_driver_lookup_shader (GskNglDriver  *self,
       /* Setup attributes that are provided via VBO */
       gsk_ngl_compiler_bind_attribute (compiler, "aPosition", 0);
       gsk_ngl_compiler_bind_attribute (compiler, "aUv", 1);
+      gsk_ngl_compiler_bind_attribute (compiler, "aColor", 2);
 
       if ((program = gsk_ngl_compiler_compile (compiler, NULL, "", error)))
         {
diff --git a/gsk/ngl/gskngldriverprivate.h b/gsk/ngl/gskngldriverprivate.h
index 28199ec016..c50e112e86 100644
--- a/gsk/ngl/gskngldriverprivate.h
+++ b/gsk/ngl/gskngldriverprivate.h
@@ -58,13 +58,17 @@ typedef struct {
   graphene_rect_t parent_rect; /* Valid when pointer_is_child */
 } GskTextureKey;
 
-#define GSL_GK_NO_UNIFORMS UNIFORM_INVALID_##__COUNTER__
+#define GSK_NGL_NO_UNIFORMS CONCAT_EXPANDED(UNIFORM_INVALID_,__COUNTER__)
+#define CONCAT_EXPANDED(a,b) CONCAT_EXPANDED2(a,b)
+#define CONCAT_EXPANDED2(a,b) a##b
 #define GSK_NGL_ADD_UNIFORM(pos, KEY, name) UNIFORM_##KEY = UNIFORM_SHARED_LAST + pos,
 #define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) enum { uniforms };
 # include "gsknglprograms.defs"
 #undef GSK_NGL_DEFINE_PROGRAM
 #undef GSK_NGL_ADD_UNIFORM
-#undef GSL_GK_NO_UNIFORMS
+#undef GSK_NGL_NO_UNIFORMS
+#undef CONCAT_EXPANDED
+#undef CONCAT_EXPANDED2
 
 #define GSK_TYPE_NGL_DRIVER (gsk_ngl_driver_get_type())
 
diff --git a/gsk/ngl/gsknglprograms.defs b/gsk/ngl/gsknglprograms.defs
index 85c9366ad6..e20cca2fa9 100644
--- a/gsk/ngl/gsknglprograms.defs
+++ b/gsk/ngl/gsknglprograms.defs
@@ -15,17 +15,16 @@ GSK_NGL_DEFINE_PROGRAM (blur,
 
 GSK_NGL_DEFINE_PROGRAM (border,
                         "/org/gtk/libgsk/ngl/border.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, BORDER_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, BORDER_WIDTHS, u_widths)
                         GSK_NGL_ADD_UNIFORM (3, BORDER_OUTLINE_RECT, u_outline_rect))
 
 GSK_NGL_DEFINE_PROGRAM (color,
                         "/org/gtk/libgsk/ngl/color.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, COLOR_COLOR, u_color))
+                        GSK_NGL_NO_UNIFORMS)
 
 GSK_NGL_DEFINE_PROGRAM (coloring,
                         "/org/gtk/libgsk/ngl/coloring.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, COLORING_COLOR, u_color))
+                        GSK_NGL_NO_UNIFORMS)
 
 GSK_NGL_DEFINE_PROGRAM (color_matrix,
                         "/org/gtk/libgsk/ngl/color_matrix.glsl",
@@ -45,7 +44,6 @@ GSK_NGL_DEFINE_PROGRAM (cross_fade,
 
 GSK_NGL_DEFINE_PROGRAM (inset_shadow,
                         "/org/gtk/libgsk/ngl/inset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, INSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, INSET_SHADOW_SPREAD, u_spread)
                         GSK_NGL_ADD_UNIFORM (3, INSET_SHADOW_OFFSET, u_offset)
                         GSK_NGL_ADD_UNIFORM (4, INSET_SHADOW_OUTLINE_RECT, u_outline_rect))
@@ -59,7 +57,6 @@ GSK_NGL_DEFINE_PROGRAM (linear_gradient,
 
 GSK_NGL_DEFINE_PROGRAM (outset_shadow,
                         "/org/gtk/libgsk/ngl/outset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, OUTSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, OUTSET_SHADOW_OUTLINE_RECT, u_outline_rect))
 
 GSK_NGL_DEFINE_PROGRAM (radial_gradient,
@@ -77,7 +74,6 @@ GSK_NGL_DEFINE_PROGRAM (repeat,
 
 GSK_NGL_DEFINE_PROGRAM (unblurred_outset_shadow,
                         "/org/gtk/libgsk/ngl/unblurred_outset_shadow.glsl",
-                        GSK_NGL_ADD_UNIFORM (1, UNBLURRED_OUTSET_SHADOW_COLOR, u_color)
                         GSK_NGL_ADD_UNIFORM (2, UNBLURRED_OUTSET_SHADOW_SPREAD, u_spread)
                         GSK_NGL_ADD_UNIFORM (3, UNBLURRED_OUTSET_SHADOW_OFFSET, u_offset)
                         GSK_NGL_ADD_UNIFORM (4, UNBLURRED_OUTSET_SHADOW_OUTLINE_RECT, u_outline_rect))
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 93ca180133..14e3b3e42b 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -142,6 +142,9 @@ struct _GskNglRenderJob
   /* Our current alpha state as we process nodes */
   float alpha;
 
+  /* Our current color state as we process nodes */
+  GdkRGBA color;
+
   /* Offset (delta x,y) as we process nodes. Occasionally this is merged into
    * a transform that is referenced from child transform nodes.
    */
@@ -395,6 +398,13 @@ gsk_ngl_render_job_set_alpha (GskNglRenderJob *job,
   return alpha;
 }
 
+static inline void
+gsk_ngl_render_job_set_color (GskNglRenderJob *job,
+                              const GdkRGBA   *color)
+{
+  job->color = *color;
+}
+
 static void
 extract_matrix_metadata (GskNglRenderModelview *modelview)
 {
@@ -874,49 +884,91 @@ gsk_ngl_render_job_update_clip (GskNglRenderJob     *job,
   return TRUE;
 }
 
-/* load_vertex_data_with_region */
-static inline void
-gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *job,
-                                                 const graphene_rect_t       *bounds,
-                                                 const GskNglRenderOffscreen *offscreen)
+/* fill_vertex_data */
+static void
+gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
+                                float            min_x,
+                                float            min_y,
+                                float            max_x,
+                                float            max_y,
+                                float            min_u,
+                                float            min_v,
+                                float            max_u,
+                                float            max_v)
 {
   GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-  float min_x = job->offset_x + bounds->origin.x;
-  float min_y = job->offset_y + bounds->origin.y;
-  float max_x = min_x + bounds->size.width;
-  float max_y = min_y + bounds->size.height;
-  float y1 = offscreen->was_offscreen ? offscreen->area.y2 : offscreen->area.y;
-  float y2 = offscreen->was_offscreen ? offscreen->area.y : offscreen->area.y2;
 
   vertices[0].position[0] = min_x;
   vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = offscreen->area.x;
-  vertices[0].uv[1] = y1;
+  vertices[0].uv[0] = min_u;
+  vertices[0].uv[1] = min_v;
+  vertices[0].color[0] = job->color.red;
+  vertices[0].color[1] = job->color.green;
+  vertices[0].color[2] = job->color.blue;
+  vertices[0].color[3] = job->color.alpha;
 
   vertices[1].position[0] = min_x;
   vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = offscreen->area.x;
-  vertices[1].uv[1] = y2;
+  vertices[1].uv[0] = min_u;
+  vertices[1].uv[1] = max_v;
+  vertices[1].color[0] = job->color.red;
+  vertices[1].color[1] = job->color.green;
+  vertices[1].color[2] = job->color.blue;
+  vertices[1].color[3] = job->color.alpha;
 
   vertices[2].position[0] = max_x;
   vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = offscreen->area.x2;
-  vertices[2].uv[1] = y1;
+  vertices[2].uv[0] = max_u;
+  vertices[2].uv[1] = min_v;
+  vertices[2].color[0] = job->color.red;
+  vertices[2].color[1] = job->color.green;
+  vertices[2].color[2] = job->color.blue;
+  vertices[2].color[3] = job->color.alpha;
 
   vertices[3].position[0] = max_x;
   vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = offscreen->area.x2;
-  vertices[3].uv[1] = y2;
+  vertices[3].uv[0] = max_u;
+  vertices[3].uv[1] = max_v;
+  vertices[3].color[0] = job->color.red;
+  vertices[3].color[1] = job->color.green;
+  vertices[3].color[2] = job->color.blue;
+  vertices[3].color[3] = job->color.alpha;
 
   vertices[4].position[0] = min_x;
   vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = offscreen->area.x;
-  vertices[4].uv[1] = y2;
+  vertices[4].uv[0] = min_u;
+  vertices[4].uv[1] = max_v;
+  vertices[4].color[0] = job->color.red;
+  vertices[4].color[1] = job->color.green;
+  vertices[4].color[2] = job->color.blue;
+  vertices[4].color[3] = job->color.alpha;
 
   vertices[5].position[0] = max_x;
   vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = offscreen->area.x2;
-  vertices[5].uv[1] = y1;
+  vertices[5].uv[0] = max_u;
+  vertices[5].uv[1] = min_v;
+  vertices[5].color[0] = job->color.red;
+  vertices[5].color[1] = job->color.green;
+  vertices[5].color[2] = job->color.blue;
+  vertices[5].color[3] = job->color.alpha;
+}
+
+/* load_vertex_data_with_region */
+static inline void
+gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *job,
+                                                 const graphene_rect_t       *bounds,
+                                                 const GskNglRenderOffscreen *offscreen)
+{
+  float min_x = job->offset_x + bounds->origin.x;
+  float min_y = job->offset_y + bounds->origin.y;
+  float max_x = min_x + bounds->size.width;
+  float max_y = min_y + bounds->size.height;
+  float y1 = offscreen->was_offscreen ? offscreen->area.y2 : offscreen->area.y;
+  float y2 = offscreen->was_offscreen ? offscreen->area.y : offscreen->area.y2;
+
+  gsk_ngl_render_job_draw_coords (job,
+                                  min_x, min_y, max_x, max_y,
+                                  offscreen->area.x, y1, offscreen->area.x2, y2);
 }
 
 /* load_float_vertex_data */
@@ -927,41 +979,12 @@ gsk_ngl_render_job_draw (GskNglRenderJob *job,
                          float            width,
                          float            height)
 {
-  GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
   float min_x = job->offset_x + x;
   float min_y = job->offset_y + y;
   float max_x = min_x + width;
   float max_y = min_y + height;
 
-  vertices[0].position[0] = min_x;
-  vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = 0;
-  vertices[0].uv[1] = 0;
-
-  vertices[1].position[0] = min_x;
-  vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = 0;
-  vertices[1].uv[1] = 1;
-
-  vertices[2].position[0] = max_x;
-  vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = 1;
-  vertices[2].uv[1] = 0;
-
-  vertices[3].position[0] = max_x;
-  vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = 1;
-  vertices[3].uv[1] = 1;
-
-  vertices[4].position[0] = min_x;
-  vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = 0;
-  vertices[4].uv[1] = 1;
-
-  vertices[5].position[0] = max_x;
-  vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = 1;
-  vertices[5].uv[1] = 0;
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 0, 1, 1);
 }
 
 /* load_vertex_data */
@@ -976,47 +999,6 @@ gsk_ngl_render_job_draw_rect (GskNglRenderJob       *job,
                            bounds->size.height);
 }
 
-/* fill_vertex_data */
-static void
-gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
-                                float            min_x,
-                                float            min_y,
-                                float            max_x,
-                                float            max_y)
-{
-  GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-
-  vertices[0].position[0] = min_x;
-  vertices[0].position[1] = min_y;
-  vertices[0].uv[0] = 0;
-  vertices[0].uv[1] = 1;
-
-  vertices[1].position[0] = min_x;
-  vertices[1].position[1] = max_y;
-  vertices[1].uv[0] = 0;
-  vertices[1].uv[1] = 0;
-
-  vertices[2].position[0] = max_x;
-  vertices[2].position[1] = min_y;
-  vertices[2].uv[0] = 1;
-  vertices[2].uv[1] = 1;
-
-  vertices[3].position[0] = max_x;
-  vertices[3].position[1] = max_y;
-  vertices[3].uv[0] = 1;
-  vertices[3].uv[1] = 0;
-
-  vertices[4].position[0] = min_x;
-  vertices[4].position[1] = max_y;
-  vertices[4].uv[0] = 0;
-  vertices[4].uv[1] = 0;
-
-  vertices[5].position[0] = max_x;
-  vertices[5].position[1] = min_y;
-  vertices[5].uv[0] = 1;
-  vertices[5].uv[1] = 1;
-}
-
 /* load_offscreen_vertex_data */
 static inline void
 gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob       *job,
@@ -1027,7 +1009,7 @@ gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob       *job,
   float max_x = min_x + bounds->size.width;
   float max_y = min_y + bounds->size.height;
 
-  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y);
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 1, 1, 0);
 }
 
 static inline void
@@ -1283,7 +1265,7 @@ blur_offscreen (GskNglRenderJob       *job,
   gsk_ngl_program_set_uniform2f (job->current_program,
                                  UNIFORM_BLUR_DIR, 0,
                                  1, 0);
-  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height);
+  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 
   /* Bind second pass framebuffer and clear it */
@@ -1307,7 +1289,7 @@ blur_offscreen (GskNglRenderJob       *job,
   gsk_ngl_program_set_uniform2f (job->current_program,
                                  UNIFORM_BLUR_DIR, 0,
                                  0, 1);
-  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height);
+  gsk_ngl_render_job_draw_coords (job, 0, 0, texture_to_blur_width, texture_to_blur_height, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 
   gsk_ngl_render_job_pop_modelview (job);
@@ -1381,9 +1363,7 @@ gsk_ngl_render_job_visit_color_node (GskNglRenderJob     *job,
                                      const GskRenderNode *node)
 {
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     gsk_color_node_get_color (node));
+  gsk_ngl_render_job_set_color (job, gsk_color_node_get_color (node));
   gsk_ngl_render_job_draw_rect (job, &node->bounds);
   gsk_ngl_render_job_end_draw (job);
 }
@@ -1694,9 +1674,7 @@ gsk_ngl_render_job_visit_rect_border_node (GskNglRenderJob     *job,
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
 
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     &colors[0]);
+  gsk_ngl_render_job_set_color (job, &colors[0]);
 
   gsk_ngl_render_job_draw_rect (job,
       &GRAPHENE_RECT_INIT (origin->x,
@@ -1737,12 +1715,10 @@ gsk_ngl_render_job_visit_uniform_border_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+  gsk_ngl_render_job_set_color (job, &colors[0]);
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                             &outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_INSET_SHADOW_COLOR, 0,
-                                     &colors[0]);
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_INSET_SHADOW_SPREAD, 0,
                                  widths[0]);
@@ -1758,7 +1734,7 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
                                       const GskRenderNode *node)
 {
   const GskRoundedRect *rounded_outline = gsk_border_node_get_outline (node);
-  const GdkRGBA *colors = gsk_border_node_get_colors (node);
+  const GdkRGBA *c = gsk_border_node_get_colors (node);
   const float *widths = gsk_border_node_get_widths (node);
   struct {
     float w;
@@ -1818,52 +1794,48 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
     const GskNglDrawVertex side_data[4][6] = {
       /* Top */
       {
-        { { min_x,              min_y              }, { 0, 1 }, }, /* Upper left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { min_x,              min_y              }, { 0, 1 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Upper left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Upper right */
 
-        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, }, /* Lower right */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 1, 0 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Lower right */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[0].red, c[0].green, c[0].blue, 
c[0].alpha } }, /* Upper right */
       },
       /* Right */
       {
-        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, }, /* Upper left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Upper left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Upper right */
 
-        { { max_x,              max_y              }, { 1, 0 }, }, /* Lower right */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, }, /* Lower left */
-        { { max_x,              min_y              }, { 1, 1 }, }, /* Upper right */
+        { { max_x,              max_y              }, { 1, 0 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Lower right */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Lower left */
+        { { max_x,              min_y              }, { 1, 1 }, { c[1].red, c[1].green, c[1].blue, 
c[1].alpha } }, /* Upper right */
       },
       /* Bottom */
       {
-        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, }, /* Upper left */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Upper left */
+        { { min_x,              max_y              }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Lower left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Upper right */
 
-        { { max_x,              max_y              }, { 1, 0 }, }, /* Lower right */
-        { { min_x            ,  max_y              }, { 0, 0 }, }, /* Lower left */
-        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, }, /* Upper right */
+        { { max_x,              max_y              }, { 1, 0 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Lower right */
+        { { min_x            ,  max_y              }, { 0, 0 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Lower left */
+        { { max_x - sizes[2].w, max_y - sizes[2].h }, { 1, 1 }, { c[2].red, c[2].green, c[2].blue, 
c[2].alpha } }, /* Upper right */
       },
       /* Left */
       {
-        { { min_x,              min_y              }, { 0, 1 }, }, /* Upper left */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x,              min_y              }, { 0, 1 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Upper left */
+        { { min_x,              max_y              }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Lower left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Upper right */
 
-        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, }, /* Lower right */
-        { { min_x,              max_y              }, { 0, 0 }, }, /* Lower left */
-        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, }, /* Upper right */
+        { { min_x + sizes[3].w, max_y - sizes[3].h }, { 1, 0 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Lower right */
+        { { min_x,              max_y              }, { 0, 0 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Lower left */
+        { { min_x + sizes[0].w, min_y + sizes[0].h }, { 1, 1 }, { c[3].red, c[3].green, c[3].blue, 
c[3].alpha } }, /* Upper right */
       }
     };
-    int indices[4] = { 0, 1, 2, 3 };
     GskRoundedRect outline;
     GskNglProgram *program;
 
-    /* We sort them by color */
-    sort_border_sides (colors, indices);
-
     /* Prepare outline */
     gsk_ngl_render_job_transform_rounded_rect (job, rounded_outline, &outline);
 
@@ -1881,16 +1853,12 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
       {
         GskNglDrawVertex *vertices;
 
-        if (widths[indices[i]] <= 0)
+        if (widths[i] <= 0)
           continue;
 
         gsk_ngl_render_job_begin_draw (job, program);
-        gsk_ngl_program_set_uniform4fv (job->current_program,
-                                        UNIFORM_BORDER_COLOR, 0,
-                                        1,
-                                        (const float *)&colors[indices[i]]);
         vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-        memcpy (vertices, side_data[indices[i]], sizeof (GskNglDrawVertex) * GSK_NGL_N_VERTICES);
+        memcpy (vertices, side_data[i], sizeof (GskNglDrawVertex) * GSK_NGL_N_VERTICES);
         gsk_ngl_render_job_end_draw (job);
       }
   }
@@ -2019,12 +1987,10 @@ gsk_ngl_render_job_visit_unblurred_inset_shadow_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+  gsk_ngl_render_job_set_color (job, gsk_inset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                             &transformed_outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_INSET_SHADOW_COLOR, 0,
-                                     gsk_inset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_INSET_SHADOW_SPREAD, 0,
                                  gsk_inset_shadow_node_get_spread (node));
@@ -2122,12 +2088,10 @@ gsk_ngl_render_job_visit_blurred_inset_shadow_node (GskNglRenderJob     *job,
 
       /* Actual inset shadow outline drawing */
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, inset_shadow));
+      gsk_ngl_render_job_set_color (job, gsk_inset_shadow_node_get_color (node));
       gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                                 UNIFORM_INSET_SHADOW_OUTLINE_RECT, 0,
                                                 &transformed_outline);
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_INSET_SHADOW_COLOR, 0,
-                                         gsk_inset_shadow_node_get_color (node));
       gsk_ngl_program_set_uniform1f (job->current_program,
                                      UNIFORM_INSET_SHADOW_SPREAD, 0,
                                      spread * MAX (scale_x, scale_y));
@@ -2231,12 +2195,10 @@ gsk_ngl_render_job_visit_unblurred_outset_shadow_node (GskNglRenderJob     *job,
   gsk_ngl_render_job_transform_rounded_rect (job, outline, &transformed_outline);
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, unblurred_outset_shadow));
+  gsk_ngl_render_job_set_color (job, gsk_outset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform_rounded_rect (job->current_program,
                                             UNIFORM_UNBLURRED_OUTSET_SHADOW_OUTLINE_RECT, 0,
                                             &transformed_outline);
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_UNBLURRED_OUTSET_SHADOW_COLOR, 0,
-                                     gsk_outset_shadow_node_get_color (node));
   gsk_ngl_program_set_uniform1f (job->current_program,
                                  UNIFORM_UNBLURRED_OUTSET_SHADOW_SPREAD, 0,
                                  spread);
@@ -2387,9 +2349,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
 
       /* Draw the outline using color program */
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_COLOR_COLOR, 0,
-                                         &white);
+      gsk_ngl_render_job_set_color (job, &white);
       gsk_ngl_render_job_draw (job, 0, 0, texture_width, texture_height);
       gsk_ngl_render_job_end_draw (job);
 
@@ -2433,9 +2393,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
       init_full_texture_region (&offscreen);
 
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_OUTSET_SHADOW_COLOR, 0,
-                                         color);
+      gsk_ngl_render_job_set_color (job, color);
       gsk_ngl_program_set_uniform_texture (job->current_program,
                                            UNIFORM_SHARED_SOURCE, 0,
                                            GL_TEXTURE_2D,
@@ -2456,9 +2414,7 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob     *job,
     }
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_OUTSET_SHADOW_COLOR, 0,
-                                     color);
+  gsk_ngl_render_job_set_color (job, color);
   gsk_ngl_program_set_uniform_texture (job->current_program,
                                        UNIFORM_SHARED_SOURCE, 0,
                                        GL_TEXTURE_2D,
@@ -2753,14 +2709,9 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
 
   /* If the font has color glyphs, we don't need to recolor anything */
   if (!force_color && gsk_text_node_has_color_glyphs (node))
-    {
-      program = CHOOSE_PROGRAM (job, blit);
-    }
+    program = CHOOSE_PROGRAM (job, blit);
   else
-    {
-      program = CHOOSE_PROGRAM (job, coloring);
-      gsk_ngl_program_set_uniform_color (program, UNIFORM_COLORING_COLOR, 0, color);
-    }
+    program = CHOOSE_PROGRAM (job, coloring);
 
   lookup.font = (PangoFont *)font;
   lookup.scale = (guint) (text_scale * 1024);
@@ -2835,31 +2786,55 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
       vertices[base+0].position[1] = glyph_y;
       vertices[base+0].uv[0] = tx;
       vertices[base+0].uv[1] = ty;
+      vertices[base+0].color[0] = color->red;
+      vertices[base+0].color[1] = color->green;
+      vertices[base+0].color[2] = color->blue;
+      vertices[base+0].color[3] = color->alpha;
 
       vertices[base+1].position[0] = glyph_x;
       vertices[base+1].position[1] = glyph_y2;
       vertices[base+1].uv[0] = tx;
       vertices[base+1].uv[1] = ty2;
+      vertices[base+1].color[0] = color->red;
+      vertices[base+1].color[1] = color->green;
+      vertices[base+1].color[2] = color->blue;
+      vertices[base+1].color[3] = color->alpha;
 
       vertices[base+2].position[0] = glyph_x2;
       vertices[base+2].position[1] = glyph_y;
       vertices[base+2].uv[0] = tx2;
       vertices[base+2].uv[1] = ty;
+      vertices[base+2].color[0] = color->red;
+      vertices[base+2].color[1] = color->green;
+      vertices[base+2].color[2] = color->blue;
+      vertices[base+2].color[3] = color->alpha;
 
       vertices[base+3].position[0] = glyph_x2;
       vertices[base+3].position[1] = glyph_y2;
       vertices[base+3].uv[0] = tx2;
       vertices[base+3].uv[1] = ty2;
+      vertices[base+3].color[0] = color->red;
+      vertices[base+3].color[1] = color->green;
+      vertices[base+3].color[2] = color->blue;
+      vertices[base+3].color[3] = color->alpha;
 
       vertices[base+4].position[0] = glyph_x;
       vertices[base+4].position[1] = glyph_y2;
       vertices[base+4].uv[0] = tx;
       vertices[base+4].uv[1] = ty2;
+      vertices[base+4].color[0] = color->red;
+      vertices[base+4].color[1] = color->green;
+      vertices[base+4].color[2] = color->blue;
+      vertices[base+4].color[3] = color->alpha;
 
       vertices[base+5].position[0] = glyph_x2;
       vertices[base+5].position[1] = glyph_y;
       vertices[base+5].uv[0] = tx2;
       vertices[base+5].uv[1] = ty;
+      vertices[base+5].color[0] = color->red;
+      vertices[base+5].color[1] = color->green;
+      vertices[base+5].color[2] = color->blue;
+      vertices[base+5].color[3] = color->alpha;
 
       batch->draw.vbo_count += GSK_NGL_N_VERTICES;
       used++;
@@ -2952,14 +2927,12 @@ gsk_ngl_render_job_visit_shadow_node (GskNglRenderJob     *job,
 
       gsk_ngl_render_job_offset (job, dx, dy);
       gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, coloring));
+      gsk_ngl_render_job_set_color (job, &shadow->color);
       gsk_ngl_program_set_uniform_texture (job->current_program,
                                            UNIFORM_SHARED_SOURCE, 0,
                                            GL_TEXTURE_2D,
                                            GL_TEXTURE0,
                                            offscreen.texture_id);
-      gsk_ngl_program_set_uniform_color (job->current_program,
-                                         UNIFORM_COLORING_COLOR, 0,
-                                         &shadow->color);
       gsk_ngl_render_job_load_vertices_from_offscreen (job, &bounds, &offscreen);
       gsk_ngl_render_job_end_draw (job);
       gsk_ngl_render_job_offset (job, -dx, -dy);
@@ -3014,7 +2987,7 @@ gsk_ngl_render_job_visit_blur_node (GskNglRenderJob     *job,
                                        GL_TEXTURE_2D,
                                        GL_TEXTURE0,
                                        offscreen.texture_id);
-  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y);
+  gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y, 0, 1, 1, 0);
   gsk_ngl_render_job_end_draw (job);
 }
 
@@ -3123,9 +3096,7 @@ gsk_ngl_render_job_visit_gl_shader_node_fallback (GskNglRenderJob     *job,
   static const GdkRGBA pink = { 255 / 255., 105 / 255., 180 / 255., 1.0 };
 
   gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
-  gsk_ngl_program_set_uniform_color (job->current_program,
-                                     UNIFORM_COLOR_COLOR, 0,
-                                     &pink);
+  gsk_ngl_render_job_set_color (job, &pink);
   gsk_ngl_render_job_draw_rect (job, &node->bounds);
   gsk_ngl_render_job_end_draw (job);
 }
@@ -3317,7 +3288,6 @@ gsk_ngl_render_job_visit_texture_node (GskNglRenderJob     *job,
 
       for (guint i = 0; i < n_slices; i ++)
         {
-          GskNglDrawVertex *vertices;
           const GskNglTextureSlice *slice = &slices[i];
           float x1, x2, y1, y2;
 
@@ -3333,37 +3303,8 @@ gsk_ngl_render_job_visit_texture_node (GskNglRenderJob     *job,
                                                GL_TEXTURE_2D,
                                                GL_TEXTURE0,
                                                slice->texture_id);
-          vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
-
-          vertices[0].position[0] = x1;
-          vertices[0].position[1] = y1;
-          vertices[0].uv[0] = 0;
-          vertices[0].uv[1] = 0;
-
-          vertices[1].position[0] = x1;
-          vertices[1].position[1] = y2;
-          vertices[1].uv[0] = 0;
-          vertices[1].uv[1] = 1;
-
-          vertices[2].position[0] = x2;
-          vertices[2].position[1] = y1;
-          vertices[2].uv[0] = 1;
-          vertices[2].uv[1] = 0;
-
-          vertices[3].position[0] = x2;
-          vertices[3].position[1] = y2;
-          vertices[3].uv[0] = 1;
-          vertices[3].uv[1] = 1;
-
-          vertices[4].position[0] = x1;
-          vertices[4].position[1] = y2;
-          vertices[4].uv[0] = 0;
-          vertices[4].uv[1] = 1;
-
-          vertices[5].position[0] = x2;
-          vertices[5].position[1] = y1;
-          vertices[5].uv[0] = 1;
-          vertices[5].uv[1] = 0;
+
+          gsk_ngl_render_job_draw_coords (job, x1, y1, x2, y2, 0, 0, 1, 1);
         }
 
       gsk_ngl_render_job_end_draw (job);
@@ -3900,6 +3841,7 @@ gsk_ngl_render_job_new (GskNglDriver          *driver,
   job->viewport = *viewport;
 
   gsk_ngl_render_job_set_alpha (job, 1.0);
+  gsk_ngl_render_job_set_color (job, &(GdkRGBA){ 0.f, 0.f, 0.f, 0.f });
   gsk_ngl_render_job_set_projection_from_rect (job, viewport, NULL);
   gsk_ngl_render_job_set_modelview (job, gsk_transform_scale (NULL, scale_factor, scale_factor));
 
diff --git a/gsk/ngl/gskngltypesprivate.h b/gsk/ngl/gskngltypesprivate.h
index aba6f2f4c9..dc76fb41f4 100644
--- a/gsk/ngl/gskngltypesprivate.h
+++ b/gsk/ngl/gskngltypesprivate.h
@@ -55,6 +55,7 @@ struct _GskNglDrawVertex
 {
   float position[2];
   float uv[2];
+  float color[4];
 };
 
 G_END_DECLS
diff --git a/gsk/ngl/resources/blend.glsl b/gsk/ngl/resources/blend.glsl
index 22323402ac..51670f8b78 100644
--- a/gsk/ngl/resources/blend.glsl
+++ b/gsk/ngl/resources/blend.glsl
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
diff --git a/gsk/ngl/resources/blit.glsl b/gsk/ngl/resources/blit.glsl
index f01cd238ec..93416bc6a4 100644
--- a/gsk/ngl/resources/blit.glsl
+++ b/gsk/ngl/resources/blit.glsl
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
diff --git a/gsk/ngl/resources/border.glsl b/gsk/ngl/resources/border.glsl
index 677a0df7cd..997aeab3da 100644
--- a/gsk/ngl/resources/border.glsl
+++ b/gsk/ngl/resources/border.glsl
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform vec4 u_widths;
 uniform vec4[3] u_outline_rect;
 
@@ -10,7 +9,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outside = gsk_create_rect(u_outline_rect);
   GskRoundedRect inside = gsk_rounded_rect_shrink (outside, u_widths);
diff --git a/gsk/ngl/resources/color.glsl b/gsk/ngl/resources/color.glsl
index 636456ce0d..5d2370bdf5 100644
--- a/gsk/ngl/resources/color.glsl
+++ b/gsk/ngl/resources/color.glsl
@@ -1,12 +1,10 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
-
 _OUT_ vec4 final_color;
 
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
diff --git a/gsk/ngl/resources/color_matrix.glsl b/gsk/ngl/resources/color_matrix.glsl
index 79cb36434e..06e645b605 100644
--- a/gsk/ngl/resources/color_matrix.glsl
+++ b/gsk/ngl/resources/color_matrix.glsl
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
diff --git a/gsk/ngl/resources/coloring.glsl b/gsk/ngl/resources/coloring.glsl
index a675493030..b6af0c1766 100644
--- a/gsk/ngl/resources/coloring.glsl
+++ b/gsk/ngl/resources/coloring.glsl
@@ -1,6 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
-
 _OUT_ vec4 final_color;
 
 void main() {
@@ -8,7 +6,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 }
 
 // FRAGMENT_SHADER:
diff --git a/gsk/ngl/resources/conic_gradient.glsl b/gsk/ngl/resources/conic_gradient.glsl
index 630a42c5e6..48a1cf7149 100644
--- a/gsk/ngl/resources/conic_gradient.glsl
+++ b/gsk/ngl/resources/conic_gradient.glsl
@@ -10,8 +10,7 @@ void main() {
   vec2 mv1 = u_modelview[1].xy;
   vec2 offset = aPosition - u_geometry.xy;
 
-  coord = vec2(dot(mv0, offset),
-               dot(mv1, offset));
+  coord = vec2(dot(mv0, offset), dot(mv1, offset));
 }
 
 // FRAGMENT_SHADER:
diff --git a/gsk/ngl/resources/cross_fade.glsl b/gsk/ngl/resources/cross_fade.glsl
index f824430f9d..dddc44fdd0 100644
--- a/gsk/ngl/resources/cross_fade.glsl
+++ b/gsk/ngl/resources/cross_fade.glsl
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
diff --git a/gsk/ngl/resources/inset_shadow.glsl b/gsk/ngl/resources/inset_shadow.glsl
index 9a21cdef09..aae2f2ebef 100644
--- a/gsk/ngl/resources/inset_shadow.glsl
+++ b/gsk/ngl/resources/inset_shadow.glsl
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform float u_spread;
 uniform vec2 u_offset;
 uniform vec4[3] u_outline_rect;
@@ -11,7 +10,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outside = gsk_create_rect(u_outline_rect);
   GskRoundedRect inside = gsk_rounded_rect_shrink(outside, vec4(u_spread));
diff --git a/gsk/ngl/resources/outset_shadow.glsl b/gsk/ngl/resources/outset_shadow.glsl
index 373c650179..e8a802e494 100644
--- a/gsk/ngl/resources/outset_shadow.glsl
+++ b/gsk/ngl/resources/outset_shadow.glsl
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform vec4[3] u_outline_rect;
 
 _OUT_ vec4 final_color;
@@ -10,7 +9,7 @@ void main() {
 
   vUv = vec2(aUv.x, aUv.y);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect outline = gsk_create_rect(u_outline_rect);
   gsk_rounded_rect_transform(outline, u_modelview);
diff --git a/gsk/ngl/resources/preamble.fs.glsl b/gsk/ngl/resources/preamble.fs.glsl
index 3a2fe49240..e715d2526d 100644
--- a/gsk/ngl/resources/preamble.fs.glsl
+++ b/gsk/ngl/resources/preamble.fs.glsl
@@ -1,7 +1,7 @@
 uniform sampler2D u_source;
 uniform mat4 u_projection;
 uniform mat4 u_modelview;
-uniform float u_alpha;// = 1.0;
+uniform float u_alpha;
 uniform vec4 u_viewport;
 uniform vec4[3] u_clip_rect;
 
@@ -14,7 +14,6 @@ _OUT_ vec4 outputColor;
 _IN_ vec2 vUv;
 
 
-
 GskRoundedRect gsk_decode_rect(_GSK_ROUNDED_RECT_UNIFORM_ r)
 {
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
diff --git a/gsk/ngl/resources/preamble.vs.glsl b/gsk/ngl/resources/preamble.vs.glsl
index 89ee6f74e0..a549ff6ded 100644
--- a/gsk/ngl/resources/preamble.vs.glsl
+++ b/gsk/ngl/resources/preamble.vs.glsl
@@ -5,10 +5,12 @@ uniform float u_alpha;
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
 attribute vec2 aPosition;
 attribute vec2 aUv;
+attribute vec4 aColor;
 _OUT_ vec2 vUv;
 #else
 _IN_ vec2 aPosition;
 _IN_ vec2 aUv;
+_IN_ vec4 aColor;
 _OUT_ vec2 vUv;
 #endif
 
diff --git a/gsk/ngl/resources/repeat.glsl b/gsk/ngl/resources/repeat.glsl
index a9ebcc5e10..654446c70f 100644
--- a/gsk/ngl/resources/repeat.glsl
+++ b/gsk/ngl/resources/repeat.glsl
@@ -1,4 +1,5 @@
 // VERTEX_SHADER:
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
@@ -9,7 +10,6 @@ void main() {
 uniform vec4 u_child_bounds;
 uniform vec4 u_texture_rect;
 
-
 float wrap(float f, float wrap_for) {
   return mod(f, wrap_for);
 }
diff --git a/gsk/ngl/resources/unblurred_outset_shadow.glsl b/gsk/ngl/resources/unblurred_outset_shadow.glsl
index f110370412..56f0750e6d 100644
--- a/gsk/ngl/resources/unblurred_outset_shadow.glsl
+++ b/gsk/ngl/resources/unblurred_outset_shadow.glsl
@@ -1,5 +1,4 @@
 // VERTEX_SHADER:
-uniform vec4 u_color;
 uniform float u_spread;
 uniform vec2 u_offset;
 uniform vec4[3] u_outline_rect;
@@ -11,7 +10,7 @@ _OUT_ _GSK_ROUNDED_RECT_UNIFORM_ transformed_inside_outline;
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  final_color = gsk_premultiply(u_color) * u_alpha;
+  final_color = gsk_premultiply(aColor) * u_alpha;
 
   GskRoundedRect inside = gsk_create_rect(u_outline_rect);
   GskRoundedRect outside = gsk_rounded_rect_shrink(inside, vec4(- u_spread));


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