summaryrefslogtreecommitdiffstats
path: root/glow/src/shader
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2022-01-26 13:54:21 +0700
committerLibravatar GitHub <noreply@github.com>2022-01-26 13:54:21 +0700
commit9b3cab82ef3bbc5b8129ac3bacec4011229f0fbc (patch)
treebc9fbd32c8c589bc56d2458bb77bc8293ba8a6bd /glow/src/shader
parent4aa943cbc63230dfcb995c469ceec9f74e6132e1 (diff)
parent522368e8af6947ea0676f62bf1ae5f68acb2058d (diff)
downloadiced-9b3cab82ef3bbc5b8129ac3bacec4011229f0fbc.tar.gz
iced-9b3cab82ef3bbc5b8129ac3bacec4011229f0fbc.tar.bz2
iced-9b3cab82ef3bbc5b8129ac3bacec4011229f0fbc.zip
Merge pull request #1160 from derezzedex/dev/arm-support
feat: add support to ARM devices (and older hardware)
Diffstat (limited to 'glow/src/shader')
-rw-r--r--glow/src/shader/common/triangle.frag18
-rw-r--r--glow/src/shader/common/triangle.vert (renamed from glow/src/shader/triangle.vert)8
-rw-r--r--glow/src/shader/compatibility/quad.frag67
-rw-r--r--glow/src/shader/compatibility/quad.vert44
-rw-r--r--glow/src/shader/core/quad.frag (renamed from glow/src/shader/quad.frag)25
-rw-r--r--glow/src/shader/core/quad.vert (renamed from glow/src/shader/quad.vert)16
-rw-r--r--glow/src/shader/triangle.frag9
7 files changed, 156 insertions, 31 deletions
diff --git a/glow/src/shader/common/triangle.frag b/glow/src/shader/common/triangle.frag
new file mode 100644
index 00000000..e8689f2e
--- /dev/null
+++ b/glow/src/shader/common/triangle.frag
@@ -0,0 +1,18 @@
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+
+#ifdef HIGHER_THAN_300
+out vec4 fragColor;
+#define gl_FragColor fragColor
+#endif
+
+in vec4 v_Color;
+
+void main() {
+ gl_FragColor = v_Color;
+} \ No newline at end of file
diff --git a/glow/src/shader/triangle.vert b/glow/src/shader/common/triangle.vert
index 5723436a..d0494a5f 100644
--- a/glow/src/shader/triangle.vert
+++ b/glow/src/shader/common/triangle.vert
@@ -1,13 +1,11 @@
-#version 330
-
uniform mat4 u_Transform;
-layout(location = 0) in vec2 i_Position;
-layout(location = 1) in vec4 i_Color;
+in vec2 i_Position;
+in vec4 i_Color;
out vec4 v_Color;
void main() {
gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);
v_Color = i_Color;
-}
+} \ No newline at end of file
diff --git a/glow/src/shader/compatibility/quad.frag b/glow/src/shader/compatibility/quad.frag
new file mode 100644
index 00000000..8ea5693d
--- /dev/null
+++ b/glow/src/shader/compatibility/quad.frag
@@ -0,0 +1,67 @@
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+
+uniform float u_ScreenHeight;
+
+varying vec4 v_Color;
+varying vec4 v_BorderColor;
+varying vec2 v_Pos;
+varying vec2 v_Scale;
+varying float v_BorderRadius;
+varying float v_BorderWidth;
+
+float _distance(vec2 frag_coord, vec2 position, vec2 size, float radius)
+{
+ // TODO: Try SDF approach: https://www.shadertoy.com/view/wd3XRN
+ vec2 inner_size = size - vec2(radius, radius) * 2.0;
+ vec2 top_left = position + vec2(radius, radius);
+ vec2 bottom_right = top_left + inner_size;
+
+ vec2 top_left_distance = top_left - frag_coord;
+ vec2 bottom_right_distance = frag_coord - bottom_right;
+
+ vec2 distance = vec2(
+ max(max(top_left_distance.x, bottom_right_distance.x), 0.0),
+ max(max(top_left_distance.y, bottom_right_distance.y), 0.0)
+ );
+
+ return sqrt(distance.x * distance.x + distance.y * distance.y);
+}
+
+void main() {
+ vec2 fragCoord = vec2(gl_FragCoord.x, u_ScreenHeight - gl_FragCoord.y);
+
+ float internal_border = max(v_BorderRadius - v_BorderWidth, 0.0);
+
+ float internal_distance = _distance(
+ fragCoord,
+ v_Pos + vec2(v_BorderWidth),
+ v_Scale - vec2(v_BorderWidth * 2.0),
+ internal_border
+ );
+
+ float border_mix = smoothstep(
+ max(internal_border - 0.5, 0.0),
+ internal_border + 0.5,
+ internal_distance
+ );
+
+ vec4 mixed_color = mix(v_Color, v_BorderColor, border_mix);
+
+ float d = _distance(
+ fragCoord,
+ v_Pos,
+ v_Scale,
+ v_BorderRadius
+ );
+
+ float radius_alpha =
+ 1.0 - smoothstep(max(v_BorderRadius - 0.5, 0.0), v_BorderRadius + 0.5, d);
+
+ gl_FragColor = vec4(mixed_color.xyz, mixed_color.w * radius_alpha);
+}
diff --git a/glow/src/shader/compatibility/quad.vert b/glow/src/shader/compatibility/quad.vert
new file mode 100644
index 00000000..abe70c0e
--- /dev/null
+++ b/glow/src/shader/compatibility/quad.vert
@@ -0,0 +1,44 @@
+uniform mat4 u_Transform;
+uniform float u_Scale;
+
+attribute vec2 i_Pos;
+attribute vec2 i_Scale;
+attribute vec4 i_Color;
+attribute vec4 i_BorderColor;
+attribute float i_BorderRadius;
+attribute float i_BorderWidth;
+attribute vec2 q_Pos;
+
+varying vec4 v_Color;
+varying vec4 v_BorderColor;
+varying vec2 v_Pos;
+varying vec2 v_Scale;
+varying float v_BorderRadius;
+varying float v_BorderWidth;
+
+
+void main() {
+ vec2 p_Pos = i_Pos * u_Scale;
+ vec2 p_Scale = i_Scale * u_Scale;
+
+ float i_BorderRadius = min(
+ i_BorderRadius,
+ min(i_Scale.x, i_Scale.y) / 2.0
+ );
+
+ mat4 i_Transform = mat4(
+ vec4(p_Scale.x + 1.0, 0.0, 0.0, 0.0),
+ vec4(0.0, p_Scale.y + 1.0, 0.0, 0.0),
+ vec4(0.0, 0.0, 1.0, 0.0),
+ vec4(p_Pos - vec2(0.5, 0.5), 0.0, 1.0)
+ );
+
+ v_Color = i_Color;
+ v_BorderColor = i_BorderColor;
+ v_Pos = p_Pos;
+ v_Scale = p_Scale;
+ v_BorderRadius = i_BorderRadius * u_Scale;
+ v_BorderWidth = i_BorderWidth * u_Scale;
+
+ gl_Position = u_Transform * i_Transform * vec4(q_Pos, 0.0, 1.0);
+}
diff --git a/glow/src/shader/quad.frag b/glow/src/shader/core/quad.frag
index cea36bdc..57e2e8e7 100644
--- a/glow/src/shader/quad.frag
+++ b/glow/src/shader/core/quad.frag
@@ -1,4 +1,15 @@
-#version 330
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+
+#ifdef HIGHER_THAN_300
+out vec4 fragColor;
+#define gl_FragColor fragColor
+#endif
uniform float u_ScreenHeight;
@@ -9,9 +20,7 @@ in vec2 v_Scale;
in float v_BorderRadius;
in float v_BorderWidth;
-out vec4 o_Color;
-
-float distance(in vec2 frag_coord, in vec2 position, in vec2 size, float radius)
+float fDistance(vec2 frag_coord, vec2 position, vec2 size, float radius)
{
// TODO: Try SDF approach: https://www.shadertoy.com/view/wd3XRN
vec2 inner_size = size - vec2(radius, radius) * 2.0;
@@ -35,10 +44,10 @@ void main() {
vec2 fragCoord = vec2(gl_FragCoord.x, u_ScreenHeight - gl_FragCoord.y);
// TODO: Remove branching (?)
- if(v_BorderWidth > 0) {
+ if(v_BorderWidth > 0.0) {
float internal_border = max(v_BorderRadius - v_BorderWidth, 0.0);
- float internal_distance = distance(
+ float internal_distance = fDistance(
fragCoord,
v_Pos + vec2(v_BorderWidth),
v_Scale - vec2(v_BorderWidth * 2.0),
@@ -56,7 +65,7 @@ void main() {
mixed_color = v_Color;
}
- float d = distance(
+ float d = fDistance(
fragCoord,
v_Pos,
v_Scale,
@@ -66,5 +75,5 @@ void main() {
float radius_alpha =
1.0 - smoothstep(max(v_BorderRadius - 0.5, 0.0), v_BorderRadius + 0.5, d);
- o_Color = vec4(mixed_color.xyz, mixed_color.w * radius_alpha);
+ gl_FragColor = vec4(mixed_color.xyz, mixed_color.w * radius_alpha);
}
diff --git a/glow/src/shader/quad.vert b/glow/src/shader/core/quad.vert
index 82417856..b1fb2365 100644
--- a/glow/src/shader/quad.vert
+++ b/glow/src/shader/core/quad.vert
@@ -1,14 +1,12 @@
-#version 330
-
uniform mat4 u_Transform;
uniform float u_Scale;
-layout(location = 0) in vec2 i_Pos;
-layout(location = 1) in vec2 i_Scale;
-layout(location = 2) in vec4 i_Color;
-layout(location = 3) in vec4 i_BorderColor;
-layout(location = 4) in float i_BorderRadius;
-layout(location = 5) in float i_BorderWidth;
+in vec2 i_Pos;
+in vec2 i_Scale;
+in vec4 i_Color;
+in vec4 i_BorderColor;
+in float i_BorderRadius;
+in float i_BorderWidth;
out vec4 v_Color;
out vec4 v_BorderColor;
@@ -17,7 +15,7 @@ out vec2 v_Scale;
out float v_BorderRadius;
out float v_BorderWidth;
-const vec2 positions[4] = vec2[](
+vec2 positions[4] = vec2[](
vec2(0.0, 0.0),
vec2(0.0, 1.0),
vec2(1.0, 0.0),
diff --git a/glow/src/shader/triangle.frag b/glow/src/shader/triangle.frag
deleted file mode 100644
index d186784a..00000000
--- a/glow/src/shader/triangle.frag
+++ /dev/null
@@ -1,9 +0,0 @@
-#version 330
-
-in vec4 v_Color;
-
-out vec4 o_Color;
-
-void main() {
- o_Color = v_Color;
-}