[Mesa-dev] [PATCH] util/format: Generate floating point constants for clamping.

Chris Forbes chrisf at ijw.co.nz
Fri Nov 7 07:12:59 PST 2014


A possible wrinkle here is that 2147483647 isn't exactly representable
as a float (the adjacent floats are 2147483520 and 2147483648). Is the
clamp actually doing the right thing at the top end?

On Sat, Nov 8, 2014 at 3:32 AM,  <jfonseca at vmware.com> wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> This commit causes the generated C code to change as
>
>             union util_format_r32g32b32a32_sscaled pixel;
>   -         pixel.chan.r = (int32_t)CLAMP(src[0], -2147483648, 2147483647);
>   -         pixel.chan.g = (int32_t)CLAMP(src[1], -2147483648, 2147483647);
>   -         pixel.chan.b = (int32_t)CLAMP(src[2], -2147483648, 2147483647);
>   -         pixel.chan.a = (int32_t)CLAMP(src[3], -2147483648, 2147483647);
>   +         pixel.chan.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483647.0f);
>   +         pixel.chan.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483647.0f);
>   +         pixel.chan.b = (int32_t)CLAMP(src[2], -2147483648.0f, 2147483647.0f);
>   +         pixel.chan.a = (int32_t)CLAMP(src[3], -2147483648.0f, 2147483647.0f);
>             memcpy(dst, &pixel, sizeof pixel);
>
> which surprisingly makes a difference for MSVC.
>
> Thanks to Juraj Svec for diagnosing this and drafting a fix.
>
> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29661
>
> Cc: 10.2 10.3 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/auxiliary/util/u_format_pack.py | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_format_pack.py b/src/gallium/auxiliary/util/u_format_pack.py
> index 6ccf04c..90f348e 100644
> --- a/src/gallium/auxiliary/util/u_format_pack.py
> +++ b/src/gallium/auxiliary/util/u_format_pack.py
> @@ -226,9 +226,9 @@ def native_to_constant(type, value):
>      '''Get the value of unity for this type.'''
>      if type.type == FLOAT:
>          if type.size <= 32:
> -            return "%ff" % value
> +            return "%.1ff" % float(value)
>          else:
> -            return "%ff" % value
> +            return "%.1f" % float(value)
>      else:
>          return str(int(value))
>
> @@ -251,8 +251,8 @@ def clamp_expr(src_channel, dst_channel, dst_native_type, value):
>      dst_max = dst_channel.max()
>
>      # Translate the destination range to the src native value
> -    dst_min_native = value_to_native(src_channel, dst_min)
> -    dst_max_native = value_to_native(src_channel, dst_max)
> +    dst_min_native = native_to_constant(src_channel, value_to_native(src_channel, dst_min))
> +    dst_max_native = native_to_constant(src_channel, value_to_native(src_channel, dst_max))
>
>      if src_min < dst_min and src_max > dst_max:
>          return 'CLAMP(%s, %s, %s)' % (value, dst_min_native, dst_max_native)
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list