<div dir="ltr">We're encountering failures in the latest version of dEQP (specifically, dEQP-GLES3.functional.shaders.builtin_functions.precision.tanh.highp_*) on all Intel devices.<div><br></div><div>The problem is that when the abs value of input is too large (say 80), the function should return +/-1, but the actual shader output is 0.</div><div><br></div><div>The following patch in glsl compiler fixes the problem, but I'm not really sure if a fix in the compiler frontend is the right place. On the other hand, once the intermediate code is emitted, it's not really feasible for drivers to handle precision problems in backend. Any ideas?</div><div><br></div><div>Here's the patch</div><div><br></div><div><div>diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp</div><div>index 3e4bcbb..6cfeb1b 100644</div><div>--- a/src/compiler/glsl/builtin_functions.cpp</div><div>+++ b/src/compiler/glsl/builtin_functions.cpp</div><div>@@ -3563,9 +3563,13 @@ builtin_builder::_tanh(const glsl_type *type)</div><div>    ir_variable *x = in_var(type, "x");</div><div>    MAKE_SIG(type, v130, 1, x);</div><div> </div><div>+   /* clamp x to [-20, +20] to avoid numeric problems */</div><div>+   ir_variable *t = body.make_temp(type, "tmp");</div><div>+   body.emit(assign(t, min2(max2(x, imm(-20.0f)), imm(20.0f))));</div><div>+</div><div>    /* (e^x - e^(-x)) / (e^x + e^(-x)) */</div><div>-   body.emit(ret(div(sub(exp(x), exp(neg(x))),</div><div>-                     add(exp(x), exp(neg(x))))));</div><div>+   body.emit(ret(div(sub(exp(t), exp(neg(t))),</div><div>+                     add(exp(t), exp(neg(t))))));</div><div> </div><div>    return sig;</div><div> }</div></div><div><br></div><div><br></div><div><br></div></div>