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)