All of lore.kernel.org
 help / color / mirror / Atom feed
* [meta-oe][PATCH] glmark2: fix precision handling bugs
@ 2020-12-18 19:48 Trevor Woerner
  0 siblings, 0 replies; only message in thread
From: Trevor Woerner @ 2020-12-18 19:48 UTC (permalink / raw)
  To: openembedded-devel

This patch comes from Alyssa Rosenzweig and fixes/clarifies glmark2's
handling of fp16 overflows which result in corrupted rendering on some
drivers.

See: https://github.com/glmark2/glmark2/pull/132

Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
 .../0003-fix-precision-handling-bugs.patch    | 138 ++++++++++++++++++
 .../recipes-benchmark/glmark2/glmark2_git.bb  |   1 +
 2 files changed, 139 insertions(+)
 create mode 100644 meta-oe/recipes-benchmark/glmark2/files/0003-fix-precision-handling-bugs.patch

diff --git a/meta-oe/recipes-benchmark/glmark2/files/0003-fix-precision-handling-bugs.patch b/meta-oe/recipes-benchmark/glmark2/files/0003-fix-precision-handling-bugs.patch
new file mode 100644
index 000000000..af88f6cd2
--- /dev/null
+++ b/meta-oe/recipes-benchmark/glmark2/files/0003-fix-precision-handling-bugs.patch
@@ -0,0 +1,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$
+ 
diff --git a/meta-oe/recipes-benchmark/glmark2/glmark2_git.bb b/meta-oe/recipes-benchmark/glmark2/glmark2_git.bb
index 44bce9fb5..a5872f435 100644
--- a/meta-oe/recipes-benchmark/glmark2/glmark2_git.bb
+++ b/meta-oe/recipes-benchmark/glmark2/glmark2_git.bb
@@ -17,6 +17,7 @@ SRC_URI = " \
     git://github.com/glmark2/glmark2.git;protocol=https \
     file://0001-fix-dispmanx-build.patch \
     file://0002-run-dispmanx-fullscreen.patch \
+    file://0003-fix-precision-handling-bugs.patch \
     "
 SRCREV = "784aca755a469b144acf3cae180b6e613b7b057a"
 
-- 
2.30.0.rc0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-18 19:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-18 19:48 [meta-oe][PATCH] glmark2: fix precision handling bugs Trevor Woerner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.