Re: [Mesa-dev] [PATCH 06/20] mesa: Fix _mesa_swizzle_and_convert integer conversions to clamp properly

2014-11-19 Thread Samuel Iglesias Gonsálvez
On Tue, 2014-11-18 at 10:34 -0800, Jason Ekstrand wrote:
> In general, I like this patch.  However, if we are going to claim to
> follow the GL rule of "Colors are clampped to their representable
> range, then there still seem to be quite a few cases missing.  For
> instance, when going from signed to unsigned 8-bit formats, we should
> should take a min with 0 and when converting from unsigned to signed,
> we should take a max with 0x7f.  Maybe we need to add integer helper
> functions like we have for the normalized ones and use those just to
> make sure we don't miss anything.
> 

OK, I'll do that for the second version.

Thanks!

Sam

> --Jason
> 
> 
> On Tue, Nov 18, 2014 at 12:43 AM, Iago Toral Quiroga
>  wrote:
> From: Samuel Iglesias Gonsalvez 
> 
> 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".
> 
> Signed-off-by: Samuel Iglesias Gonsalvez
> 
> ---
>  src/mesa/main/format_utils.c | 33
> +
>  1 file changed, 17 insertions(+), 16 deletions(-)
> 
> diff --git a/src/mesa/main/format_utils.c
> b/src/mesa/main/format_utils.c
> index b6d0fbc..8040173 100644
> --- a/src/mesa/main/format_utils.c
> +++ b/src/mesa/main/format_utils.c
> @@ -24,6 +24,7 @@
> 
>  #include "format_utils.h"
>  #include "glformats.h"
> +#include "macros.h"
> 
>  static const uint8_t map_identity[7] = { 0, 1, 2, 3, 4, 5,
> 6 };
>  static const uint8_t map_3210[7] = { 3, 2, 1, 0, 4, 5, 6 };
> @@ -593,28 +594,28 @@ convert_ubyte(void *void_dst, int
> num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, uint16_t,
> unorm_to_unorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, uint16_t, src);
> + SWIZZLE_CONVERT(uint8_t, uint16_t, MIN2(src, 0xff));
>}
>break;
> case GL_SHORT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, int16_t,
> snorm_to_unorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, int16_t, (src < 0) ? 0 :
> src);
> + SWIZZLE_CONVERT(uint8_t, int16_t, CLAMP(src, 0,
> 0xff));
>}
>break;
> case GL_UNSIGNED_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, uint32_t,
> unorm_to_unorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, uint32_t, src);
> + SWIZZLE_CONVERT(uint8_t, uint32_t, MIN2(src, 0xff));
>}
>break;
> case GL_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, int32_t,
> snorm_to_unorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, int32_t, (src < 0) ? 0 :
> src);
> + SWIZZLE_CONVERT(uint8_t, int32_t, CLAMP(src, 0,
> 0xff));
>}
>break;
> default:
> @@ -649,7 +650,7 @@ convert_byte(void *void_dst, int
> num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint8_t, unorm_to_snorm(src,
> 8, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, uint8_t, src);
> + SWIZZLE_CONVERT(int8_t, uint8_t, MIN2(src, 0x7f));
>}
>break;
> case GL_BYTE:
> @@ -659,28 +660,28 @@ convert_byte(void *void_dst, int
> num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint16_t,
> unorm_to_snorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, uint16_t, src);
> + SWIZZLE_CONVERT(int8_t, uint16_t, MIN2(src, 0x7f));
>}
>break;
> case GL_SHORT:
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, int16_t, snorm_to_snorm(src,
> 16, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, int16_t, src);
> + SWIZZLE_CONVERT(int8_t, int16_t, CLAMP(src, -0x80,
> 0x7f));
>}
>break;
> case GL_UNSIGNED_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint32_t,
> unorm_to_snorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(int8_

Re: [Mesa-dev] [PATCH 06/20] mesa: Fix _mesa_swizzle_and_convert integer conversions to clamp properly

2014-11-18 Thread Jason Ekstrand
In general, I like this patch.  However, if we are going to claim to follow
the GL rule of "Colors are clampped to their representable range, then
there still seem to be quite a few cases missing.  For instance, when going
from signed to unsigned 8-bit formats, we should should take a min with 0
and when converting from unsigned to signed, we should take a max with
0x7f.  Maybe we need to add integer helper functions like we have for the
normalized ones and use those just to make sure we don't miss anything.
--Jason


On Tue, Nov 18, 2014 at 12:43 AM, Iago Toral Quiroga 
wrote:

> From: Samuel Iglesias Gonsalvez 
>
> 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".
>
> Signed-off-by: Samuel Iglesias Gonsalvez 
> ---
>  src/mesa/main/format_utils.c | 33 +
>  1 file changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c
> index b6d0fbc..8040173 100644
> --- a/src/mesa/main/format_utils.c
> +++ b/src/mesa/main/format_utils.c
> @@ -24,6 +24,7 @@
>
>  #include "format_utils.h"
>  #include "glformats.h"
> +#include "macros.h"
>
>  static const uint8_t map_identity[7] = { 0, 1, 2, 3, 4, 5, 6 };
>  static const uint8_t map_3210[7] = { 3, 2, 1, 0, 4, 5, 6 };
> @@ -593,28 +594,28 @@ convert_ubyte(void *void_dst, int num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, uint16_t, unorm_to_unorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, uint16_t, src);
> + SWIZZLE_CONVERT(uint8_t, uint16_t, MIN2(src, 0xff));
>}
>break;
> case GL_SHORT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, int16_t, snorm_to_unorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, int16_t, (src < 0) ? 0 : src);
> + SWIZZLE_CONVERT(uint8_t, int16_t, CLAMP(src, 0, 0xff));
>}
>break;
> case GL_UNSIGNED_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, uint32_t, unorm_to_unorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, uint32_t, src);
> + SWIZZLE_CONVERT(uint8_t, uint32_t, MIN2(src, 0xff));
>}
>break;
> case GL_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint8_t, int32_t, snorm_to_unorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(uint8_t, int32_t, (src < 0) ? 0 : src);
> + SWIZZLE_CONVERT(uint8_t, int32_t, CLAMP(src, 0, 0xff));
>}
>break;
> default:
> @@ -649,7 +650,7 @@ convert_byte(void *void_dst, int num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint8_t, unorm_to_snorm(src, 8, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, uint8_t, src);
> + SWIZZLE_CONVERT(int8_t, uint8_t, MIN2(src, 0x7f));
>}
>break;
> case GL_BYTE:
> @@ -659,28 +660,28 @@ convert_byte(void *void_dst, int num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint16_t, unorm_to_snorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, uint16_t, src);
> + SWIZZLE_CONVERT(int8_t, uint16_t, MIN2(src, 0x7f));
>}
>break;
> case GL_SHORT:
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, int16_t, snorm_to_snorm(src, 16, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, int16_t, src);
> + SWIZZLE_CONVERT(int8_t, int16_t, CLAMP(src, -0x80, 0x7f));
>}
>break;
> case GL_UNSIGNED_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, uint32_t, unorm_to_snorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, uint32_t, src);
> + SWIZZLE_CONVERT(int8_t, uint32_t, MIN2(src, 0x7f));
>}
>break;
> case GL_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(int8_t, int32_t, snorm_to_snorm(src, 32, 8));
>} else {
> - SWIZZLE_CONVERT(int8_t, int32_t, src);
> + SWIZZLE_CONVERT(int8_t, int32_t, CLAMP(src, -0x80, 0x7f));
>}
>break;
> default:
> @@ -739,14 +740,14 @@ convert_ushort(void *void_dst, int num_dst_channels,
>if (normalized) {
>   SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_unorm(src, 32, 16));
>} else {
> - SWIZZLE_CONVERT(uint16_t, uint32_t, src);
> + SWIZZLE_CONVERT(uint16_t, uint32_t, MIN2(src, 0x));
>}
>break;
> case GL_INT:
>if (normalized) {
>   SWIZZLE_CONVERT(uint16_t, int32_t, snorm_to_unorm(src, 32, 16));
>} else {
> - SWIZZLE_CONVERT(uint16_t, int32_t, (src < 0) ? 0 : src);
> + SWIZZLE_CONVERT(uint16_t, int32_t,  CLAMP(src, 0, 0x));
>}
>break;
> default:
> @

