summaryrefslogtreecommitdiffstats
path: root/gfx/wr/webrender/res/cs_gradient.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/wr/webrender/res/cs_gradient.glsl')
-rw-r--r--gfx/wr/webrender/res/cs_gradient.glsl56
1 files changed, 56 insertions, 0 deletions
diff --git a/gfx/wr/webrender/res/cs_gradient.glsl b/gfx/wr/webrender/res/cs_gradient.glsl
new file mode 100644
index 0000000000..6e6b5c4ad0
--- /dev/null
+++ b/gfx/wr/webrender/res/cs_gradient.glsl
@@ -0,0 +1,56 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include shared
+
+varying float vPos;
+flat varying vec4 vStops;
+flat varying vec4 vColor0;
+flat varying vec4 vColor1;
+flat varying vec4 vColor2;
+flat varying vec4 vColor3;
+
+#ifdef WR_VERTEX_SHADER
+
+PER_INSTANCE in vec4 aTaskRect;
+PER_INSTANCE in float aAxisSelect;
+PER_INSTANCE in vec4 aStops;
+PER_INSTANCE in vec4 aColor0;
+PER_INSTANCE in vec4 aColor1;
+PER_INSTANCE in vec4 aColor2;
+PER_INSTANCE in vec4 aColor3;
+PER_INSTANCE in vec2 aStartStop;
+
+void main(void) {
+ vPos = mix(aStartStop.x, aStartStop.y, mix(aPosition.x, aPosition.y, aAxisSelect));
+
+ vStops = aStops;
+ vColor0 = aColor0;
+ vColor1 = aColor1;
+ vColor2 = aColor2;
+ vColor3 = aColor3;
+
+ gl_Position = uTransform * vec4(aTaskRect.xy + aTaskRect.zw * aPosition.xy, 0.0, 1.0);
+}
+#endif
+
+#ifdef WR_FRAGMENT_SHADER
+float linear_step(float edge0, float edge1, float x) {
+ if (edge0 >= edge1) {
+ return 0.0;
+ }
+
+ return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+}
+
+void main(void) {
+ vec4 color = vColor0;
+
+ color = mix(color, vColor1, linear_step(vStops.x, vStops.y, vPos));
+ color = mix(color, vColor2, linear_step(vStops.y, vStops.z, vPos));
+ color = mix(color, vColor3, linear_step(vStops.z, vStops.w, vPos));
+
+ oFragColor = color;
+}
+#endif