[gtk] gl renderer: Rewort passing rounded rects to shaders



commit 49845795d90ac61cb50d4a375ea291149d51fdf4
Author: Timm Bäder <mail baedert org>
Date:   Sat Dec 14 13:53:59 2019 +0100

      gl renderer: Rewort passing rounded rects to shaders

 gsk/gl/gskglrenderer.c                             | 142 +++++++--------------
 gsk/gl/gskglrenderopsprivate.h                     |  25 ++--
 gsk/gl/gskshaderbuilder.c                          |   2 +
 gsk/gl/opbuffer.h                                  |   4 +-
 gsk/resources/glsl/border.fs.glsl                  |  16 +--
 gsk/resources/glsl/gl3_common.fs.glsl              |  78 ++++++-----
 gsk/resources/glsl/inset_shadow.fs.glsl            |  12 +-
 gsk/resources/glsl/outset_shadow.fs.glsl           |   8 +-
 gsk/resources/glsl/unblurred_outset_shadow.fs.glsl |  12 +-
 9 files changed, 110 insertions(+), 189 deletions(-)
---
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 0799e1af15..979847cbaf 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -53,12 +53,30 @@
                 g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## _location, 
, -1); \
               }G_STMT_END
 
+#define INIT_PROGRAM_UNIFORM_RECT_LOCATION(program_name, uniform_basename) \
+              G_STMT_START{\
+                self->program_name ## _program.program_name.uniform_basename ## _bounds_location = \
+                              glGetUniformLocation(self->program_name ## _program.id, "u_" #uniform_basename 
".bounds");\
+                g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## 
_bounds_location, >, -1); \
+                self->program_name ## _program.program_name.uniform_basename ## _corners_location = \
+                              glGetUniformLocation(self->program_name ## _program.id, "u_" #uniform_basename 
".corners");\
+                g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## 
_corners_location, >, -1); \
+              }G_STMT_END
+
 #define INIT_COMMON_UNIFORM_LOCATION(program_ptr, uniform_basename) \
               G_STMT_START{\
                 program_ptr->uniform_basename ## _location =  \
                               glGetUniformLocation(program_ptr->id, "u_" #uniform_basename);\
               }G_STMT_END
 
+#define INIT_COMMON_UNIFORM_RECT_LOCATION(program_ptr, uniform_basename) \
+              G_STMT_START{\
+                program_ptr->uniform_basename ## _bounds_location =  \
+                              glGetUniformLocation(program_ptr->id, "u_" #uniform_basename ".bounds");\
+                program_ptr->uniform_basename ## _corners_location =  \
+                              glGetUniformLocation(program_ptr->id, "u_" #uniform_basename ".corners");\
+              }G_STMT_END
+
 typedef enum
 {
   FORCE_OFFSCREEN  = 1 << 0,
@@ -481,30 +499,24 @@ add_rect_outline_ops (GskGLRenderer         *self,
                                      rect->size.width, 1));
 }
 
-static inline void
-rounded_rect_to_floats (GskGLRenderer        *self,
-                        RenderOpBuilder      *builder,
-                        const GskRoundedRect *rect,
-                        float                *outline,
-                        float                *corner_widths,
-                        float                *corner_heights)
+static inline GskRoundedRect
+transform_rect (GskGLRenderer        *self,
+                RenderOpBuilder      *builder,
+                const GskRoundedRect *rect)
 {
   const float scale = ops_get_scale (builder);
+  GskRoundedRect r;
   int i;
-  graphene_rect_t transformed_bounds;
-
-  ops_transform_bounds_modelview (builder, &rect->bounds, &transformed_bounds);
 
-  outline[0] = transformed_bounds.origin.x;
-  outline[1] = transformed_bounds.origin.y;
-  outline[2] = transformed_bounds.size.width;
-  outline[3] = transformed_bounds.size.height;
+  ops_transform_bounds_modelview (builder, &rect->bounds, &r.bounds);
 
   for (i = 0; i < 4; i ++)
     {
-      corner_widths[i] = rect->corner[i].width * scale;
-      corner_heights[i] = rect->corner[i].height * scale;
+      r.corner[i].width = rect->corner[i].width * scale;
+      r.corner[i].height = rect->corner[i].height * scale;
     }
+
+  return r;
 }
 
 static inline void
@@ -1558,11 +1570,7 @@ render_unblurred_inset_shadow_node (GskGLRenderer   *self,
   ops_set_program (builder, &self->inset_shadow_program);
   op = ops_begin (builder, OP_CHANGE_INSET_SHADOW);
   op->color = gsk_inset_shadow_node_peek_color (node);
-  rounded_rect_to_floats (self, builder,
-                          gsk_inset_shadow_node_peek_outline (node),
-                          op->outline,
-                          op->corner_widths,
-                          op->corner_heights);
+  op->outline = transform_rect (self, builder, gsk_inset_shadow_node_peek_outline (node));
   op->spread = spread * scale;
   op->offset[0] = dx * scale;
   op->offset[1] = -dy * scale;
@@ -1651,11 +1659,7 @@ render_inset_shadow_node (GskGLRenderer   *self,
       ops_set_program (builder, &self->inset_shadow_program);
       op = ops_begin (builder, OP_CHANGE_INSET_SHADOW);
       op->color = gsk_inset_shadow_node_peek_color (node);
-      rounded_rect_to_floats (self, builder,
-                              &outline_to_blur,
-                              op->outline,
-                              op->corner_widths,
-                              op->corner_heights);
+      op->outline = transform_rect (self, builder, &outline_to_blur);
       op->spread = spread * scale;
       op->offset[0] = dx * scale;
       op->offset[1] = -dy * scale;
@@ -1748,13 +1752,7 @@ render_unblurred_outset_shadow_node (GskGLRenderer   *self,
   ops_set_program (builder, &self->unblurred_outset_shadow_program);
   op = ops_begin (builder, OP_CHANGE_UNBLURRED_OUTSET_SHADOW);
   op->color = gsk_outset_shadow_node_peek_color (node);
-
-  rounded_rect_to_floats (self, builder,
-                          outline,
-                          op->outline,
-                          op->corner_widths,
-                          op->corner_heights);
-
+  op->outline = transform_rect (self, builder, outline);
   op->spread = spread * scale;
   op->offset[0] = dx * scale;
   op->offset[1] = - dy * scale;
@@ -1884,11 +1882,7 @@ render_outset_shadow_node (GskGLRenderer   *self,
   ops_set_texture (builder, blurred_texture_id);
 
   shadow = ops_begin (builder, OP_CHANGE_OUTSET_SHADOW);
-  rounded_rect_to_floats (self, builder,
-                          outline,
-                          shadow->outline,
-                          shadow->corner_widths,
-                          shadow->corner_heights);
+  shadow->outline = transform_rect (self, builder, outline);
 
   {
     const float min_x = builder->dx + outline->bounds.origin.x - spread - (blur_extra / 2.0) + dx;
@@ -2538,27 +2532,15 @@ apply_clip_op (const Program *program,
             op->clip.corner[1].height,
             op->clip.corner[2].height,
             op->clip.corner[3].height);
-  glUniform4f (program->clip_location,
-               op->clip.bounds.origin.x, op->clip.bounds.origin.y,
-               op->clip.bounds.size.width, op->clip.bounds.size.height);
-
-  glUniform4f (program->clip_corner_widths_location,
-               op->clip.corner[0].width,
-               op->clip.corner[1].width,
-               op->clip.corner[2].width,
-               op->clip.corner[3].width);
-  glUniform4f (program->clip_corner_heights_location,
-               op->clip.corner[0].height,
-               op->clip.corner[1].height,
-               op->clip.corner[2].height,
-               op->clip.corner[3].height);
+  glUniform4fv (program->clip_rect_bounds_location, 1, (float *)&op->clip.bounds);
+  glUniform2fv (program->clip_rect_corners_location, 4, (float *)&op->clip.corner);
 }
 
 static inline void
 apply_inset_shadow_op (const Program  *program,
                        const OpShadow *op)
 {
-  OP_PRINT (" -> inset shadow. Color: (%f, %f, %f, %f), Offset: (%f, %f), Spread: %f, Outline: (%f, %f, %f, 
%f) Corner widths: (%f, %f, %f, %f), Corner Heights: (%f, %f, %f, %f)",
+  OP_PRINT (" -> inset shadow. Color: (%f, %f, %f, %f), Offset: (%f, %f), Spread: %f, Outline: %s",
             op->color[0],
             op->color[1],
             op->color[2],
@@ -2566,24 +2548,12 @@ apply_inset_shadow_op (const Program  *program,
             op->offset[0],
             op->offset[1],
             op->spread,
-            op->outline[0],
-            op->outline[1],
-            op->outline[2],
-            op->outline[3],
-            op->corner_widths[0],
-            op->corner_widths[1],
-            op->corner_widths[2],
-            op->corner_widths[3],
-            op->corner_heights[0],
-            op->corner_heights[1],
-            op->corner_heights[2],
-            op->corner_heights[3]);
+            gsk_rounded_rect_to_string (&op->outline));
   glUniform4fv (program->inset_shadow.color_location, 1, (float *)op->color);
   glUniform2fv (program->inset_shadow.offset_location, 1, op->offset);
   glUniform1f (program->inset_shadow.spread_location, op->spread);
-  glUniform4fv (program->inset_shadow.outline_location, 1, op->outline);
-  glUniform4fv (program->inset_shadow.corner_widths_location, 1, op->corner_widths);
-  glUniform4fv (program->inset_shadow.corner_heights_location, 1, op->corner_heights);
+  glUniform4fv (program->inset_shadow.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
+  glUniform2fv (program->inset_shadow.outline_rect_corners_location, 4, (float *)&op->outline.corner);
 }
 
 static inline void
@@ -2594,11 +2564,8 @@ apply_unblurred_outset_shadow_op (const Program  *program,
   glUniform4fv (program->unblurred_outset_shadow.color_location, 1, (float *)op->color);
   glUniform2fv (program->unblurred_outset_shadow.offset_location, 1, op->offset);
   glUniform1f (program->unblurred_outset_shadow.spread_location, op->spread);
-  glUniform4fv (program->unblurred_outset_shadow.outline_location, 1, op->outline);
-  glUniform4fv (program->unblurred_outset_shadow.corner_widths_location, 1,
-                op->corner_widths);
-  glUniform4fv (program->unblurred_outset_shadow.corner_heights_location, 1,
-                op->corner_heights);
+  glUniform4fv (program->unblurred_outset_shadow.outline_rect_bounds_location, 1, (float 
*)&op->outline.bounds);
+  glUniform2fv (program->unblurred_outset_shadow.outline_rect_corners_location, 4, (float 
*)&op->outline.corner);
 }
 
 static inline void
@@ -2606,9 +2573,8 @@ apply_outset_shadow_op (const Program  *program,
                         const OpShadow *op)
 {
   OP_PRINT (" -> outset shadow");
-  glUniform4fv (program->outset_shadow.outline_location, 1, op->outline);
-  glUniform4fv (program->outset_shadow.corner_widths_location, 1, op->corner_widths);
-  glUniform4fv (program->outset_shadow.corner_heights_location, 1, op->corner_heights);
+  glUniform4fv (program->outset_shadow.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
+  glUniform2fv (program->outset_shadow.outline_rect_corners_location, 4, (float *)&op->outline.corner);
 }
 
 static inline void
@@ -2634,11 +2600,10 @@ static inline void
 apply_border_op (const Program  *program,
                  const OpBorder *op)
 {
-  const GskRoundedRect *o = &op->outline;
   OP_PRINT (" -> Border Outline");
 
-  glUniform4fv (program->border.outline_location, 1, (float *)&o->bounds);
-  glUniform2fv (program->border.corner_sizes_location, 4, (float *)&o->corner);
+  glUniform4fv (program->border.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
+  glUniform2fv (program->border.outline_rect_corners_location, 4, (float *)&op->outline.corner);
 }
 
 static inline void
@@ -2806,9 +2771,7 @@ gsk_gl_renderer_create_programs (GskGLRenderer  *self,
 
       INIT_COMMON_UNIFORM_LOCATION (prog, alpha);
       INIT_COMMON_UNIFORM_LOCATION (prog, source);
-      INIT_COMMON_UNIFORM_LOCATION (prog, clip);
-      INIT_COMMON_UNIFORM_LOCATION (prog, clip_corner_widths);
-      INIT_COMMON_UNIFORM_LOCATION (prog, clip_corner_heights);
+      INIT_COMMON_UNIFORM_RECT_LOCATION (prog, clip_rect);
       INIT_COMMON_UNIFORM_LOCATION (prog, viewport);
       INIT_COMMON_UNIFORM_LOCATION (prog, projection);
       INIT_COMMON_UNIFORM_LOCATION (prog, modelview);
@@ -2840,28 +2803,21 @@ gsk_gl_renderer_create_programs (GskGLRenderer  *self,
   INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, color);
   INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, spread);
   INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, offset);
-  INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, outline);
-  INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, corner_widths);
-  INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, corner_heights);
+  INIT_PROGRAM_UNIFORM_RECT_LOCATION (inset_shadow, outline_rect);
 
   /* outset shadow */
-  INIT_PROGRAM_UNIFORM_LOCATION (outset_shadow, outline);
-  INIT_PROGRAM_UNIFORM_LOCATION (outset_shadow, corner_widths);
-  INIT_PROGRAM_UNIFORM_LOCATION (outset_shadow, corner_heights);
+  INIT_PROGRAM_UNIFORM_RECT_LOCATION (outset_shadow, outline_rect);
 
   /* unblurred outset shadow */
   INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, color);
   INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, spread);
   INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, offset);
-  INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, outline);
-  INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, corner_widths);
-  INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, corner_heights);
+  INIT_PROGRAM_UNIFORM_RECT_LOCATION (unblurred_outset_shadow, outline_rect);
 
   /* border */
   INIT_PROGRAM_UNIFORM_LOCATION (border, color);
   INIT_PROGRAM_UNIFORM_LOCATION (border, widths);
-  INIT_PROGRAM_UNIFORM_LOCATION (border, outline);
-  INIT_PROGRAM_UNIFORM_LOCATION (border, corner_sizes);
+  INIT_PROGRAM_UNIFORM_RECT_LOCATION (border, outline_rect);
 
   /* cross fade */
   INIT_PROGRAM_UNIFORM_LOCATION (cross_fade, progress);
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index 9924969ca4..46355239c6 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -47,10 +47,8 @@ struct _Program
   int viewport_location;
   int projection_location;
   int modelview_location;
-  int clip_location;
-  int clip_corner_widths_location;
-  int clip_corner_heights_location;
-
+  int clip_rect_bounds_location;
+  int clip_rect_corners_location;
   union {
     struct {
       int color_location;
@@ -78,19 +76,16 @@ struct _Program
       int color_location;
       int spread_location;
       int offset_location;
-      int outline_location;
-      int corner_widths_location;
-      int corner_heights_location;
+      int outline_rect_bounds_location;
+      int outline_rect_corners_location;
     } inset_shadow;
     struct {
-      int outline_location;
-      int corner_widths_location;
-      int corner_heights_location;
+      int outline_rect_bounds_location;
+      int outline_rect_corners_location;
     } outset_shadow;
     struct {
-      int outline_location;
-      int corner_widths_location;
-      int corner_heights_location;
+      int outline_rect_bounds_location;
+      int outline_rect_corners_location;
       int color_location;
       int spread_location;
       int offset_location;
@@ -98,8 +93,8 @@ struct _Program
     struct {
       int color_location;
       int widths_location;
-      int outline_location;
-      int corner_sizes_location;
+      int outline_rect_bounds_location;
+      int outline_rect_corners_location;
     } border;
     struct {
       int source2_location;
diff --git a/gsk/gl/gskshaderbuilder.c b/gsk/gl/gskshaderbuilder.c
index c057fcb3dc..97cfbb8113 100644
--- a/gsk/gl/gskshaderbuilder.c
+++ b/gsk/gl/gskshaderbuilder.c
@@ -222,6 +222,8 @@ gsk_shader_builder_compile_shader (GskShaderBuilder *builder,
       buffer = g_malloc0 (log_len + 1);
       glGetShaderInfoLog (shader_id, log_len, NULL, buffer);
 
+      g_message ("\n%s\n", source);
+
       g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_COMPILATION_FAILED,
                    "Compilation failure in %s shader:\n%s",
                    shader_type == GL_VERTEX_SHADER ? "vertex" : "fragment",
diff --git a/gsk/gl/opbuffer.h b/gsk/gl/opbuffer.h
index 210e7ed5c9..04ae799490 100644
--- a/gsk/gl/opbuffer.h
+++ b/gsk/gl/opbuffer.h
@@ -130,9 +130,7 @@ typedef struct
 
 typedef struct
 {
-  float outline[4];
-  float corner_widths[4];
-  float corner_heights[4];
+  GskRoundedRect outline;
   float spread;
   float offset[2];
   const GdkRGBA *color;
diff --git a/gsk/resources/glsl/border.fs.glsl b/gsk/resources/glsl/border.fs.glsl
index ea9760717e..d83fb23828 100644
--- a/gsk/resources/glsl/border.fs.glsl
+++ b/gsk/resources/glsl/border.fs.glsl
@@ -1,25 +1,15 @@
 uniform vec4 u_color;
 uniform vec4 u_widths;
-
-uniform vec4 u_outline;
-uniform vec2 u_corner_sizes[4];
+uniform RoundedRect u_outline_rect;
 
 void main() {
-  vec4 bounds = u_outline;
-
-  bounds.z = bounds.x + bounds.z;
-  bounds.w = bounds.y + bounds.w;
-
   vec4 f = gl_FragCoord;
   f.x += u_viewport.x;
   f.y = (u_viewport.y + u_viewport.w) - f.y;
 
-  vec4 corner_widths = vec4(u_corner_sizes[0].x, u_corner_sizes[1].x, u_corner_sizes[2].x, 
u_corner_sizes[3].x);
-  vec4 corner_heights = vec4(u_corner_sizes[0].y, u_corner_sizes[1].y, u_corner_sizes[2].y, 
u_corner_sizes[3].y);
-  RoundedRect routside = RoundedRect (bounds, corner_widths, corner_heights);
-  RoundedRect rinside = rounded_rect_shrink (routside, u_widths);
+  RoundedRect rinside = rounded_rect_shrink (u_outline_rect, u_widths);
 
-  float alpha = clamp (rounded_rect_coverage (routside, f.xy) -
+  float alpha = clamp (rounded_rect_coverage (u_outline_rect, f.xy) -
                        rounded_rect_coverage (rinside, f.xy),
                        0.0, 1.0);
 
diff --git a/gsk/resources/glsl/gl3_common.fs.glsl b/gsk/resources/glsl/gl3_common.fs.glsl
index ce853fdf2d..bdc2fc92aa 100644
--- a/gsk/resources/glsl/gl3_common.fs.glsl
+++ b/gsk/resources/glsl/gl3_common.fs.glsl
@@ -6,23 +6,17 @@ uniform mat4 u_modelview = mat4(1.0);
 uniform float u_alpha = 1.0;
 uniform vec4 u_viewport;
 
-// In GtkSnapshot coordinates
-uniform vec4 u_clip;
-uniform vec4 u_clip_corner_widths  = vec4(0, 0, 0, 0);
-uniform vec4 u_clip_corner_heights = vec4(0, 0, 0, 0);
-
-in vec2 vUv;
-
-out vec4 outputColor;
-
-
 struct RoundedRect
 {
   vec4 bounds;
-  vec4 corner_widths;
-  vec4 corner_heights;
+  vec2 corners[4];
 };
 
+uniform RoundedRect u_clip_rect;
+
+in vec2 vUv;
+out vec4 outputColor;
+
 float
 ellipsis_dist (vec2 p, vec2 radius)
 {
@@ -46,18 +40,18 @@ float
 rounded_rect_coverage (RoundedRect r, vec2 p)
 {
   if (p.x < r.bounds.x || p.y < r.bounds.y ||
-      p.x >= r.bounds.z || p.y >= r.bounds.w)
+      p.x >= (r.bounds.x + r.bounds.z) || p.y >= (r.bounds.y + r.bounds.w))
     return 0.0;
 
-  vec2 rad_tl = vec2(r.corner_widths.x, r.corner_heights.x);
-  vec2 rad_tr = vec2(r.corner_widths.y, r.corner_heights.y);
-  vec2 rad_br = vec2(r.corner_widths.z, r.corner_heights.z);
-  vec2 rad_bl = vec2(r.corner_widths.w, r.corner_heights.w);
+  vec2 rad_tl = r.corners[0];
+  vec2 rad_tr = r.corners[1];
+  vec2 rad_br = r.corners[2];
+  vec2 rad_bl = r.corners[3];
 
-  vec2 ref_tl = r.bounds.xy + vec2( r.corner_widths.x,  r.corner_heights.x);
-  vec2 ref_tr = r.bounds.zy + vec2(-r.corner_widths.y,  r.corner_heights.y);
-  vec2 ref_br = r.bounds.zw + vec2(-r.corner_widths.z, -r.corner_heights.z);
-  vec2 ref_bl = r.bounds.xw + vec2( r.corner_widths.w, -r.corner_heights.w);
+  vec2 ref_tl = r.bounds.xy + r.corners[0];
+  vec2 ref_tr = vec2(r.bounds.x + r.bounds.z, r.bounds.y) + (r.corners[1] * vec2(-1, 1));
+  vec2 ref_br = vec2(r.bounds.x + r.bounds.z, r.bounds.y + r.bounds.w) - r.corners[2];
+  vec2 ref_bl = vec2(r.bounds.x, r.bounds.y + r.bounds.w) + (r.corners[3] * vec2(1, -1));
 
   float d_tl = ellipsis_coverage(p, ref_tl, rad_tl);
   float d_tr = ellipsis_coverage(p, ref_tr, rad_tr);
@@ -74,30 +68,38 @@ rounded_rect_coverage (RoundedRect r, vec2 p)
   return 1.0 - dot(vec4(is_out), corner_coverages);
 }
 
+// amount is: top, right, bottom, left
 RoundedRect
 rounded_rect_shrink (RoundedRect r, vec4 amount)
 {
-  vec4 new_bounds = r.bounds + vec4(1.0,1.0,-1.0,-1.0) * amount.wxyz;
-  vec4 new_widths = vec4(0);
-  vec4 new_heights = vec4(0);
+  vec4 new_bounds = r.bounds;
+  vec2 new_corners[4];
+
+  new_bounds.xy += amount.wx;
+  new_bounds.zw -= amount.wx + amount.yz;
+
+  new_corners[0] = vec2(0);
+  new_corners[1] = vec2(0);
+  new_corners[2] = vec2(0);
+  new_corners[3] = vec2(0);
 
   // Left top
-  if (r.corner_widths.x  > 0) new_widths.x = r.corner_widths.x - amount.w;
-  if (r.corner_heights.x > 0) new_heights.x = r.corner_heights.x - amount.x;
+  if (r.corners[0].x > 0 || r.corners[0].y > 0)
+    new_corners[0] = r.corners[0] - amount.wx;
 
-  // Top right
-  if (r.corner_widths.y > 0) new_widths.y = r.corner_widths.y - amount.y;
-  if (r.corner_heights.y > 0) new_heights.y = r.corner_heights.y - amount.x;
+  // top right
+  if (r.corners[1].x > 0 || r.corners[1].y > 0)
+    new_corners[1] = r.corners[1] - amount.yx;
 
   // Bottom right
-  if (r.corner_widths.z > 0) new_widths.z = r.corner_widths.z - amount.y;
-  if (r.corner_heights.z > 0) new_heights.z = r.corner_heights.z - amount.z;
+  if (r.corners[2].x > 0 || r.corners[2].y > 0)
+    new_corners[2] = r.corners[2] - amount.yz;
 
   // Bottom left
-  if (r.corner_widths.w > 0) new_widths.w = r.corner_widths.w - amount.w;
-  if (r.corner_heights.w > 0) new_heights.w = r.corner_heights.w - amount.z;
+  if (r.corners[3].x > 0 || r.corners[3].y > 0)
+    new_corners[3] = r.corners[3] - amount.wz;
 
-  return RoundedRect (new_bounds, new_widths, new_heights);
+  return RoundedRect (new_bounds, new_corners);
 }
 
 vec4 Texture(sampler2D sampler, vec2 texCoords) {
@@ -105,17 +107,11 @@ vec4 Texture(sampler2D sampler, vec2 texCoords) {
 }
 
 void setOutputColor(vec4 color) {
-  vec4 clipBounds = u_clip;
   vec4 f = gl_FragCoord;
 
   f.x += u_viewport.x;
   f.y = (u_viewport.y + u_viewport.w) - f.y;
 
-  clipBounds.z = clipBounds.x + clipBounds.z;
-  clipBounds.w = clipBounds.y + clipBounds.w;
-
-  RoundedRect r = RoundedRect(clipBounds, u_clip_corner_widths, u_clip_corner_heights);
-
-  outputColor = color * rounded_rect_coverage(r, f.xy);
+  outputColor = color * rounded_rect_coverage(u_clip_rect, f.xy);
   /*outputColor = color;*/
 }
diff --git a/gsk/resources/glsl/inset_shadow.fs.glsl b/gsk/resources/glsl/inset_shadow.fs.glsl
index e0b28d6589..44bd4d733d 100644
--- a/gsk/resources/glsl/inset_shadow.fs.glsl
+++ b/gsk/resources/glsl/inset_shadow.fs.glsl
@@ -1,9 +1,7 @@
 uniform float u_spread;
 uniform vec4 u_color;
 uniform vec2 u_offset;
-uniform vec4 u_outline;
-uniform vec4 u_corner_widths;
-uniform vec4 u_corner_heights;
+uniform RoundedRect u_outline_rect;
 
 
 void main() {
@@ -12,14 +10,10 @@ void main() {
   f.x += u_viewport.x;
   f.y = (u_viewport.y + u_viewport.w) - f.y;
 
-  RoundedRect outline = RoundedRect(vec4(u_outline.xy, u_outline.xy + u_outline.zw),
-                                    u_corner_widths, u_corner_heights);
-  RoundedRect inside = rounded_rect_shrink(outline, vec4(u_spread));
-
-
+  RoundedRect inside = rounded_rect_shrink(u_outline_rect, vec4(u_spread));
   vec2 offset = vec2(u_offset.x, - u_offset.y);
   vec4 color = vec4(u_color.rgb * u_color.a, u_color.a);
-  color = color * clamp (rounded_rect_coverage (outline, f.xy) -
+  color = color * clamp (rounded_rect_coverage (u_outline_rect, f.xy) -
                          rounded_rect_coverage (inside, f.xy - offset),
                          0.0, 1.0);
   setOutputColor(color * u_alpha);
diff --git a/gsk/resources/glsl/outset_shadow.fs.glsl b/gsk/resources/glsl/outset_shadow.fs.glsl
index 9a97c34e1b..be8f78c297 100644
--- a/gsk/resources/glsl/outset_shadow.fs.glsl
+++ b/gsk/resources/glsl/outset_shadow.fs.glsl
@@ -1,6 +1,4 @@
-uniform vec4 u_outline;
-uniform vec4 u_corner_widths;//= vec4(0, 0, 0, 0);
-uniform vec4 u_corner_heights;// = vec4(0, 0, 0, 0);
+uniform RoundedRect u_outline_rect;
 
 void main() {
   vec4 f = gl_FragCoord;
@@ -8,9 +6,7 @@ void main() {
   f.x += u_viewport.x;
   f.y = (u_viewport.y + u_viewport.w) - f.y;
 
-  RoundedRect outline = RoundedRect(vec4(u_outline.xy, u_outline.xy + u_outline.zw), u_corner_widths, 
u_corner_heights);
-
   vec4 color = Texture(u_source, vUv);
-  color = color * (1.0 -  clamp(rounded_rect_coverage (outline, f.xy), 0.0, 1.0));
+  color = color * (1.0 -  clamp(rounded_rect_coverage (u_outline_rect, f.xy), 0.0, 1.0));
   setOutputColor(color * u_alpha);
 }
diff --git a/gsk/resources/glsl/unblurred_outset_shadow.fs.glsl 
b/gsk/resources/glsl/unblurred_outset_shadow.fs.glsl
index f859123d52..ac37d0eadb 100644
--- a/gsk/resources/glsl/unblurred_outset_shadow.fs.glsl
+++ b/gsk/resources/glsl/unblurred_outset_shadow.fs.glsl
@@ -1,10 +1,7 @@
 uniform float u_spread;
 uniform vec4 u_color;
 uniform vec2 u_offset;
-uniform vec4 u_outline;
-uniform vec4 u_corner_widths;
-uniform vec4 u_corner_heights;
-
+uniform RoundedRect u_outline_rect;
 
 void main() {
   vec4 f = gl_FragCoord;
@@ -12,15 +9,12 @@ void main() {
   f.x += u_viewport.x;
   f.y = (u_viewport.y + u_viewport.w) - f.y;
 
-  RoundedRect inside = RoundedRect(vec4(u_outline.xy, u_outline.xy + u_outline.zw),
-                                    u_corner_widths, u_corner_heights);
-
-  RoundedRect outline = rounded_rect_shrink(inside, vec4(- u_spread));
+  RoundedRect outline = rounded_rect_shrink(u_outline_rect, vec4(- u_spread));
 
   vec2 offset = vec2(u_offset.x, - u_offset.y);
   vec4 color = vec4(u_color.rgb * u_color.a, u_color.a);
   color = color * clamp (rounded_rect_coverage (outline, f.xy - offset) -
-                         rounded_rect_coverage (inside, f.xy),
+                         rounded_rect_coverage (u_outline_rect, f.xy),
                          0.0, 1.0);
   setOutputColor(color * u_alpha);
 }


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