diff options
Diffstat (limited to 'mesalib/src/gallium')
-rw-r--r-- | mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h | 14 | ||||
-rw-r--r-- | mesalib/src/gallium/auxiliary/util/u_half.h | 12 |
2 files changed, 17 insertions, 9 deletions
diff --git a/mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h b/mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h index b883b318e..57516c39c 100644 --- a/mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h +++ b/mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h @@ -69,10 +69,10 @@ static INLINE unsigned f32_to_uf11(float val) */ uf11 = UF11_MAX_EXPONENT; if (mantissa) { - uf11 |= 1; /* NaN */ + uf11 |= 1; /* NaN */ } else { - if (sign) - uf11 = 0; /* 0.0 */ + if (sign) + uf11 = 0; /* 0.0 */ } } else if (sign) { return 0; @@ -155,14 +155,14 @@ static INLINE unsigned f32_to_uf10(float val) */ uf10 = UF10_MAX_EXPONENT; if (mantissa) { - uf10 |= 1; /* NaN */ + uf10 |= 1; /* NaN */ } else { - if (sign) - uf10 = 0; /* 0.0 */ + if (sign) + uf10 = 0; /* 0.0 */ } } else if (sign) { return 0; - } else if (val > 64512.0f) { /* Overflow - flush to Infinity */ + } else if (val > 64512.0f) { /* From the GL_EXT_packed_float spec: * * "Likewise, finite positive values greater than 64512 (the maximum diff --git a/mesalib/src/gallium/auxiliary/util/u_half.h b/mesalib/src/gallium/auxiliary/util/u_half.h index f7009f548..d340b9a7a 100644 --- a/mesalib/src/gallium/auxiliary/util/u_half.h +++ b/mesalib/src/gallium/auxiliary/util/u_half.h @@ -75,9 +75,17 @@ util_float_to_half(float f) f32.f *= magic.f; f32.ui -= round_mask; - /* Clamp to infinity if overflowed */ + /* + * Clamp to max finite value if overflowed. + * OpenGL has completely undefined rounding behavior for float to + * half-float conversions, and this matches what is mandated for float + * to fp11/fp10, which recommend round-to-nearest-finite too. + * (d3d10 is deeply unhappy about flushing such values to infinity, and + * while it also mandates round-to-zero it doesn't care nearly as much + * about that.) + */ if (f32.ui > f16inf) - f32.ui = f16inf; + f32.ui = f16inf - 1; f16 = f32.ui >> 13; } |