glsl: Add isinf() and isnan() builtins.
authorPaul Berry <stereotype441@gmail.com>
Thu, 6 Oct 2011 17:20:10 +0000 (10:20 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 31 Oct 2011 18:24:03 +0000 (11:24 -0700)
The implementations are as follows:

isinf(x) = (abs(x) == +infinity)
isnan(x) = (x != x)

Note: the latter formula is not necessarily obvious.  It works because
NaN is the only floating point number that does not equal itself.

Fixes piglit tests "isinf-and-isnan fs_basic" and "isinf-and-isnan
vs_basic".

src/glsl/builtins/ir/isinf.ir [new file with mode: 0644]
src/glsl/builtins/ir/isnan.ir [new file with mode: 0644]
src/glsl/builtins/profiles/130.frag
src/glsl/builtins/profiles/130.vert

diff --git a/src/glsl/builtins/ir/isinf.ir b/src/glsl/builtins/ir/isinf.ir
new file mode 100644 (file)
index 0000000..92922f6
--- /dev/null
@@ -0,0 +1,17 @@
+((function isinf
+   (signature bool
+     (parameters
+       (declare (in) float x))
+     ((return (expression bool == (expression float abs (var_ref x)) (constant float (+INF))))))
+   (signature bvec2
+     (parameters
+       (declare (in) vec2 x))
+     ((return (expression bvec2 == (expression vec2 abs (var_ref x)) (constant vec2 (+INF +INF))))))
+   (signature bvec3
+     (parameters
+       (declare (in) vec3 x))
+     ((return (expression bvec3 == (expression vec3 abs (var_ref x)) (constant vec3 (+INF +INF +INF))))))
+   (signature bvec4
+     (parameters
+       (declare (in) vec4 x))
+     ((return (expression bvec4 == (expression vec4 abs (var_ref x)) (constant vec4 (+INF +INF +INF +INF))))))))
diff --git a/src/glsl/builtins/ir/isnan.ir b/src/glsl/builtins/ir/isnan.ir
new file mode 100644 (file)
index 0000000..b67349f
--- /dev/null
@@ -0,0 +1,17 @@
+((function isnan
+   (signature bool
+     (parameters
+       (declare (in) float x))
+     ((return (expression bool != (var_ref x) (var_ref x)))))
+   (signature bvec2
+     (parameters
+       (declare (in) vec2 x))
+     ((return (expression bvec2 != (var_ref x) (var_ref x)))))
+   (signature bvec3
+     (parameters
+       (declare (in) vec3 x))
+     ((return (expression bvec3 != (var_ref x) (var_ref x)))))
+   (signature bvec4
+     (parameters
+       (declare (in) vec4 x))
+     ((return (expression bvec4 != (var_ref x) (var_ref x)))))))
index c121859f14ca5de9bdd5952698b0027827bfacb6..1f212c16d673d91674ea200574a95a2ebf308e07 100644 (file)
@@ -288,7 +288,6 @@ vec2  smoothstep(float edge0, float edge1, vec2  x);
 vec3  smoothstep(float edge0, float edge1, vec3  x);
 vec4  smoothstep(float edge0, float edge1, vec4  x);
 
-#if 0
 bool  isnan(float x);
 bvec2 isnan(vec2  x);
 bvec3 isnan(vec3  x);
@@ -298,7 +297,6 @@ bool  isinf(float x);
 bvec2 isinf(vec2  x);
 bvec3 isinf(vec3  x);
 bvec4 isinf(vec4  x);
-#endif
 
 /*
  * 8.4 - Geometric Functions
index ebd9a50885187c84804637a54968a209909c4505..df17ede3e805aca6dfd2e20b542f59b72495d314 100644 (file)
@@ -288,7 +288,6 @@ vec2  smoothstep(float edge0, float edge1, vec2  x);
 vec3  smoothstep(float edge0, float edge1, vec3  x);
 vec4  smoothstep(float edge0, float edge1, vec4  x);
 
-#if 0
 bool  isnan(float x);
 bvec2 isnan(vec2  x);
 bvec3 isnan(vec3  x);
@@ -298,7 +297,6 @@ bool  isinf(float x);
 bvec2 isinf(vec2  x);
 bvec3 isinf(vec3  x);
 bvec4 isinf(vec4  x);
-#endif
 
 /*
  * 8.4 - Geometric Functions