Clamp GLES sine/cosine to [-1,1]
Hack for minor precision issues with current implementation. Fixes
8 quality warnings from deqp-gles3 when run against
SwiftShaderGL/Subzero.
Bug: b/151461290
Change-Id: I4a3148add2c0987dcccca96e7c877ea4fb16ca89
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43470
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Shader/ShaderCore.cpp b/src/Shader/ShaderCore.cpp
index 4ea3260..90a28bf 100644
--- a/src/Shader/ShaderCore.cpp
+++ b/src/Shader/ShaderCore.cpp
@@ -276,6 +276,12 @@
return sine_pi(y, pp);
}
+ // Assumes x is a finite floating point value
+ static RValue<Float4> clamp(const Float4 &x, const Float4 &min, const Float4 &max)
+ {
+ return Min(Max(x, min), max);
+ }
+
Float4 sine(RValue<Float4> x, bool pp)
{
// Reduce to [-0.5, 0.5] range
@@ -311,6 +317,9 @@
sin = sin * (Abs(sin) * D + C);
}
+ // TODO(b/151461290): Fix precision loss instead of clamping.
+ sin = clamp(sin, Float4(-1.0f), Float4(1.0f));
+
return sin;
}
@@ -318,7 +327,12 @@
{
// cos(x) = sin(x + pi/2)
Float4 y = x + Float4(1.57079632e+0f);
- return sine(y, pp);
+ auto cos = sine(y, pp);
+
+ // TODO(b/151461290): Fix precision loss instead of clamping.
+ cos = clamp(cos, Float4(-1.0f), Float4(1.0f));
+
+ return cos;
}
Float4 tangent(RValue<Float4> x, bool pp)