[Mesa-dev] [PATCH 06/20] mesa: Fix _mesa_swizzle_and_convert integer conversions to clamp properly

2014-11-18 Thread Iago Toral Quiroga
From: Samuel Iglesias Gonsalvez 

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".

Signed-off-by: Samuel Iglesias Gonsalvez 
---
 src/mesa/main/format_utils.c | 33 +
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c
index b6d0fbc..8040173 100644
--- a/src/mesa/main/format_utils.c
+++ b/src/mesa/main/format_utils.c
@@ -24,6 +24,7 @@
 
 #include "format_utils.h"
 #include "glformats.h"
+#include "macros.h"
 
 static const uint8_t map_identity[7] = { 0, 1, 2, 3, 4, 5, 6 };
 static const uint8_t map_3210[7] = { 3, 2, 1, 0, 4, 5, 6 };
@@ -593,28 +594,28 @@ convert_ubyte(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(uint8_t, uint16_t, unorm_to_unorm(src, 16, 8));
   } else {
- SWIZZLE_CONVERT(uint8_t, uint16_t, src);
+ SWIZZLE_CONVERT(uint8_t, uint16_t, MIN2(src, 0xff));
   }
   break;
case GL_SHORT:
   if (normalized) {
  SWIZZLE_CONVERT(uint8_t, int16_t, snorm_to_unorm(src, 16, 8));
   } else {
- SWIZZLE_CONVERT(uint8_t, int16_t, (src < 0) ? 0 : src);
+ SWIZZLE_CONVERT(uint8_t, int16_t, CLAMP(src, 0, 0xff));
   }
   break;
