Mesa (master): glsl: rewrite sqrt(x) intrinsic to handle x=0

Brian Paul brianp at kemper.freedesktop.org
Thu Oct 1 19:37:20 UTC 2009


Module: Mesa
Branch: master
Commit: 65765c9f2c5d3568608bde57db0bf44d6b724755
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=65765c9f2c5d3568608bde57db0bf44d6b724755

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Sep 29 18:57:13 2009 -0600

glsl: rewrite sqrt(x) intrinsic to handle x=0

Since sqrt() is basically implemented in terms of RSQ/RCP we'll do a
divide by zero if x=0 and wind up with unpredictable results.
Now use CMP instruction to test for x<=0 and return zero in that case.

---

 .../shader/slang/library/slang_common_builtin.gc   |   76 +++++++++++---------
 1 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/src/mesa/shader/slang/library/slang_common_builtin.gc b/src/mesa/shader/slang/library/slang_common_builtin.gc
index 9764fc2..56de47e 100644
--- a/src/mesa/shader/slang/library/slang_common_builtin.gc
+++ b/src/mesa/shader/slang/library/slang_common_builtin.gc
@@ -602,42 +602,50 @@ vec4 exp2(const vec4 a)
 
 float sqrt(const float x)
 {
+   const float nx = -x;
    float r;
    __asm float_rsq r, x;
-   __asm float_rcp __retVal, r;
-}
-
-vec2 sqrt(const vec2 v)
-{
-   float r;
-   __asm float_rsq r, v.x;
-   __asm float_rcp __retVal.x, r;
-   __asm float_rsq r, v.y;
-   __asm float_rcp __retVal.y, r;
-}
-
-vec3 sqrt(const vec3 v)
-{
-   float r;
-   __asm float_rsq r, v.x;
-   __asm float_rcp __retVal.x, r;
-   __asm float_rsq r, v.y;
-   __asm float_rcp __retVal.y, r;
-   __asm float_rsq r, v.z;
-   __asm float_rcp __retVal.z, r;
-}
-
-vec4 sqrt(const vec4 v)
-{
-   float r;
-   __asm float_rsq r, v.x;
-   __asm float_rcp __retVal.x, r;
-   __asm float_rsq r, v.y;
-   __asm float_rcp __retVal.y, r;
-   __asm float_rsq r, v.z;
-   __asm float_rcp __retVal.z, r;
-   __asm float_rsq r, v.w;
-   __asm float_rcp __retVal.w, r;
+   __asm float_rcp r, r;
+   __asm vec4_cmp __retVal, nx, r, 0.0;
+}
+
+vec2 sqrt(const vec2 x)
+{
+   const vec2 nx = -x, zero = vec2(0.0);
+   vec2 r;
+   __asm float_rsq r.x, x.x;
+   __asm float_rsq r.y, x.y;
+   __asm float_rcp r.x, r.x;
+   __asm float_rcp r.y, r.y;
+   __asm vec4_cmp __retVal, nx, r, zero;
+}
+
+vec3 sqrt(const vec3 x)
+{
+   const vec3 nx = -x, zero = vec3(0.0);
+   vec3 r;
+   __asm float_rsq r.x, x.x;
+   __asm float_rsq r.y, x.y;
+   __asm float_rsq r.z, x.z;
+   __asm float_rcp r.x, r.x;
+   __asm float_rcp r.y, r.y;
+   __asm float_rcp r.z, r.z;
+   __asm vec4_cmp __retVal, nx, r, zero;
+}
+
+vec4 sqrt(const vec4 x)
+{
+   const vec4 nx = -x, zero = vec4(0.0);
+   vec4 r;
+   __asm float_rsq r.x, x.x;
+   __asm float_rsq r.y, x.y;
+   __asm float_rsq r.z, x.z;
+   __asm float_rsq r.w, x.w;
+   __asm float_rcp r.x, r.x;
+   __asm float_rcp r.y, r.y;
+   __asm float_rcp r.z, r.z;
+   __asm float_rcp r.w, r.w;
+   __asm vec4_cmp __retVal, nx, r, zero;
 }
 
 




More information about the mesa-commit mailing list