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)