aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/gallium/auxiliary
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2013-07-29 08:50:02 +0200
committermarha <marha@users.sourceforge.net>2013-07-29 08:50:02 +0200
commit4c8cee9b5a37db30af50aafcbf54b36b9fd9e03a (patch)
tree30b754ce6f4bb714f948a1bcec554335d402e42b /mesalib/src/gallium/auxiliary
parent8647aa1a5029fcd96f134103331ddf3c21bc0a0b (diff)
downloadvcxsrv-4c8cee9b5a37db30af50aafcbf54b36b9fd9e03a.tar.gz
vcxsrv-4c8cee9b5a37db30af50aafcbf54b36b9fd9e03a.tar.bz2
vcxsrv-4c8cee9b5a37db30af50aafcbf54b36b9fd9e03a.zip
libX11 mesa xserver git update 29 July 2013
xserver commit ff38bbe81ace85bf675bbaa0a9ca5f3b32ede449 libX11 commit 208e586c808e88a2ee819e4450dc27f557afc2bf mesa commit e847b5ae066bf9a209dad482fcc664f944983633
Diffstat (limited to 'mesalib/src/gallium/auxiliary')
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_format_r11g11b10f.h14
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_half.h12
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;
}