case GL_UNSIGNED_INT:
   if (normalized) {
  SWIZZLE_CONVERT(uint8_t, uint32_t, unorm_to_unorm(src, 32, 8));
   } else {
- SWIZZLE_CONVERT(uint8_t, uint32_t, src);
+ SWIZZLE_CONVERT(uint8_t, uint32_t, MIN2(src, 0xff));
   }
   break;
case GL_INT:
   if (normalized) {
  SWIZZLE_CONVERT(uint8_t, int32_t, snorm_to_unorm(src, 32, 8));
   } else {
- SWIZZLE_CONVERT(uint8_t, int32_t, (src < 0) ? 0 : src);
+ SWIZZLE_CONVERT(uint8_t, int32_t, CLAMP(src, 0, 0xff));
   }
   break;
default:
@@ -649,7 +650,7 @@ convert_byte(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(int8_t, uint8_t, unorm_to_snorm(src, 8, 8));
   } else {
- SWIZZLE_CONVERT(int8_t, uint8_t, src);
+ SWIZZLE_CONVERT(int8_t, uint8_t, MIN2(src, 0x7f));
   }
   break;
case GL_BYTE:
@@ -659,28 +660,28 @@ convert_byte(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(int8_t, uint16_t, unorm_to_snorm(src, 16, 8));
   } else {
- SWIZZLE_CONVERT(int8_t, uint16_t, src);
+ SWIZZLE_CONVERT(int8_t, uint16_t, MIN2(src, 0x7f));
   }
   break;
case GL_SHORT:
   if (normalized) {
  SWIZZLE_CONVERT(int8_t, int16_t, snorm_to_snorm(src, 16, 8));
   } else {
- SWIZZLE_CONVERT(int8_t, int16_t, src);
+ SWIZZLE_CONVERT(int8_t, int16_t, CLAMP(src, -0x80, 0x7f));
   }
   break;
case GL_UNSIGNED_INT:
   if (normalized) {
  SWIZZLE_CONVERT(int8_t, uint32_t, unorm_to_snorm(src, 32, 8));
   } else {
- SWIZZLE_CONVERT(int8_t, uint32_t, src);
+ SWIZZLE_CONVERT(int8_t, uint32_t, MIN2(src, 0x7f));
   }
   break;
case GL_INT:
   if (normalized) {
  SWIZZLE_CONVERT(int8_t, int32_t, snorm_to_snorm(src, 32, 8));
   } else {
- SWIZZLE_CONVERT(int8_t, int32_t, src);
+ SWIZZLE_CONVERT(int8_t, int32_t, CLAMP(src, -0x80, 0x7f));
   }
   break;
default:
@@ -739,14 +740,14 @@ convert_ushort(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_unorm(src, 32, 16));
   } else {
- SWIZZLE_CONVERT(uint16_t, uint32_t, src);
+ SWIZZLE_CONVERT(uint16_t, uint32_t, MIN2(src, 0x));
   }
   break;
case GL_INT:
   if (normalized) {
  SWIZZLE_CONVERT(uint16_t, int32_t, snorm_to_unorm(src, 32, 16));
   } else {
- SWIZZLE_CONVERT(uint16_t, int32_t, (src < 0) ? 0 : src);
+ SWIZZLE_CONVERT(uint16_t, int32_t,  CLAMP(src, 0, 0x));
   }
   break;
default:
@@ -795,7 +796,7 @@ convert_short(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(int16_t, uint16_t, unorm_to_snorm(src, 16, 16));
   } else {
- SWIZZLE_CONVERT(int16_t, uint16_t, src);
+ SWIZZLE_CONVERT(int16_t, uint16_t, (src < 0) ? 0 : src);
   }
   break;
case GL_SHORT:
@@ -805,14 +806,14 @@ convert_short(void *void_dst, int num_dst_channels,
   if (normalized) {
  SWIZZLE_CONVERT(int16_t, uint32_t, unorm_to_snorm(src, 32, 16));
   } else {
- SWIZZLE_CONVERT(int16_t, uint32_t, src);
+ SWIZZLE_CONVERT(int16_t, uint32_t, MIN2(src, 0x7fff));
   }
   break;
case GL_INT:
   if (normalized) {
  SWIZZLE_CONVERT(int16_t, int32_t, snorm_to_snorm(src, 32, 16));
   } else {
-