On Thursday, December 11, 2014 12:03:19 PM Jason Ekstrand wrote: > I may have brought this up before (I'm starting to not remember things) but > shouldn't we also be clamping float-to-integer as well?
Yes, I will do that together with deleting patch 24 as we need a similar function. Sam > --Jason > > On Tue, Dec 9, 2014 at 4:06 AM, Iago Toral Quiroga <ito...@igalia.com> > > wrote: > > From: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > > > Fix various conversion paths that involved integer data types of different > > sizes (uint16_t to uint8_t, int16_t to uint8_t, etc) that were not > > being clamped properly. > > > > Also, one of the paths was incorrectly assigning the value 12, instead of > > 1, > > to the constant "one". > > > > v2: > > - Create auxiliary clamping functions and use them in all paths that > > > > required clamp because of different source and destination sizes > > and signed-unsigned conversions. > > > > v3: > > - Create MIN_INT macro and use it. > > > > Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > --- > > > > src/mesa/main/format_utils.c | 47 > > > > ++++++++++++++++++++++---------------------- > > > > src/mesa/main/format_utils.h | 26 ++++++++++++++++++++++++ > > 2 files changed, 49 insertions(+), 24 deletions(-) > > > > diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c > > index 41fd043..dc63e1f 100644 > > --- a/src/mesa/main/format_utils.c > > +++ b/src/mesa/main/format_utils.c > > @@ -449,7 +449,6 @@ convert_half_float(void *void_dst, int > > num_dst_channels, > > > > } > > > > } > > > > - > > > > static void > > convert_ubyte(void *void_dst, int num_dst_channels, > > > > const void *void_src, GLenum src_type, int > > num_src_channels, > > > > @@ -469,7 +468,7 @@ convert_ubyte(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, uint16_t, _mesa_half_to_unorm(src, 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_uint(src)); > > + SWIZZLE_CONVERT(uint8_t, uint16_t, > > _mesa_unsigned_to_unsigned(half_to_uint(src), 8)); > > > > } > > break; > > > > case GL_UNSIGNED_BYTE: > > @@ -479,35 +478,35 @@ convert_ubyte(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, int8_t, _mesa_snorm_to_unorm(src, 8, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, int8_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint8_t, int8_t, _mesa_signed_to_unsigned(src, > > 8)); > > > > } > > break; > > > > case GL_UNSIGNED_SHORT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, uint16_t, _mesa_unorm_to_unorm(src, 16, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, uint16_t, src); > > + SWIZZLE_CONVERT(uint8_t, uint16_t, > > _mesa_unsigned_to_unsigned(src, 8)); > > > > } > > break; > > > > case GL_SHORT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, int16_t, _mesa_snorm_to_unorm(src, 16, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, int16_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint8_t, int16_t, _mesa_signed_to_unsigned(src, > > 8)); > > > > } > > break; > > > > case GL_UNSIGNED_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, uint32_t, _mesa_unorm_to_unorm(src, 32, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, uint32_t, src); > > + SWIZZLE_CONVERT(uint8_t, uint32_t, > > _mesa_unsigned_to_unsigned(src, 8)); > > > > } > > break; > > > > case GL_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint8_t, int32_t, _mesa_snorm_to_unorm(src, 32, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint8_t, int32_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint8_t, int32_t, _mesa_signed_to_unsigned(src, > > 8)); > > > > } > > break; > > > > default: > > @@ -542,7 +541,7 @@ convert_byte(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(int8_t, uint8_t, _mesa_unorm_to_snorm(src, 8, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(int8_t, uint8_t, src); > > + SWIZZLE_CONVERT(int8_t, uint8_t, _mesa_unsigned_to_signed(src, > > 8)); > > > > } > > break; > > > > case GL_BYTE: > > @@ -552,28 +551,28 @@ convert_byte(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(int8_t, uint16_t, _mesa_unorm_to_snorm(src, 16, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(int8_t, uint16_t, src); > > + SWIZZLE_CONVERT(int8_t, uint16_t, _mesa_unsigned_to_signed(src, > > 8)); > > > > } > > break; > > > > case GL_SHORT: > > if (normalized) { > > > > SWIZZLE_CONVERT(int8_t, int16_t, _mesa_snorm_to_snorm(src, 16, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(int8_t, int16_t, src); > > + SWIZZLE_CONVERT(int8_t, int16_t, _mesa_signed_to_signed(src, > > 8)); > > > > } > > break; > > > > case GL_UNSIGNED_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(int8_t, uint32_t, _mesa_unorm_to_snorm(src, 32, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(int8_t, uint32_t, src); > > + SWIZZLE_CONVERT(int8_t, uint32_t, _mesa_unsigned_to_signed(src, > > 8)); > > > > } > > break; > > > > case GL_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(int8_t, int32_t, _mesa_snorm_to_snorm(src, 32, > > > > 8)); > > > > } else { > > > > - SWIZZLE_CONVERT(int8_t, int32_t, src); > > + SWIZZLE_CONVERT(int8_t, int32_t, _mesa_signed_to_signed(src, > > 8)); > > > > } > > break; > > > > default: > > @@ -615,7 +614,7 @@ convert_ushort(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint16_t, int8_t, _mesa_snorm_to_unorm(src, 8, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint16_t, int8_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint16_t, int8_t, _mesa_signed_to_unsigned(src, > > 16)); > > > > } > > break; > > > > case GL_UNSIGNED_SHORT: > > @@ -625,21 +624,21 @@ convert_ushort(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint16_t, int16_t, _mesa_snorm_to_unorm(src, 16, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint16_t, int16_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint16_t, int16_t, _mesa_signed_to_unsigned(src, > > 16)); > > > > } > > break; > > > > case GL_UNSIGNED_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint16_t, uint32_t, _mesa_unorm_to_unorm(src, > > > > 32, 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint16_t, uint32_t, src); > > + SWIZZLE_CONVERT(uint16_t, uint32_t, > > _mesa_unsigned_to_unsigned(src, 16)); > > > > } > > break; > > > > case GL_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(uint16_t, int32_t, _mesa_snorm_to_unorm(src, 32, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint16_t, int32_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint16_t, int32_t, _mesa_signed_to_unsigned(src, > > 16)); > > > > } > > break; > > > > default: > > @@ -688,7 +687,7 @@ convert_short(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(int16_t, uint16_t, _mesa_unorm_to_snorm(src, 16, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(int16_t, uint16_t, src); > > + SWIZZLE_CONVERT(int16_t, uint16_t, _mesa_unsigned_to_signed(src, > > 16)); > > > > } > > break; > > > > case GL_SHORT: > > @@ -698,14 +697,14 @@ convert_short(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(int16_t, uint32_t, _mesa_unorm_to_snorm(src, 32, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(int16_t, uint32_t, src); > > + SWIZZLE_CONVERT(int16_t, uint32_t, _mesa_unsigned_to_signed(src, > > 16)); > > > > } > > break; > > > > case GL_INT: > > if (normalized) { > > > > SWIZZLE_CONVERT(int16_t, int32_t, _mesa_snorm_to_snorm(src, 32, > > > > 16)); > > > > } else { > > > > - SWIZZLE_CONVERT(int16_t, int32_t, src); > > + SWIZZLE_CONVERT(int16_t, int32_t, _mesa_signed_to_signed(src, > > 16)); > > > > } > > break; > > > > default: > > @@ -746,7 +745,7 @@ convert_uint(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint32_t, int8_t, _mesa_snorm_to_unorm(src, 8, > > > > 32)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint32_t, int8_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint32_t, int8_t, _mesa_signed_to_unsigned(src, > > 32)); > > > > } > > break; > > > > case GL_UNSIGNED_SHORT: > > @@ -760,7 +759,7 @@ convert_uint(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint32_t, int16_t, _mesa_snorm_to_unorm(src, 16, > > > > 32)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint32_t, int16_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint32_t, int16_t, _mesa_signed_to_unsigned(src, > > 32)); > > > > } > > break; > > > > case GL_UNSIGNED_INT: > > @@ -770,7 +769,7 @@ convert_uint(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(uint32_t, int32_t, _mesa_snorm_to_unorm(src, 32, > > > > 32)); > > > > } else { > > > > - SWIZZLE_CONVERT(uint32_t, int32_t, (src < 0) ? 0 : src); > > + SWIZZLE_CONVERT(uint32_t, int32_t, _mesa_signed_to_unsigned(src, > > 32)); > > > > } > > break; > > > > default: > > @@ -784,7 +783,7 @@ convert_int(void *void_dst, int num_dst_channels, > > > > const void *void_src, GLenum src_type, int num_src_channels, > > const uint8_t swizzle[4], bool normalized, int count) > > > > { > > > > - const int32_t one = normalized ? INT32_MAX : 12; > > + const int32_t one = normalized ? INT32_MAX : 1; > > > > switch (src_type) { > > > > case GL_FLOAT: > > @@ -833,7 +832,7 @@ convert_int(void *void_dst, int num_dst_channels, > > > > if (normalized) { > > > > SWIZZLE_CONVERT(int32_t, uint32_t, _mesa_unorm_to_snorm(src, 32, > > > > 32)); > > > > } else { > > > > - SWIZZLE_CONVERT(int32_t, uint32_t, src); > > + SWIZZLE_CONVERT(int32_t, uint32_t, _mesa_unsigned_to_signed(src, > > 32)); > > > > } > > break; > > > > case GL_INT: > > diff --git a/src/mesa/main/format_utils.h b/src/mesa/main/format_utils.h > > index df53edf..fb00f55 100644 > > --- a/src/mesa/main/format_utils.h > > +++ b/src/mesa/main/format_utils.h > > @@ -32,10 +32,12 @@ > > > > #define FORMAT_UTILS_H > > > > #include "imports.h" > > > > +#include "macros.h" > > > > /* Only guaranteed to work for BITS <= 32 */ > > #define MAX_UINT(BITS) ((BITS) == 32 ? UINT32_MAX : ((1u << (BITS)) - 1)) > > #define MAX_INT(BITS) ((int)MAX_UINT((BITS) - 1)) > > > > +#define MIN_INT(BITS) ((BITS) == 32 ? INT32_MIN : (-(1 << (BITS - 1)))) > > > > /* Extends an integer of size SRC_BITS to one of size DST_BITS linearly > > */ > > #define EXTEND_NORMALIZED_INT(X, SRC_BITS, DST_BITS) \ > > > > @@ -138,6 +140,30 @@ _mesa_snorm_to_snorm(int x, unsigned src_bits, > > unsigned dst_bits) > > > > return x >> (src_bits - dst_bits); > > > > } > > > > +static inline unsigned > > +_mesa_unsigned_to_unsigned(unsigned src, unsigned dst_size) > > +{ > > + return MIN2(src, MAX_UINT(dst_size)); > > +} > > + > > +static inline int > > +_mesa_unsigned_to_signed(unsigned src, unsigned dst_size) > > +{ > > + return MIN2(src, MAX_INT(dst_size)); > > +} > > + > > +static inline int > > +_mesa_signed_to_signed(int src, unsigned dst_size) > > +{ > > + return CLAMP(src, MIN_INT(dst_size), MAX_INT(dst_size)); > > +} > > + > > +static inline unsigned > > +_mesa_signed_to_unsigned(int src, unsigned dst_size) > > +{ > > + return CLAMP(src, 0, MAX_UINT(dst_size)); > > +} > > + > > > > bool > > _mesa_format_to_array(mesa_format, GLenum *type, int *num_components, > > > > uint8_t swizzle[4], bool *normalized); > > > > -- > > 1.9.1 > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev