summaryrefslogtreecommitdiff
path: root/gsk
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2019-12-17 12:20:18 +0100
committerTimm Bäder <mail@baedert.org>2020-01-07 17:27:16 +0100
commitcef7f7f87d0e3a60925c7d4a7f461932481c302a (patch)
treeb064cf52655bd0b115444ba9ef07a7734bd3830c /gsk
parentfdce30d3f8b00c69d8160278afaf2e82e933fcdc (diff)
downloadgtk+-cef7f7f87d0e3a60925c7d4a7f461932481c302a.tar.gz
gl renderer: Move work to the gradient vertex shader
No need to do this stuff once per fragment.
Diffstat (limited to 'gsk')
-rw-r--r--gsk/resources/glsl/linear_gradient.glsl35
1 files changed, 23 insertions, 12 deletions
diff --git a/gsk/resources/glsl/linear_gradient.glsl b/gsk/resources/glsl/linear_gradient.glsl
index f0ba46517f..0b5fefce83 100644
--- a/gsk/resources/glsl/linear_gradient.glsl
+++ b/gsk/resources/glsl/linear_gradient.glsl
@@ -1,16 +1,35 @@
-// VERTEX_SHADER:
+// VERTEX_SHADER
+uniform vec2 u_start_point;
+uniform vec2 u_end_point;
+
+_OUT_ vec2 startPoint;
+_OUT_ vec2 endPoint;
+_OUT_ float maxDist;
+_OUT_ vec2 gradient;
+_OUT_ float gradientLength;
+
void main() {
gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
- vUv = vec2(aUv.x, aUv.y);
+ startPoint = (u_modelview * vec4(u_start_point, 0, 1)).xy;
+ endPoint = (u_modelview * vec4(u_end_point, 0, 1)).xy;
+ maxDist = length(endPoint - startPoint);
+
+ // Gradient direction
+ gradient = endPoint - startPoint;
+ gradientLength = length(gradient);
}
// FRAGMENT_SHADER:
uniform vec4 u_color_stops[8];
uniform float u_color_offsets[8];
uniform int u_num_color_stops;
-uniform vec2 u_start_point;
-uniform vec2 u_end_point;
+
+_IN_ vec2 startPoint;
+_IN_ vec2 endPoint;
+_IN_ float maxDist;
+_IN_ vec2 gradient;
+_IN_ float gradientLength;
vec4 fragCoord() {
vec4 f = gl_FragCoord;
@@ -20,17 +39,9 @@ vec4 fragCoord() {
}
void main() {
- vec2 startPoint = (u_modelview * vec4(u_start_point, 0, 1)).xy;
- vec2 endPoint = (u_modelview * vec4(u_end_point, 0, 1)).xy;
- float maxDist = length(endPoint - startPoint);
-
// Position relative to startPoint
vec2 pos = fragCoord().xy - startPoint;
- // Gradient direction
- vec2 gradient = endPoint - startPoint;
- float gradientLength = length(gradient);
-
// Current pixel, projected onto the line between the start point and the end point
// The projection will be relative to the start point!
vec2 proj = (dot(gradient, pos) / (gradientLength * gradientLength)) * gradient;