[Mesa-dev] [PATCH 1/2] mesa: break up _mesa_swizzle_and_convert() to reduce compile time
Jason Ekstrand
jason at jlekstrand.net
Fri Sep 12 14:58:15 PDT 2014
Ok, so I actually applied the patch and benchmarked it. It seems to have
improved performance in a lot of cases that were mysteriously slow! It
looks like breaking it up freed up GCC to optimize the inside better.
--Jason
On Fri, Sep 12, 2014 at 2:48 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:
> One comment below. Otherwise, both of these look good to me.
>
> Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
>
> I haven't applied it and benchmarked it myself, but I don't see anything
> that would hurt performance.
> --Jason
>
> On Fri, Sep 12, 2014 at 9:17 AM, Brian Paul <brianp at vmware.com> wrote:
>
>> This reduces gcc -O3 compile time to 1/4 of what it was on my system.
>> Reduces MSVC release build time too.
>> ---
>> src/mesa/main/format_utils.c | 1030
>> ++++++++++++++++++++++--------------------
>> 1 file changed, 550 insertions(+), 480 deletions(-)
>>
>> diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c
>> index 240e3bc..29d779a 100644
>> --- a/src/mesa/main/format_utils.c
>> +++ b/src/mesa/main/format_utils.c
>> @@ -352,9 +352,14 @@ swizzle_convert_try_memcpy(void *dst, GLenum
>> dst_type, int num_dst_channels,
>> */
>> #define SWIZZLE_CONVERT(DST_TYPE, SRC_TYPE, CONV) \
>> do { \
>> + const uint8_t swizzle_x = swizzle[0]; \
>> + const uint8_t swizzle_y = swizzle[1]; \
>> + const uint8_t swizzle_z = swizzle[2]; \
>> + const uint8_t swizzle_w = swizzle[3]; \
>>
>
> Is there a reason you got rid of the "register" qualifiers? I'm not 100%
> sure they were needed in the first place, but I was wondering if you had a
> reason.
>
>
>> const SRC_TYPE *typed_src = void_src; \
>> DST_TYPE *typed_dst = void_dst; \
>> DST_TYPE tmp[7]; \
>> + int s, j; \
>> tmp[4] = 0; \
>> tmp[5] = one; \
>> switch (num_dst_channels) { \
>> @@ -423,7 +428,527 @@ swizzle_convert_try_memcpy(void *dst, GLenum
>> dst_type, int num_dst_channels,
>> } \
>> break; \
>> } \
>> - } while (0);
>> + } while (0)
>> +
>> +
>> +static void
>> +convert_float(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 float one = 1.0f;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + SWIZZLE_CONVERT(float, float, src);
>> + break;
>> + case GL_HALF_FLOAT:
>> + SWIZZLE_CONVERT(float, uint16_t, _mesa_half_to_float(src));
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, uint8_t, unorm_to_float(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(float, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, int8_t, snorm_to_float(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(float, int8_t, src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, uint16_t, unorm_to_float(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(float, uint16_t, src);
>> + }
>> + break;
>> + case GL_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, int16_t, snorm_to_float(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(float, int16_t, src);
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, uint32_t, unorm_to_float(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(float, uint32_t, src);
>> + }
>> + break;
>> + case GL_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(float, int32_t, snorm_to_float(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(float, int32_t, src);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +convert_half_float(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 uint16_t one = _mesa_float_to_half(1.0f);
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + SWIZZLE_CONVERT(uint16_t, float, _mesa_float_to_half(src));
>> + break;
>> + case GL_HALF_FLOAT:
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, src);
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint8_t, unorm_to_half(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint8_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, int8_t, snorm_to_half(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, int8_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, unorm_to_half(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + case GL_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, int16_t, snorm_to_half(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, int16_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_half(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint32_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + case GL_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, int32_t, snorm_to_half(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, int32_t, _mesa_float_to_half(src));
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +convert_ubyte(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 uint8_t one = normalized ? UINT8_MAX : 1;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, float, float_to_unorm(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, float, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_unorm(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_uint(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + SWIZZLE_CONVERT(uint8_t, uint8_t, src);
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, int8_t, snorm_to_unorm(src, 8, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, int8_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, unorm_to_unorm(src, 16, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, src);
>> + }
>> + 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);
>> + }
>> + 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);
>> + }
>> + 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);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +convert_byte(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 int8_t one = normalized ? INT8_MAX : 1;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, float, float_to_snorm(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, float, src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_snorm(src, 8));
>> + } else {
>> + SWIZZLE_CONVERT(uint8_t, uint16_t, _mesa_half_to_float(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int8_t, uint8_t, unorm_to_snorm(src, 8, 8));
>> + } else {
>> + SWIZZLE_CONVERT(int8_t, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + SWIZZLE_CONVERT(int8_t, int8_t, src);
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int8_t, uint16_t, unorm_to_snorm(src, 16, 8));
>> + } else {
>> + SWIZZLE_CONVERT(int8_t, uint16_t, src);
>> + }
>> + 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);
>> + }
>> + 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);
>> + }
>> + 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);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +convert_ushort(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 uint16_t one = normalized ? UINT16_MAX : 1;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, float, float_to_unorm(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, float, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_unorm(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_uint(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint8_t, unorm_to_unorm(src, 8, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, int8_t, snorm_to_unorm(src, 8, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, int8_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, src);
>> + break;
>> + case GL_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, int16_t, snorm_to_unorm(src, 16, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, int16_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_unorm(src, 32,
>> 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint32_t, src);
>> + }
>> + 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);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +convert_short(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 int16_t one = normalized ? INT16_MAX : 1;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, float, float_to_snorm(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, float, src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_snorm(src, 16));
>> + } else {
>> + SWIZZLE_CONVERT(uint16_t, uint16_t, _mesa_half_to_float(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int16_t, uint8_t, unorm_to_snorm(src, 8, 16));
>> + } else {
>> + SWIZZLE_CONVERT(int16_t, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int16_t, int8_t, snorm_to_snorm(src, 8, 16));
>> + } else {
>> + SWIZZLE_CONVERT(int16_t, int8_t, src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int16_t, uint16_t, unorm_to_snorm(src, 16, 16));
>> + } else {
>> + SWIZZLE_CONVERT(int16_t, uint16_t, src);
>> + }
>> + break;
>> + case GL_SHORT:
>> + SWIZZLE_CONVERT(int16_t, int16_t, src);
>> + break;
>> + case GL_UNSIGNED_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int16_t, uint32_t, unorm_to_snorm(src, 32, 16));
>> + } else {
>> + SWIZZLE_CONVERT(int16_t, uint32_t, src);
>> + }
>> + break;
>> + case GL_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int16_t, int32_t, snorm_to_snorm(src, 32, 16));
>> + } else {
>> + SWIZZLE_CONVERT(int16_t, int32_t, src);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +static void
>> +convert_uint(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 uint32_t one = normalized ? UINT32_MAX : 1;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, float, float_to_unorm(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, float, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_unorm(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_uint(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, uint8_t, unorm_to_unorm(src, 8, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, int8_t, snorm_to_unorm(src, 8, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, int8_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, unorm_to_unorm(src, 16,
>> 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, src);
>> + }
>> + break;
>> + case GL_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, int16_t, snorm_to_unorm(src, 16, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, int16_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + SWIZZLE_CONVERT(uint32_t, uint32_t, src);
>> + break;
>> + case GL_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, int32_t, snorm_to_unorm(src, 32, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, int32_t, (src < 0) ? 0 : src);
>> + }
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>> +
>> +static void
>> +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;
>> +
>> + switch (src_type) {
>> + case GL_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, float, float_to_snorm(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, float, src);
>> + }
>> + break;
>> + case GL_HALF_FLOAT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_snorm(src, 32));
>> + } else {
>> + SWIZZLE_CONVERT(uint32_t, uint16_t, _mesa_half_to_float(src));
>> + }
>> + break;
>> + case GL_UNSIGNED_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int32_t, uint8_t, unorm_to_snorm(src, 8, 32));
>> + } else {
>> + SWIZZLE_CONVERT(int32_t, uint8_t, src);
>> + }
>> + break;
>> + case GL_BYTE:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int32_t, int8_t, snorm_to_snorm(src, 8, 32));
>> + } else {
>> + SWIZZLE_CONVERT(int32_t, int8_t, src);
>> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int32_t, uint16_t, unorm_to_snorm(src, 16, 32));
>> + } else {
>> + SWIZZLE_CONVERT(int32_t, uint16_t, src);
>> + }
>> + break;
>> + case GL_SHORT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int32_t, int16_t, snorm_to_snorm(src, 16, 32));
>> + } else {
>> + SWIZZLE_CONVERT(int32_t, int16_t, src);
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + if (normalized) {
>> + SWIZZLE_CONVERT(int32_t, uint32_t, unorm_to_snorm(src, 32, 32));
>> + } else {
>> + SWIZZLE_CONVERT(int32_t, uint32_t, src);
>> + }
>> + break;
>> + case GL_INT:
>> + SWIZZLE_CONVERT(int32_t, int32_t, src);
>> + break;
>> + default:
>> + assert(!"Invalid channel type combination");
>> + }
>> +}
>> +
>>
>> /**
>> * Convert between array-based color formats.
>> @@ -478,499 +1003,44 @@ _mesa_swizzle_and_convert(void *void_dst, GLenum
>> dst_type, int num_dst_channels,
>> const void *void_src, GLenum src_type, int
>> num_src_channels,
>> const uint8_t swizzle[4], bool normalized, int
>> count)
>> {
>> - int s, j;
>> - register uint8_t swizzle_x, swizzle_y, swizzle_z, swizzle_w;
>> -
>> if (swizzle_convert_try_memcpy(void_dst, dst_type, num_dst_channels,
>> void_src, src_type, num_src_channels,
>> swizzle, normalized, count))
>> return;
>>
>> - swizzle_x = swizzle[0];
>> - swizzle_y = swizzle[1];
>> - swizzle_z = swizzle[2];
>> - swizzle_w = swizzle[3];
>> -
>> switch (dst_type) {
>> case GL_FLOAT:
>> - {
>> - const float one = 1.0f;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - SWIZZLE_CONVERT(float, float, src)
>> - break;
>> - case GL_HALF_FLOAT:
>> - SWIZZLE_CONVERT(float, uint16_t, _mesa_half_to_float(src))
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, uint8_t, unorm_to_float(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(float, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, int8_t, snorm_to_float(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(float, int8_t, src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, uint16_t, unorm_to_float(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(float, uint16_t, src)
>> - }
>> - break;
>> - case GL_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, int16_t, snorm_to_float(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(float, int16_t, src)
>> - }
>> - break;
>> - case GL_UNSIGNED_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, uint32_t, unorm_to_float(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(float, uint32_t, src)
>> - }
>> - break;
>> - case GL_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(float, int32_t, snorm_to_float(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(float, int32_t, src)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_float(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_HALF_FLOAT:
>> - {
>> - const uint16_t one = _mesa_float_to_half(1.0f);
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - SWIZZLE_CONVERT(uint16_t, float, _mesa_float_to_half(src))
>> - break;
>> - case GL_HALF_FLOAT:
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, src)
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint8_t, unorm_to_half(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint8_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, int8_t, snorm_to_half(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, int8_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, unorm_to_half(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - case GL_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, int16_t, snorm_to_half(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, int16_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_half(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint32_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - case GL_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, int32_t, snorm_to_half(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, int32_t, _mesa_float_to_half(src))
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_half_float(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_UNSIGNED_BYTE:
>> - {
>> - const uint8_t one = normalized ? UINT8_MAX : 1;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, float, float_to_unorm(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, float, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_unorm(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_uint(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - SWIZZLE_CONVERT(uint8_t, uint8_t, src)
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, int8_t, snorm_to_unorm(src, 8, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, int8_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, unorm_to_unorm(src, 16,
>> 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, src)
>> - }
>> - 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)
>> - }
>> - 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)
>> - }
>> - 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)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_ubyte(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_BYTE:
>> - {
>> - const int8_t one = normalized ? INT8_MAX : 1;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, float, float_to_snorm(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, float, src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, half_to_snorm(src, 8))
>> - } else {
>> - SWIZZLE_CONVERT(uint8_t, uint16_t, _mesa_half_to_float(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int8_t, uint8_t, unorm_to_snorm(src, 8, 8))
>> - } else {
>> - SWIZZLE_CONVERT(int8_t, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - SWIZZLE_CONVERT(int8_t, int8_t, src)
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int8_t, uint16_t, unorm_to_snorm(src, 16, 8))
>> - } else {
>> - SWIZZLE_CONVERT(int8_t, uint16_t, src)
>> - }
>> - 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)
>> - }
>> - 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)
>> - }
>> - 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)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_byte(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_UNSIGNED_SHORT:
>> - {
>> - const uint16_t one = normalized ? UINT16_MAX : 1;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, float, float_to_unorm(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, float, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_unorm(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_uint(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint8_t, unorm_to_unorm(src, 8,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, int8_t, snorm_to_unorm(src, 8, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, int8_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, src)
>> - break;
>> - case GL_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, int16_t, snorm_to_unorm(src, 16,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, int16_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_UNSIGNED_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint32_t, unorm_to_unorm(src, 32,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint32_t, src)
>> - }
>> - 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)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_ushort(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_SHORT:
>> - {
>> - const int16_t one = normalized ? INT16_MAX : 1;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, float, float_to_snorm(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, float, src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, half_to_snorm(src, 16))
>> - } else {
>> - SWIZZLE_CONVERT(uint16_t, uint16_t, _mesa_half_to_float(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int16_t, uint8_t, unorm_to_snorm(src, 8, 16))
>> - } else {
>> - SWIZZLE_CONVERT(int16_t, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int16_t, int8_t, snorm_to_snorm(src, 8, 16))
>> - } else {
>> - SWIZZLE_CONVERT(int16_t, int8_t, src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int16_t, uint16_t, unorm_to_snorm(src, 16,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(int16_t, uint16_t, src)
>> - }
>> - break;
>> - case GL_SHORT:
>> - SWIZZLE_CONVERT(int16_t, int16_t, src)
>> - break;
>> - case GL_UNSIGNED_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int16_t, uint32_t, unorm_to_snorm(src, 32,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(int16_t, uint32_t, src)
>> - }
>> - break;
>> - case GL_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int16_t, int32_t, snorm_to_snorm(src, 32,
>> 16))
>> - } else {
>> - SWIZZLE_CONVERT(int16_t, int32_t, src)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_short(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_UNSIGNED_INT:
>> - {
>> - const uint32_t one = normalized ? UINT32_MAX : 1;
>> - switch (src_type) { case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, float, float_to_unorm(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, float, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_unorm(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_uint(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, uint8_t, unorm_to_unorm(src, 8,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, int8_t, snorm_to_unorm(src, 8, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, int8_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, unorm_to_unorm(src, 16,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, src)
>> - }
>> - break;
>> - case GL_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, int16_t, snorm_to_unorm(src, 16,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, int16_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - case GL_UNSIGNED_INT:
>> - SWIZZLE_CONVERT(uint32_t, uint32_t, src)
>> - break;
>> - case GL_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, int32_t, snorm_to_unorm(src, 32,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, int32_t, (src < 0) ? 0 : src)
>> - }
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_uint(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> case GL_INT:
>> - {
>> - const int32_t one = normalized ? INT32_MAX : 1;
>> - switch (src_type) {
>> - case GL_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, float, float_to_snorm(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, float, src)
>> - }
>> - break;
>> - case GL_HALF_FLOAT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, half_to_snorm(src, 32))
>> - } else {
>> - SWIZZLE_CONVERT(uint32_t, uint16_t, _mesa_half_to_float(src))
>> - }
>> - break;
>> - case GL_UNSIGNED_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int32_t, uint8_t, unorm_to_snorm(src, 8, 32))
>> - } else {
>> - SWIZZLE_CONVERT(int32_t, uint8_t, src)
>> - }
>> - break;
>> - case GL_BYTE:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int32_t, int8_t, snorm_to_snorm(src, 8, 32))
>> - } else {
>> - SWIZZLE_CONVERT(int32_t, int8_t, src)
>> - }
>> - break;
>> - case GL_UNSIGNED_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int32_t, uint16_t, unorm_to_snorm(src, 16,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(int32_t, uint16_t, src)
>> - }
>> - break;
>> - case GL_SHORT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int32_t, int16_t, snorm_to_snorm(src, 16,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(int32_t, int16_t, src)
>> - }
>> - break;
>> - case GL_UNSIGNED_INT:
>> - if (normalized) {
>> - SWIZZLE_CONVERT(int32_t, uint32_t, unorm_to_snorm(src, 32,
>> 32))
>> - } else {
>> - SWIZZLE_CONVERT(int32_t, uint32_t, src)
>> - }
>> - break;
>> - case GL_INT:
>> - SWIZZLE_CONVERT(int32_t, int32_t, src)
>> - break;
>> - default:
>> - assert(!"Invalid channel type combination");
>> - }
>> - }
>> - break;
>> + convert_int(void_dst, num_dst_channels, void_src, src_type,
>> + num_src_channels, swizzle, normalized, count);
>> + break;
>> default:
>> assert(!"Invalid channel type");
>> }
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140912/6e9a193e/attachment-0001.html>
More information about the mesa-dev
mailing list