<div dir="ltr">One trivial request:  If we do land this patch, please include a link the the mailing list archives in the commit message so that we can easily track down this discussion if we ever need to in the future.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 6, 2017 at 1:42 AM, Samuel Pitoiset <span dir="ltr"><<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">D3D always computes the absolute value while GLSL says that the<br>
result of inversesqrt() is undefined if x <= 0 (and undefined if<br>
x < 0 for sqrt()). But some apps rely on this specific behaviour<br>
which is not clearly defined by OpenGL.<br>
<br>
Computing the absolute value before sqrt()/inversesqrt() will<br>
prevent that, especially for apps which have been ported from D3D.<br>
Note that closed drivers seem to also use that quirk.<br>
<br>
This gets rid of the NaN values in the "Spec Ops: The Line" game<br>
as well as the black squares with radeonsi. Note that Nouveau is<br>
not affected by this bug because we already take the absolute value<br>
when translating from TGSI to nv50/ir.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=97338" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/<wbr>show_bug.cgi?id=97338</a><br>
<br>
Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.com</a>><br>
---<br>
 src/compiler/glsl/builtin_<wbr>functions.cpp | 22 ++++++++++++++++++++--<br>
 1 file changed, 20 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/compiler/glsl/builtin_<wbr>functions.cpp b/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
index 797af08b6c..f816f2ff7d 100644<br>
--- a/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
+++ b/src/compiler/glsl/builtin_<wbr>functions.cpp<br>
@@ -3623,12 +3623,30 @@ builtin_builder::_pow(const glsl_type *type)<br>
    return binop(always_available, ir_binop_pow, type, type, type);<br>
 }<br>
<br>
+ir_function_signature *<br>
+builtin_builder::_sqrt(<wbr>builtin_available_predicate avail,<br>
+                       const glsl_type *type)<br>
+{<br>
+   ir_variable *x = in_var(type, "x");<br>
+   MAKE_SIG(type, avail, 1, x);<br>
+   body.emit(ret(expr(ir_unop_<wbr>sqrt, abs(x))));<br>
+   return sig;<br>
+}<br>
+<br>
+ir_function_signature *<br>
+builtin_builder::_<wbr>inversesqrt(builtin_available_<wbr>predicate avail,<br>
+                              const glsl_type *type)<br>
+{<br>
+   ir_variable *x = in_var(type, "x");<br>
+   MAKE_SIG(type, avail, 1, x);<br>
+   body.emit(ret(expr(ir_unop_<wbr>rsq, abs(x))));<br>
+   return sig;<br>
+}<br>
+<br>
 UNOP(exp,         ir_unop_exp,  always_available)<br>
 UNOP(log,         ir_unop_log,  always_available)<br>
 UNOP(exp2,        ir_unop_exp2, always_available)<br>
 UNOP(log2,        ir_unop_log2, always_available)<br>
-UNOPA(sqrt,        ir_unop_sqrt)<br>
-UNOPA(inversesqrt, ir_unop_rsq)<br>
<br>
 /** @} */<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.11.0<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>