[Mesa-dev] [PATCH] util: return 0 for NaNs in float_to_ubyte

Brian Paul brianp at vmware.com
Fri Aug 3 03:47:25 UTC 2018


On 08/02/2018 09:36 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
> 
> d3d10 requires NaNs to get converted to 0 for float->unorm conversions
> (and float->int etc.). GL spec probably doesn't care in general, but it
> would make sense to have reasonable behavior in any case imho - the
> old code was converting negative NaNs to 0, and positive NaNs to 255.
> (Note that using float comparison isn't actually all that much more
> effort in any case, at least with sse2 it's just float comparison
> (ucommiss) instead of int one - I converted the second comparison
> to float too simply because it saves the probably somewhat expensive
> transfer of the float from simd to int domain (with sse2 via stack),
> so the generated code actually has 2 less instructions, although float
> comparisons are more expensive than int ones.)
> ---
>   src/gallium/auxiliary/util/u_math.h | 11 +++++------
>   1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h
> index 79869a1..712305c 100644
> --- a/src/gallium/auxiliary/util/u_math.h
> +++ b/src/gallium/auxiliary/util/u_math.h
> @@ -360,7 +360,6 @@ uif(uint32_t ui)
>   
>   /**
>    * Convert ubyte to float in [0, 1].
> - * XXX a 256-entry lookup table would be slightly faster.
>    */
>   static inline float
>   ubyte_to_float(ubyte ub)
> @@ -375,16 +374,16 @@ ubyte_to_float(ubyte ub)
>   static inline ubyte
>   float_to_ubyte(float f)
>   {
> -   union fi tmp;
> -
> -   tmp.f = f;
> -   if (tmp.i < 0) {
> +   /* return 0 for NaN too */
> +   if (!(f > 0.0f)) {
>         return (ubyte) 0;
>      }
> -   else if (tmp.i >= 0x3f800000 /* 1.0f */) {
> +   else if (f >= 1.0f) {
>         return (ubyte) 255;
>      }
>      else {
> +      union fi tmp;
> +      tmp.f = f;
>         tmp.f = tmp.f * (255.0f/256.0f) + 32768.0f;
>         return (ubyte) tmp.i;
>      }
> 

Looks good.

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list