summaryrefslogtreecommitdiff
path: root/meta-openembedded/meta-oe/recipes-benchmark/glmark2/files/0003-fix-precision-handling-bugs.patch
blob: af88f6cd23e88c38e6eac8214284bb3502d62267 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
From 90e837ffd1ff5c9add1074d69de23e58a3a4810e Mon Sep 17 00:00:00 2001
From: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Date: Wed, 11 Nov 2020 09:26:03 -0500
Subject: [PATCH 1/3] terrain: Fix precision bug in light rendering

Resulting in overly bright rendering when mediump is implemented as
fp16.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
---
 data/shaders/terrain.frag | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/data/shaders/terrain.frag b/data/shaders/terrain.frag
index 84d085c..58f17ea 100644
--- a/data/shaders/terrain.frag
+++ b/data/shaders/terrain.frag
@@ -67,7 +67,12 @@ void main() {
     vec3 pointSpecular = vec3( 0.0 );
     for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
         vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+        // should be highp for correct behaviour if mediump is implemented as fp16
+        highp vec3 lVector = lPosition.xyz + vViewPosition.xyz;
+#else
         vec3 lVector = lPosition.xyz + vViewPosition.xyz;
+#endif
         float lDistance = 1.0;
         if ( pointLightDistance[ i ] > 0.0 )
             lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );

From 1edd76fda77edabd49d713912aee49b8360c86c3 Mon Sep 17 00:00:00 2001
From: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Date: Wed, 11 Nov 2020 09:49:52 -0500
Subject: [PATCH 2/3] terrain: Fix precision handling in noise shader

Another overflow resulting in infinity in mediump. Note this bug is
masked if the driver clamps infinity to MAX_FLOAT, but it's still our
bug.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
---
 data/shaders/terrain-noise.frag | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/data/shaders/terrain-noise.frag b/data/shaders/terrain-noise.frag
index 7fea5c0..9535e58 100644
--- a/data/shaders/terrain-noise.frag
+++ b/data/shaders/terrain-noise.frag
@@ -17,7 +17,13 @@ uniform float time;
 uniform MEDIUMP vec2 uvScale;
 varying vec2 vUv;
 
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+// x should be passed as highp since the intermediate multiplications can
+// overflow with mediump
+vec4 permute(highp vec4 x)
+#else
 vec4 permute(vec4 x)
+#endif
 {
     return mod(((x * 34.0) + 1.0) * x, 289.0);
 }

From e866cc633ffc450e5358b2742f32ca360e4f3f12 Mon Sep 17 00:00:00 2001
From: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Date: Wed, 11 Nov 2020 09:35:21 -0500
Subject: [PATCH 3/3] loop,function,conditionals: Fix mediump overflow

The multiplication can produce infinity.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
---
 data/shaders/conditionals.frag | 9 ++++++++-
 data/shaders/function.frag     | 9 ++++++++-
 data/shaders/loop.frag         | 9 ++++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/data/shaders/conditionals.frag b/data/shaders/conditionals.frag
index 3bd2507..e902263 100644
--- a/data/shaders/conditionals.frag
+++ b/data/shaders/conditionals.frag
@@ -2,7 +2,14 @@ varying vec4 dummy;
 
 void main(void)
 {
-    float d = fract(gl_FragCoord.x * gl_FragCoord.y * 0.0001);
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+    // should be declared highp since the multiplication can overflow in
+    // mediump, particularly if mediump is implemented as fp16
+    highp vec2 FragCoord = gl_FragCoord.xy;
+#else
+    vec2 FragCoord = gl_FragCoord.xy;
+#endif
+    float d = fract(FragCoord.x * FragCoord.y * 0.0001);
 
 $MAIN$
 
diff --git a/data/shaders/function.frag b/data/shaders/function.frag
index 3e3c74f..9d0230e 100644
--- a/data/shaders/function.frag
+++ b/data/shaders/function.frag
@@ -8,7 +8,14 @@ $PROCESS$
 
 void main(void)
 {
-    float d = fract(gl_FragCoord.x * gl_FragCoord.y * 0.0001);
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+    // should be declared highp since the multiplication can overflow in
+    // mediump, particularly if mediump is implemented as fp16
+    highp vec2 FragCoord = gl_FragCoord.xy;
+#else
+    vec2 FragCoord = gl_FragCoord.xy;
+#endif
+    float d = fract(FragCoord.x * FragCoord.y * 0.0001);
 
 $MAIN$
 
diff --git a/data/shaders/loop.frag b/data/shaders/loop.frag
index 31ae23e..9a6afd2 100644
--- a/data/shaders/loop.frag
+++ b/data/shaders/loop.frag
@@ -3,7 +3,14 @@ uniform int FragmentLoops;
 
 void main(void)
 {
-    float d = fract(gl_FragCoord.x * gl_FragCoord.y * 0.0001);
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+    // should be declared highp since the multiplication can overflow in
+    // mediump, particularly if mediump is implemented as fp16
+    highp vec2 FragCoord = gl_FragCoord.xy;
+#else
+    vec2 FragCoord = gl_FragCoord.xy;
+#endif
+    float d = fract(FragCoord.x * FragCoord.y * 0.0001);
 
 $MAIN$