u_format: Fix -NaN handling for packing of 10F_11F_11F_REV to match GL specs.
authorEric Anholt <eric@anholt.net>
Wed, 26 Oct 2011 23:23:50 +0000 (16:23 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 28 Oct 2011 19:10:01 +0000 (12:10 -0700)
Fixes the remainder of piglit GL_EXT_packed_float/pack.c

Reviewed-by: Marek Ol ák <maraeo@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/gallium/auxiliary/util/u_format_r11g11b10f.h

index 000a5c25bfca71c8bf3e4421b40f014cb44c55f7..6bb4302965a69b2895fb0e7aff32341717b6423b 100644 (file)
@@ -60,13 +60,23 @@ static INLINE unsigned f32_to_uf11(float val)
    int exponent = ((f32.ui >> 23) & 0xff) - 127;
    int mantissa = f32.ui & 0x007fffff;
 
-   if (sign) return 0;
-
    if (exponent == 128) { /* Infinity or NaN */
+      /* From the GL_EXT_packed_float spec:
+       *
+       *     "Additionally: negative infinity is converted to zero; positive
+       *      infinity is converted to positive infinity; and both positive and
+       *      negative NaN are converted to positive NaN."
+       */
       uf11 = UF11_MAX_EXPONENT;
-      if (mantissa) uf11 |= (mantissa & UF11_MANTISSA_BITS);
-   }
-   else if (val > 65024.0f) {
+      if (mantissa) {
+        uf11 |= 1; /* NaN */
+      } else {
+        if (sign)
+           uf11 = 0; /* 0.0 */
+      }
+   } else if (sign) {
+      return 0;
+   } else if (val > 65024.0f) {
       /* From the GL_EXT_packed_float spec:
        *
        *     "Likewise, finite positive values greater than 65024 (the maximum
@@ -136,13 +146,23 @@ static INLINE unsigned f32_to_uf10(float val)
    int exponent = ((f32.ui >> 23) & 0xff) - 127;
    int mantissa = f32.ui & 0x007fffff;
 
-   if (sign) return 0;
-
-   if (exponent == 128) { /* Infinity or NaN */
+   if (exponent == 128) {
+      /* From the GL_EXT_packed_float spec:
+       *
+       *     "Additionally: negative infinity is converted to zero; positive
+       *      infinity is converted to positive infinity; and both positive and
+       *      negative NaN are converted to positive NaN."
+       */
       uf10 = UF10_MAX_EXPONENT;
-      if (mantissa) uf10 |= (mantissa & UF10_MANTISSA_BITS);
-   }
-   else if (val > 64512.0f) { /* Overflow - flush to Infinity */
+      if (mantissa) {
+        uf10 |= 1; /* NaN */
+      } else {
+        if (sign)
+           uf10 = 0; /* 0.0 */
+      }
+   } else if (sign) {
+      return 0;
+   } else if (val > 64512.0f) { /* Overflow - flush to Infinity */
       /* From the GL_EXT_packed_float spec:
        *
        *     "Likewise, finite positive values greater than 64512 (the maximum