/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */

/**************************************************************************
 *
 * Copyright 2010 VMware, Inc.
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 **************************************************************************/

#include "util/format/u_format.h"
#include "u_format_bptc.h"
#include "u_format_fxt1.h"
#include "u_format_s3tc.h"
#include "u_format_rgtc.h"
#include "u_format_latc.h"
#include "u_format_etc.h"


#include "pipe/p_compiler.h"
#include "util/u_math.h"
#include "util/half_float.h"
#include "u_format.h"
#include "u_format_other.h"
#include "util/format_srgb.h"
#include "format_utils.h"
#include "u_format_yuv.h"
#include "u_format_zs.h"
#include "u_format_pack.h"

void
util_format_none_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_none_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_none_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_none_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_none_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[2])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[2])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_b8g8r8a8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[2]) << 24;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)((src[0]) & 0xff) << 8;
         value |= (src[3]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[2]) & 0xff;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (uint32_t)((src[0]) & 0xff) << 16;
         value |= (uint32_t)(src[3]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[2])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[2])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8x8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[2]) << 24;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)((src[0]) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[2]) & 0xff;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (uint32_t)((src[0]) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8x8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[2], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[2], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[2], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8x8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[2], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[2], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8x8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[2], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (float_to_ubyte(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[3])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_a8r8g8b8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[3]) << 24;
         value |= (uint32_t)((src[0]) & 0xff) << 16;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (src[2]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[3]) & 0xff;
         value |= (uint32_t)((src[0]) & 0xff) << 8;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)(src[2]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_a8r8g8b8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[2], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[2], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_a8r8g8b8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[2], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (float_to_ubyte(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((float_to_ubyte(src[0])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8r8g8b8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((src[0]) & 0xff) << 16;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (src[2]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((src[0]) & 0xff) << 8;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)(src[2]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8r8g8b8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[2], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[2], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8r8g8b8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[2], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (float_to_ubyte(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[3])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_a8b8g8r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[3]) << 24;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (src[0]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[3]) & 0xff;
         value |= (uint32_t)((src[2]) & 0xff) << 8;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)(src[0]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (float_to_ubyte(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8b8g8r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (src[0]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((src[2]) & 0xff) << 8;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)(src[0]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8x8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) << 24;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)((src[2]) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5a1_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g5b5a1_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) << 15;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5a1_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_r5g5b5a1_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g5b5a1_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 1)) << 15;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5x1_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g5b5x1_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5x1_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r5g5b5x1_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g5b5x1_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5x1_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g5r5x1_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5x1_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b5g5r5x1_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g5r5x1_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5a1_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g5r5a1_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) << 15;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5a1_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_b5g5r5a1_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g5r5a1_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 1)) << 15;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 5;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 10;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x1b5g5r5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_x1b5g5r5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x1b5g5r5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x1b5g5r5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_x1b5g5r5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1r5g5b5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1r5g5b5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) & 0x1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1r5g5b5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_a1r5g5b5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1r5g5b5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 1;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 1)) & 0x1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x1r5g5b5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_x1r5g5b5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x1r5g5b5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x1r5g5b5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_x1r5g5b5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f) << 1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1b5g5r5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1b5g5r5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x1)) & 0x1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x1f)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1b5g5r5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x1f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_a1b5g5r5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 1, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1b5g5r5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 1;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 1)) & 0x1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f) << 1;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 5)) & 0x1f) << 6;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4a4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r4g4b4a4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 12;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4a4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_r4g4b4a4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r4g4b4a4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4x4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r4g4b4x4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4x4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r4g4b4x4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r4g4b4x4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4a4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b4g4r4a4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 12;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4a4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_b4g4r4a4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b4g4r4a4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4x4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b4g4r4x4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4x4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b4g4r4x4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b4g4r4x4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4g4b4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4r4g4b4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) << 12;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4g4b4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_a4r4g4b4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = value >> 12;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4r4g4b4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 4)) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 4)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4b4g4r4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4b4g4r4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) << 12;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xf)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xf)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4b4g4r4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = value >> 12;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_a4b4g4r4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = value >> 12;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4b4g4r4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 4)) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 4;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 4)) & 0xf) << 4;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 4)) & 0xf) << 8;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 4)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g6b5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3f)) & 0x3f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3f)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r5g6b5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 6, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 6, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g6b5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 6)) & 0x3f) << 5;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 6)) & 0x3f) << 5;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g6r5_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3f)) & 0x3f) << 5;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x1f)) & 0x1f;
         value |= (uint32_t)(((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3f)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x1f)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = (float)(r * (1.0f/0x1f)); /* r */
         dst[1] = (float)(g * (1.0f/0x3f)); /* g */
         dst[2] = (float)(b * (1.0f/0x1f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b5g6r5_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 6, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = _mesa_unorm_to_unorm(r, 5, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 6, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 5, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g6r5_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 6)) & 0x3f) << 5;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 5)) & 0x1f;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 6)) & 0x3f) << 5;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 5)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= ((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
}

void
util_format_r10g10b10a2_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= ((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r10g10b10x2_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= ((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
}

void
util_format_b10g10r10a2_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2r10g10b10_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = value >> 22;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2r10g10b10_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) << 22;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 2;
         value |= ((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) & 0x3;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2r10g10b10_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = value >> 22;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
}

void
util_format_a2r10g10b10_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = value >> 22;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2r10g10b10_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 10)) << 22;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 2;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 2)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 2)) & 0x3;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 2;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 12;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 10)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2b10g10r10_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = value >> 22;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2b10g10r10_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) << 22;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 2;
         value |= ((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) & 0x3;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2b10g10r10_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = value >> 22;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
}

void
util_format_a2b10g10r10_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = value >> 22;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2b10g10r10_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 10)) << 22;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 12;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 2;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 2)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 2)) & 0x3;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff) << 2;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 12;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 10)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r3g3b2_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = value >> 6;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t r = (value) & 0x7;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0x7;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t b = value >> 6;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_r3g3b2_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3)) << 6;
         value |= (uint32_t)(((uint8_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x7)) & 0x7) << 3;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x7)) & 0x7;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x7)) & 0x7;
         value |= (uint32_t)(((uint8_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x7)) & 0x7) << 3;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3)) << 6;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r3g3b2_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = value >> 6;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t r = (value) & 0x7;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0x7;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t b = value >> 6;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r3g3b2_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = value >> 6;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t r = (value) & 0x7;
         dst[0] = _mesa_unorm_to_unorm(r, 3, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 3, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 2, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0x7;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t b = value >> 6;
         dst[0] = _mesa_unorm_to_unorm(r, 3, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 3, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 2, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_r3g3b2_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 2)) << 6;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 3)) & 0x7) << 3;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 3)) & 0x7;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 3)) & 0x7;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 3)) & 0x7) << 3;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 2)) << 6;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b2g3r3_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 5;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t b = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = (value) & 0x3;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t r = value >> 5;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_b2g3r3_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x7)) << 5;
         value |= (uint32_t)(((uint8_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x7)) & 0x7) << 2;
         value |= ((uint8_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3)) & 0x3;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3)) & 0x3;
         value |= (uint32_t)(((uint8_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x7)) & 0x7) << 2;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x7)) << 5;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b2g3r3_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 5;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t b = (value) & 0x3;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = (value) & 0x3;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t r = value >> 5;
         dst[0] = (float)(r * (1.0f/0x7)); /* r */
         dst[1] = (float)(g * (1.0f/0x7)); /* g */
         dst[2] = (float)(b * (1.0f/0x3)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b2g3r3_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 5;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t b = (value) & 0x3;
         dst[0] = _mesa_unorm_to_unorm(r, 3, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 3, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 2, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = (value) & 0x3;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t r = value >> 5;
         dst[0] = _mesa_unorm_to_unorm(r, 3, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 3, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 2, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_b2g3r3_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 3)) << 5;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 3)) & 0x7) << 2;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 2)) & 0x3;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 2)) & 0x3;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 3)) & 0x7) << 2;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 3)) << 5;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= float_to_ubyte(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= src[0];
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= float_to_ubyte(src[3]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
}

void
util_format_a8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= src[3];
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgba = value;
         dst[0] = ubyte_to_float(rgba); /* r */
         dst[1] = ubyte_to_float(rgba); /* g */
         dst[2] = ubyte_to_float(rgba); /* b */
         dst[3] = ubyte_to_float(rgba); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= float_to_ubyte(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgba = value;
         dst[0] = ubyte_to_float(rgba); /* r */
         dst[1] = ubyte_to_float(rgba); /* g */
         dst[2] = ubyte_to_float(rgba); /* b */
         dst[3] = ubyte_to_float(rgba); /* a */
}

void
util_format_i8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgba = value;
         dst[0] = rgba; /* r */
         dst[1] = rgba; /* g */
         dst[2] = rgba; /* b */
         dst[3] = rgba; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= src[0];
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l4a4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t rgb = (value) & 0xf;
         dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_l4a4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 4;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l4a4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t rgb = (value) & 0xf;
         dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_l4a4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t rgb = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(rgb, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgb, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgb, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = _mesa_unorm_to_unorm(rgb, 4, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgb, 4, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgb, 4, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_l4a4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 4;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = ubyte_to_float(rgb); /* r */
         dst[1] = ubyte_to_float(rgb); /* g */
         dst[2] = ubyte_to_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_l8a8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(src[0]) << 8;
         value |= (src[3]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)(src[3]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value;
         dst[0] = _mesa_unorm_to_unorm(rgb, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgb, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgb, 16, 8); /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= _mesa_unorm_to_unorm(src[0], 8, 16);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
}

void
util_format_a16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 16, 8); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= _mesa_unorm_to_unorm(src[3], 8, 16);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgba = value;
         dst[0] = (float)(rgba * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgba * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgba * (1.0f/0xffff)); /* b */
         dst[3] = (float)(rgba * (1.0f/0xffff)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgba = value;
         dst[0] = (float)(rgba * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgba * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgba * (1.0f/0xffff)); /* b */
         dst[3] = (float)(rgba * (1.0f/0xffff)); /* a */
}

void
util_format_i16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgba = value;
         dst[0] = _mesa_unorm_to_unorm(rgba, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgba, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgba, 16, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(rgba, 16, 8); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= _mesa_unorm_to_unorm(src[0], 8, 16);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) << 16;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#endif
}

void
util_format_l16a16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = _mesa_unorm_to_unorm(rgb, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgb, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgb, 16, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 16, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = _mesa_unorm_to_unorm(rgb, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(rgb, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(rgb, 16, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 16, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 16)) << 16;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 16)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 16)) & 0xffff;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 16)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t a = (int8_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t a = (int8_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
}

void
util_format_a8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t a = (int8_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgb = (int8_t)(value) ;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t rgb = (int8_t)(value) ;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgb = (int8_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 8) ;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_l8a8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 8) ;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgba = (int8_t)(value) ;
         dst[0] = (float)(rgba * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgba * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgba * (1.0f/0x7f)); /* b */
         dst[3] = (float)(rgba * (1.0f/0x7f)); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t rgba = (int8_t)(value) ;
         dst[0] = (float)(rgba * (1.0f/0x7f)); /* r */
         dst[1] = (float)(rgba * (1.0f/0x7f)); /* g */
         dst[2] = (float)(rgba * (1.0f/0x7f)); /* b */
         dst[3] = (float)(rgba * (1.0f/0x7f)); /* a */
}

void
util_format_i8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgba = (int8_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 8, 8); /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t a = (int16_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t a = (int16_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
}

void
util_format_a16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t a = (int16_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 16, 8); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)(_mesa_unorm_to_snorm(src[3], 8, 16)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = (int16_t)(value) ;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = (int16_t)(value) ;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = (int16_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(rgb * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgb * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgb * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#endif
}

void
util_format_l16a16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 16, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgb, 0), 16, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 16, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) << 16) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 16)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 16)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 16)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgba = (int16_t)(value) ;
         dst[0] = (float)(rgba * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgba * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgba * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(rgba * (1.0f/0x7fff)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t rgba = (int16_t)(value) ;
         dst[0] = (float)(rgba * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(rgba * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(rgba * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(rgba * (1.0f/0x7fff)); /* a */
}

void
util_format_i16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgba = (int16_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 16, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(rgba, 0), 16, 8); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_a16_float {
   uint16_t a;
};

void
util_format_a16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_a16_float pixel = {0};
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
}

void
util_format_a16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_a16_float pixel = {0};
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l16_float {
   uint16_t rgb;
};

void
util_format_l16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_l16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_l16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_l16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_l16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_l16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l16a16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t rgb;
   uint16_t a;
#else
   uint16_t rgb;
   uint16_t a;
#endif
};

void
util_format_l16a16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l16a16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz(src[0]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l16a16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz(src[0]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgb); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgb); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgb); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
}

void
util_format_l16a16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#else
         struct util_format_l16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.rgb)); /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l16a16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l16a16_float pixel = {0};
         pixel.rgb = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_i16_float {
   uint16_t rgba;
};

void
util_format_i16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_i16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgba); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgba); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgba); /* b */
         dst[3] = _mesa_half_to_float(pixel.rgba); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_i16_float pixel = {0};
         pixel.rgba = _mesa_float_to_float16_rtz(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_i16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.rgba); /* r */
         dst[1] = _mesa_half_to_float(pixel.rgba); /* g */
         dst[2] = _mesa_half_to_float(pixel.rgba); /* b */
         dst[3] = _mesa_half_to_float(pixel.rgba); /* a */
}

void
util_format_i16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_i16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.rgba)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.rgba)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.rgba)); /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.rgba)); /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_i16_float pixel = {0};
         pixel.rgba = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_a32_float {
   float a;
};

void
util_format_a32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_a32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_a32_float pixel = {0};
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
}

void
util_format_a32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_a32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_a32_float pixel = {0};
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l32_float {
   float rgb;
};

void
util_format_l32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_l32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_l32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_l32_float pixel = {0};
         pixel.rgb = src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_l32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_l32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.rgb); /* r */
         dst[1] = float_to_ubyte(pixel.rgb); /* g */
         dst[2] = float_to_ubyte(pixel.rgb); /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_l32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_l32_float pixel = {0};
         pixel.rgb = ubyte_to_float(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l32a32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float rgb;
   float a;
#else
   float rgb;
   float a;
#endif
};

void
util_format_l32a32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_l32a32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_float pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_float pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32a32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_l32a32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.rgb); /* r */
         dst[1] = float_to_ubyte(pixel.rgb); /* g */
         dst[2] = float_to_ubyte(pixel.rgb); /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#else
         struct util_format_l32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.rgb); /* r */
         dst[1] = float_to_ubyte(pixel.rgb); /* g */
         dst[2] = float_to_ubyte(pixel.rgb); /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_l32a32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_float pixel = {0};
         pixel.rgb = ubyte_to_float(src[0]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_float pixel = {0};
         pixel.rgb = ubyte_to_float(src[0]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_i32_float {
   float rgba;
};

void
util_format_i32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_i32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgba; /* r */
         dst[1] = pixel.rgba; /* g */
         dst[2] = pixel.rgba; /* b */
         dst[3] = pixel.rgba; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_i32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_i32_float pixel = {0};
         pixel.rgba = src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_i32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgba; /* r */
         dst[1] = pixel.rgba; /* g */
         dst[2] = pixel.rgba; /* b */
         dst[3] = pixel.rgba; /* a */
}

void
util_format_i32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_i32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.rgba); /* r */
         dst[1] = float_to_ubyte(pixel.rgba); /* g */
         dst[2] = float_to_ubyte(pixel.rgba); /* b */
         dst[3] = float_to_ubyte(pixel.rgba); /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_i32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_i32_float pixel = {0};
         pixel.rgba = ubyte_to_float(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= util_format_linear_float_to_srgb_8unorm(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = 1; /* a */
}

void
util_format_l8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = util_format_srgb_to_linear_8unorm(rgb); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(rgb); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(rgb); /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= util_format_linear_to_srgb_8unorm(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= util_format_linear_float_to_srgb_8unorm(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= util_format_linear_to_srgb_8unorm(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = util_format_srgb_8unorm_to_linear_float(rgb); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(rgb); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(rgb); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_l8a8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(rgb); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(rgb); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(rgb); /* b */
         dst[3] = a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = util_format_srgb_to_linear_8unorm(rgb); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(rgb); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(rgb); /* b */
         dst[3] = a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 8;
         value |= (src[3]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)(src[3]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 8;
         value |= (util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[1])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 8;
         value |= (util_format_linear_to_srgb_8unorm(src[1])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[1])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_srgb {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t r;
   uint8_t g;
   uint8_t b;
#else
   uint8_t r;
   uint8_t g;
   uint8_t b;
#endif
};

void
util_format_r8g8b8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_srgb pixel = {0};
         pixel.r = util_format_linear_float_to_srgb_8unorm(src[0]);
         pixel.g = util_format_linear_float_to_srgb_8unorm(src[1]);
         pixel.b = util_format_linear_float_to_srgb_8unorm(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_srgb pixel = {0};
         pixel.r = util_format_linear_float_to_srgb_8unorm(src[0]);
         pixel.g = util_format_linear_float_to_srgb_8unorm(src[1]);
         pixel.b = util_format_linear_float_to_srgb_8unorm(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_to_linear_8unorm(pixel.r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(pixel.g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(pixel.b); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r8g8b8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_to_linear_8unorm(pixel.r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(pixel.g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(pixel.b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_srgb pixel = {0};
         pixel.r = util_format_linear_to_srgb_8unorm(src[0]);
         pixel.g = util_format_linear_to_srgb_8unorm(src[1]);
         pixel.b = util_format_linear_to_srgb_8unorm(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_srgb pixel = {0};
         pixel.r = util_format_linear_to_srgb_8unorm(src[0]);
         pixel.g = util_format_linear_to_srgb_8unorm(src[1]);
         pixel.b = util_format_linear_to_srgb_8unorm(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_srgb {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t b;
   uint8_t g;
   uint8_t r;
#else
   uint8_t b;
   uint8_t g;
   uint8_t r;
#endif
};

void
util_format_b8g8r8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_srgb pixel = {0};
         pixel.b = util_format_linear_float_to_srgb_8unorm(src[2]);
         pixel.g = util_format_linear_float_to_srgb_8unorm(src[1]);
         pixel.r = util_format_linear_float_to_srgb_8unorm(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_srgb pixel = {0};
         pixel.b = util_format_linear_float_to_srgb_8unorm(src[2]);
         pixel.g = util_format_linear_float_to_srgb_8unorm(src[1]);
         pixel.r = util_format_linear_float_to_srgb_8unorm(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_8unorm_to_linear_float(pixel.r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(pixel.g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_to_linear_8unorm(pixel.r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(pixel.g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(pixel.b); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_b8g8r8_srgb pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = util_format_srgb_to_linear_8unorm(pixel.r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(pixel.g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(pixel.b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_srgb pixel = {0};
         pixel.b = util_format_linear_to_srgb_8unorm(src[2]);
         pixel.g = util_format_linear_to_srgb_8unorm(src[1]);
         pixel.r = util_format_linear_to_srgb_8unorm(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_srgb pixel = {0};
         pixel.b = util_format_linear_to_srgb_8unorm(src[2]);
         pixel.g = util_format_linear_to_srgb_8unorm(src[1]);
         pixel.r = util_format_linear_to_srgb_8unorm(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_r8g8b8a8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (src[3]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)(src[3]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[3])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_a8b8g8r8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[3]) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[3]) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8b8g8r8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_b8g8r8a8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2])) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (src[3]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[2])) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)(src[3]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8x8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8x8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8x8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2])) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[2])) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[3])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_a8r8g8b8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[3]) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_to_srgb_8unorm(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[3]) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8r8g8b8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8r8g8b8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8r8g8b8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (util_format_linear_to_srgb_8unorm(src[2])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[0])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8sg8sb8ux8u_norm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8sg8sb8ux8u_norm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8sg8sb8ux8u_norm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8sg8sb8ux8u_norm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 16) & 0xff;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8sg8sb8ux8u_norm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10sg10sb10sa2u_norm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10sg10sb10sa2u_norm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0x3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10sg10sb10sa2u_norm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         uint32_t a = value >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x3)); /* a */
#endif
}

void
util_format_r10sg10sb10sa2u_norm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         uint32_t a = value >> 30;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10sg10sb10sa2u_norm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 2)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5sg5sb6u_norm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 10;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0x3f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         uint16_t b = value >> 10;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0x3f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5sg5sb6u_norm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3f)) << 10;
         value |= (uint16_t)((uint32_t)(((uint16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0xf)) & 0x1f) << 5) ;
         value |= (uint16_t)(((uint16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0xf)) & 0x1f) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((uint16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0xf)) & 0x1f) ;
         value |= (uint16_t)((uint32_t)(((uint16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0xf)) & 0x1f) << 5) ;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3f)) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5sg5sb6u_norm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 10;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0x3f)); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         uint16_t b = value >> 10;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = (float)(g * (1.0f/0xf)); /* g */
         dst[2] = (float)(b * (1.0f/0x3f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r5sg5sb6u_norm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 10;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 5, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 6, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 11) ) >> 11;
         int16_t g = ((int16_t)(value << 6) ) >> 11;
         uint16_t b = value >> 10;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 5, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 5, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 6, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5sg5sb6u_norm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 6)) << 10;
         value |= (uint16_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 5)) & 0x1f) << 5) ;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 5)) & 0x1f) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 5)) & 0x1f) ;
         value |= (uint16_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 5)) & 0x1f) << 5) ;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[2], 8, 6)) << 10;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_z24_unorm_s8_uint_as_r8g8b8a8_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_z24_unorm_s8_uint_as_r8g8b8a8_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_z24_unorm_s8_uint_as_r8g8b8a8_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_z24_unorm_s8_uint_as_r8g8b8a8_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_z24_unorm_s8_uint_as_r8g8b8a8_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) << 24;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)((src[2]) & 0xff) << 8;
         value |= (src[3]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         value |= (uint32_t)(src[3]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64_float {
   double r;
};

void
util_format_r64_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 8;
      dst += 4;
   }
}

void
util_format_r64_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_float pixel = {0};
         pixel.r = (double)src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_r64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r64_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 8;
      dst += 4;
   }
}

void
util_format_r64_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64_float {
#if UTIL_ARCH_BIG_ENDIAN
   double r;
   double g;
#else
   double r;
   double g;
#endif
};

void
util_format_r64g64_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r64g64_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r64g64_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r64g64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r64g64_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64b64_float {
#if UTIL_ARCH_BIG_ENDIAN
   double r;
   double g;
   double b;
#else
   double r;
   double g;
   double b;
#endif
};

void
util_format_r64g64b64_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 24;
      dst += 4;
   }
}

void
util_format_r64g64b64_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         pixel.b = (double)src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         pixel.b = (double)src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 24;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64b64_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r64g64b64_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround(CLAMP(pixel.b, 0.0, 1.0) * 0xff); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r64g64b64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround(CLAMP(pixel.b, 0.0, 1.0) * 0xff); /* b */
         dst[3] = 255; /* a */
#endif
      src += 24;
      dst += 4;
   }
}

void
util_format_r64g64b64_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         pixel.b = (double)(src[2] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         pixel.b = (double)(src[2] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 24;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64b64a64_float {
#if UTIL_ARCH_BIG_ENDIAN
   double r;
   double g;
   double b;
   double a;
#else
   double r;
   double g;
   double b;
   double a;
#endif
};

void
util_format_r64g64b64a64_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
      src += 32;
      dst += 4;
   }
}

void
util_format_r64g64b64a64_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         pixel.b = (double)src[2];
         pixel.a = (double)src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64a64_float pixel = {0};
         pixel.r = (double)src[0];
         pixel.g = (double)src[1];
         pixel.b = (double)src[2];
         pixel.a = (double)src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 32;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64b64a64_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
}

void
util_format_r64g64b64a64_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround(CLAMP(pixel.b, 0.0, 1.0) * 0xff); /* b */
         dst[3] = (uint8_t)util_iround(CLAMP(pixel.a, 0.0, 1.0) * 0xff); /* a */
#else
         struct util_format_r64g64b64a64_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround(CLAMP(pixel.r, 0.0, 1.0) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround(CLAMP(pixel.g, 0.0, 1.0) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround(CLAMP(pixel.b, 0.0, 1.0) * 0xff); /* b */
         dst[3] = (uint8_t)util_iround(CLAMP(pixel.a, 0.0, 1.0) * 0xff); /* a */
#endif
      src += 32;
      dst += 4;
   }
}

void
util_format_r64g64b64a64_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         pixel.b = (double)(src[2] * (1.0f/0xff));
         pixel.a = (double)(src[3] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64a64_float pixel = {0};
         pixel.r = (double)(src[0] * (1.0f/0xff));
         pixel.g = (double)(src[1] * (1.0f/0xff));
         pixel.b = (double)(src[2] * (1.0f/0xff));
         pixel.a = (double)(src[3] * (1.0f/0xff));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 32;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32_float {
   float r;
};

void
util_format_r32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r32_float pixel = {0};
         pixel.r = src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_r32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float r;
   float g;
#else
   float r;
   float g;
#endif
};

void
util_format_r32g32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float r;
   float g;
   float b;
#else
   float r;
   float g;
   float b;
#endif
};

void
util_format_r32g32b32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float r;
   float g;
   float b;
   float a;
#else
   float r;
   float g;
   float b;
   float a;
#endif
};

void
util_format_r32g32b32a32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32g32b32a32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#else
         struct util_format_r32g32b32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = (float)(r * (1.0/0xffffffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = (float)(r * (1.0/0xffffffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = _mesa_unorm_to_unorm(r, 32, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= _mesa_unorm_to_unorm(src[0], 8, 32);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
#else
   uint32_t r;
   uint32_t g;
#endif
};

void
util_format_r32g32_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
#endif
};

void
util_format_r32g32b32_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.b = (uint32_t)(CLAMP(src[2], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.b = (uint32_t)(CLAMP(src[2], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 32, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 32, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#endif
};

void
util_format_r32g32b32a32_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0xffffffff)); /* a */
#else
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0xffffffff)); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.b = (uint32_t)(CLAMP(src[2], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.a = (uint32_t)(CLAMP(src[3], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_unorm pixel = {0};
         pixel.r = (uint32_t)(CLAMP(src[0], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.g = (uint32_t)(CLAMP(src[1], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.b = (uint32_t)(CLAMP(src[2], 0.0f, 1.0f) * (double)0xffffffff);
         pixel.a = (uint32_t)(CLAMP(src[3], 0.0f, 1.0f) * (double)0xffffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0xffffffff)); /* a */
#else
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0xffffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0xffffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0xffffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0xffffffff)); /* a */
#endif
}

void
util_format_r32g32b32a32_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 32, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(pixel.a, 32, 8); /* a */
#else
         struct util_format_r32g32b32a32_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 32, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 32, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 32, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(pixel.a, 32, 8); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 32);
         pixel.a = _mesa_unorm_to_unorm(src[3], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 32);
         pixel.a = _mesa_unorm_to_unorm(src[3], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = (uint8_t)(((uint64_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
#else
   uint32_t r;
   uint32_t g;
#endif
};

void
util_format_r32g32_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
#endif
};

void
util_format_r32g32b32_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         pixel.b = (uint32_t)CLAMP(src[2], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         pixel.b = (uint32_t)CLAMP(src[2], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#endif
};

void
util_format_r32g32b32a32_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         pixel.b = (uint32_t)CLAMP(src[2], 0.0f, 4294967040.0f);
         pixel.a = (uint32_t)CLAMP(src[3], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_uscaled pixel = {0};
         pixel.r = (uint32_t)CLAMP(src[0], 0.0f, 4294967040.0f);
         pixel.g = (uint32_t)CLAMP(src[1], 0.0f, 4294967040.0f);
         pixel.b = (uint32_t)CLAMP(src[2], 0.0f, 4294967040.0f);
         pixel.a = (uint32_t)CLAMP(src[3], 0.0f, 4294967040.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
}

void
util_format_r32g32b32a32_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint64_t)MIN2(pixel.a, 1)) * 0xff / 0x1); /* a */
#else
         struct util_format_r32g32b32a32_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint64_t)MIN2(pixel.a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         pixel.a = (uint32_t)(((uint64_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_uscaled pixel = {0};
         pixel.r = (uint32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         pixel.a = (uint32_t)(((uint64_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = (float)(r * (1.0/0x7fffffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = (float)(r * (1.0/0x7fffffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 32, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 32)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
#else
   int32_t r;
   int32_t g;
#endif
};

void
util_format_r32g32_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
#else
   int32_t r;
   int32_t g;
   int32_t b;
#endif
};

void
util_format_r32g32b32_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.b = (int32_t)(CLAMP(src[2], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.b = (int32_t)(CLAMP(src[2], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 32, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 32, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#else
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#endif
};

void
util_format_r32g32b32a32_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x7fffffff)); /* a */
#else
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x7fffffff)); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.b = (int32_t)(CLAMP(src[2], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.a = (int32_t)(CLAMP(src[3], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_snorm pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.g = (int32_t)(CLAMP(src[1], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.b = (int32_t)(CLAMP(src[2], -1.0f, 1.0f) * (double)0x7fffffff);
         pixel.a = (int32_t)(CLAMP(src[3], -1.0f, 1.0f) * (double)0x7fffffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x7fffffff)); /* a */
#else
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x7fffffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x7fffffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x7fffffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x7fffffff)); /* a */
#endif
}

void
util_format_r32g32b32a32_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 32, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(pixel.a, 0), 32, 8); /* a */
#else
         struct util_format_r32g32b32a32_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 32, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 32, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 32, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(pixel.a, 0), 32, 8); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 32);
         pixel.a = _mesa_unorm_to_snorm(src[3], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 32);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 32);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 32);
         pixel.a = _mesa_unorm_to_snorm(src[3], 8, 32);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = (uint8_t)(((uint64_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)(((uint64_t)src[0]) * 0x1 / 0xff)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
#else
   int32_t r;
   int32_t g;
#endif
};

void
util_format_r32g32_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
#else
   int32_t r;
   int32_t g;
   int32_t b;
#endif
};

void
util_format_r32g32b32_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         pixel.b = (int32_t)CLAMP(src[2], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         pixel.b = (int32_t)CLAMP(src[2], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#else
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#endif
};

void
util_format_r32g32b32a32_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         pixel.b = (int32_t)CLAMP(src[2], -2147483648.0f, 2147483520.0f);
         pixel.a = (int32_t)CLAMP(src[3], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_sscaled pixel = {0};
         pixel.r = (int32_t)CLAMP(src[0], -2147483648.0f, 2147483520.0f);
         pixel.g = (int32_t)CLAMP(src[1], -2147483648.0f, 2147483520.0f);
         pixel.b = (int32_t)CLAMP(src[2], -2147483648.0f, 2147483520.0f);
         pixel.a = (int32_t)CLAMP(src[3], -2147483648.0f, 2147483520.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
}

void
util_format_r32g32b32a32_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint64_t)CLAMP(pixel.a, 0, 1)) * 0xff / 0x1); /* a */
#else
         struct util_format_r32g32b32a32_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint64_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint64_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint64_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint64_t)CLAMP(pixel.a, 0, 1)) * 0xff / 0x1); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         pixel.a = (int32_t)(((uint64_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_sscaled pixel = {0};
         pixel.r = (int32_t)(((uint64_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int32_t)(((uint64_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int32_t)(((uint64_t)src[2]) * 0x1 / 0xff);
         pixel.a = (int32_t)(((uint64_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16_float {
   uint16_t r;
};

void
util_format_r16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_r16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
#else
   uint16_t r;
   uint16_t g;
#endif
};

void
util_format_r16g16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
#endif
};

void
util_format_r16g16b16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = 255; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#endif
};

void
util_format_r16g16b16a16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
}

void
util_format_r16g16b16a16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#else
         struct util_format_r16g16b16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= _mesa_unorm_to_unorm(src[0], 8, 16);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) << 16;
         value |= ((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 16)) << 16;
         value |= (_mesa_unorm_to_unorm(src[1], 8, 16)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 16)) & 0xffff;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[1], 8, 16)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
#endif
};

void
util_format_r16g16b16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#endif
};

void
util_format_r16g16b16a16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0xffff)); /* a */
#else
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0xffff)); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         pixel.a = (uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         pixel.a = (uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0xffff)); /* a */
#else
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0xffff)); /* a */
#endif
}

void
util_format_r16g16b16a16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(pixel.a, 16, 8); /* a */
#else
         struct util_format_r16g16b16a16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = _mesa_unorm_to_unorm(pixel.a, 16, 8); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         pixel.a = _mesa_unorm_to_unorm(src[3], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         pixel.a = _mesa_unorm_to_unorm(src[3], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)CLAMP(src[0], 0.0f, 65535.0f);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0.0f, 65535.0f)) << 16;
         value |= ((uint16_t)CLAMP(src[1], 0.0f, 65535.0f)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0.0f, 65535.0f)) & 0xffff;
         value |= (uint32_t)((uint16_t)CLAMP(src[1], 0.0f, 65535.0f)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 16;
         value |= ((uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xffff;
         value |= (uint32_t)((uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
#endif
};

void
util_format_r16g16b16_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uscaled pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0.0f, 65535.0f);
         pixel.g = (uint16_t)CLAMP(src[1], 0.0f, 65535.0f);
         pixel.b = (uint16_t)CLAMP(src[2], 0.0f, 65535.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_uscaled pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0.0f, 65535.0f);
         pixel.g = (uint16_t)CLAMP(src[1], 0.0f, 65535.0f);
         pixel.b = (uint16_t)CLAMP(src[2], 0.0f, 65535.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uscaled pixel = {0};
         pixel.r = (uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_uscaled pixel = {0};
         pixel.r = (uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#endif
};

void
util_format_r16g16b16a16_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uscaled pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0.0f, 65535.0f);
         pixel.g = (uint16_t)CLAMP(src[1], 0.0f, 65535.0f);
         pixel.b = (uint16_t)CLAMP(src[2], 0.0f, 65535.0f);
         pixel.a = (uint16_t)CLAMP(src[3], 0.0f, 65535.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_uscaled pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0.0f, 65535.0f);
         pixel.g = (uint16_t)CLAMP(src[1], 0.0f, 65535.0f);
         pixel.b = (uint16_t)CLAMP(src[2], 0.0f, 65535.0f);
         pixel.a = (uint16_t)CLAMP(src[3], 0.0f, 65535.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
}

void
util_format_r16g16b16a16_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(pixel.a, 1)) * 0xff / 0x1); /* a */
#else
         struct util_format_r16g16b16a16_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(pixel.a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uscaled pixel = {0};
         pixel.r = (uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.a = (uint16_t)(((uint32_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_uscaled pixel = {0};
         pixel.r = (uint16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.a = (uint16_t)(((uint32_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) << 16) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 16)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 16)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[1], 8, 16)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
#else
   int16_t r;
   int16_t g;
   int16_t b;
#endif
};

void
util_format_r16g16b16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#else
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#endif
};

void
util_format_r16g16b16a16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0x7fff)); /* a */
#else
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0x7fff)); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         pixel.a = (int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         pixel.a = (int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0x7fff)); /* a */
#else
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = (float)(pixel.a * (1.0f/0x7fff)); /* a */
#endif
}

void
util_format_r16g16b16a16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(pixel.a, 0), 16, 8); /* a */
#else
         struct util_format_r16g16b16a16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(pixel.a, 0), 16, 8); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         pixel.a = _mesa_unorm_to_snorm(src[3], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         pixel.a = _mesa_unorm_to_snorm(src[3], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)CLAMP(src[0], -32768.0f, 32767.0f)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)(((uint32_t)src[0]) * 0x1 / 0xff)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[0], -32768.0f, 32767.0f)) << 16) ;
         value |= (uint32_t)(((int16_t)CLAMP(src[1], -32768.0f, 32767.0f)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)CLAMP(src[0], -32768.0f, 32767.0f)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[1], -32768.0f, 32767.0f)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 16) ;
         value |= (uint32_t)(((int16_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)(((uint32_t)src[1]) * 0x1 / 0xff)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
#else
   int16_t r;
   int16_t g;
   int16_t b;
#endif
};

void
util_format_r16g16b16_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sscaled pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768.0f, 32767.0f);
         pixel.g = (int16_t)CLAMP(src[1], -32768.0f, 32767.0f);
         pixel.b = (int16_t)CLAMP(src[2], -32768.0f, 32767.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_sscaled pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768.0f, 32767.0f);
         pixel.g = (int16_t)CLAMP(src[1], -32768.0f, 32767.0f);
         pixel.b = (int16_t)CLAMP(src[2], -32768.0f, 32767.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sscaled pixel = {0};
         pixel.r = (int16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_sscaled pixel = {0};
         pixel.r = (int16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#else
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#endif
};

void
util_format_r16g16b16a16_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sscaled pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768.0f, 32767.0f);
         pixel.g = (int16_t)CLAMP(src[1], -32768.0f, 32767.0f);
         pixel.b = (int16_t)CLAMP(src[2], -32768.0f, 32767.0f);
         pixel.a = (int16_t)CLAMP(src[3], -32768.0f, 32767.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_sscaled pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768.0f, 32767.0f);
         pixel.g = (int16_t)CLAMP(src[1], -32768.0f, 32767.0f);
         pixel.b = (int16_t)CLAMP(src[2], -32768.0f, 32767.0f);
         pixel.a = (int16_t)CLAMP(src[3], -32768.0f, 32767.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = (float)pixel.a; /* a */
#endif
}

void
util_format_r16g16b16a16_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(pixel.a, 0, 1)) * 0xff / 0x1); /* a */
#else
         struct util_format_r16g16b16a16_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(pixel.a, 0, 1)) * 0xff / 0x1); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sscaled pixel = {0};
         pixel.r = (int16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.a = (int16_t)(((uint32_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_sscaled pixel = {0};
         pixel.r = (int16_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int16_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int16_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.a = (int16_t)(((uint32_t)src[3]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= float_to_ubyte(src[0]);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= src[0];
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 8;
         value |= (float_to_ubyte(src[1])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[1])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(src[0]) << 8;
         value |= (src[1]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)(src[1]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t r;
   uint8_t g;
   uint8_t b;
#else
   uint8_t r;
   uint8_t g;
   uint8_t b;
#endif
};

void
util_format_r8g8b8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_unorm pixel = {0};
         pixel.r = float_to_ubyte(src[0]);
         pixel.g = float_to_ubyte(src[1]);
         pixel.b = float_to_ubyte(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_unorm pixel = {0};
         pixel.r = float_to_ubyte(src[0]);
         pixel.g = float_to_ubyte(src[1]);
         pixel.b = float_to_ubyte(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r8g8b8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_unorm pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_unorm pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t b;
   uint8_t g;
   uint8_t r;
#else
   uint8_t b;
   uint8_t g;
   uint8_t r;
#endif
};

void
util_format_b8g8r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_unorm pixel = {0};
         pixel.b = float_to_ubyte(src[2]);
         pixel.g = float_to_ubyte(src[1]);
         pixel.r = float_to_ubyte(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_unorm pixel = {0};
         pixel.b = float_to_ubyte(src[2]);
         pixel.g = float_to_ubyte(src[1]);
         pixel.r = float_to_ubyte(src[0]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = ubyte_to_float(pixel.r); /* r */
         dst[1] = ubyte_to_float(pixel.g); /* g */
         dst[2] = ubyte_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_b8g8r8_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_unorm pixel = {0};
         pixel.b = src[2];
         pixel.g = src[1];
         pixel.r = src[0];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_unorm pixel = {0};
         pixel.b = src[2];
         pixel.g = src[1];
         pixel.r = src[0];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 24;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 16;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)((float_to_ubyte(src[1])) & 0xff) << 8;
         value |= (uint32_t)((float_to_ubyte(src[2])) & 0xff) << 16;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = ubyte_to_float(b); /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_r8g8b8a8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = b; /* b */
         dst[3] = a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) << 24;
         value |= (uint32_t)((src[1]) & 0xff) << 16;
         value |= (uint32_t)((src[2]) & 0xff) << 8;
         value |= (src[3]) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)((src[1]) & 0xff) << 8;
         value |= (uint32_t)((src[2]) & 0xff) << 16;
         value |= (uint32_t)(src[3]) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) << 8;
         value |= ((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) & 0xff;
         value |= (uint32_t)((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 8;
         value |= ((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t r;
   uint8_t g;
   uint8_t b;
#else
   uint8_t r;
   uint8_t g;
   uint8_t b;
#endif
};

void
util_format_r8g8b8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uscaled pixel = {0};
         pixel.r = (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         pixel.g = (uint8_t)CLAMP(src[1], 0.0f, 255.0f);
         pixel.b = (uint8_t)CLAMP(src[2], 0.0f, 255.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_uscaled pixel = {0};
         pixel.r = (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         pixel.g = (uint8_t)CLAMP(src[1], 0.0f, 255.0f);
         pixel.b = (uint8_t)CLAMP(src[2], 0.0f, 255.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r8g8b8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uscaled pixel = {0};
         pixel.r = (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_uscaled pixel = {0};
         pixel.r = (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_uscaled {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t b;
   uint8_t g;
   uint8_t r;
#else
   uint8_t b;
   uint8_t g;
   uint8_t r;
#endif
};

void
util_format_b8g8r8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uscaled pixel = {0};
         pixel.b = (uint8_t)CLAMP(src[2], 0.0f, 255.0f);
         pixel.g = (uint8_t)CLAMP(src[1], 0.0f, 255.0f);
         pixel.r = (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_uscaled pixel = {0};
         pixel.b = (uint8_t)CLAMP(src[2], 0.0f, 255.0f);
         pixel.g = (uint8_t)CLAMP(src[1], 0.0f, 255.0f);
         pixel.r = (uint8_t)CLAMP(src[0], 0.0f, 255.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_b8g8r8_uscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)MIN2(pixel.r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(pixel.g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(pixel.b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uscaled pixel = {0};
         pixel.b = (uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.g = (uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.r = (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_uscaled pixel = {0};
         pixel.b = (uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.g = (uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.r = (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_r8g8b8a8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 24;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= ((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_b8g8r8a8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) << 24;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= ((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[3], 0.0f, 255.0f)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0.0f, 255.0f)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0.0f, 255.0f)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0.0f, 255.0f)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_a8b8g8r8_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= ((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 8) ;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 8) ;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[1], 8, 8)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t r;
   int8_t g;
   int8_t b;
#else
   int8_t r;
   int8_t g;
   int8_t b;
#endif
};

void
util_format_r8g8b8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_snorm pixel = {0};
         pixel.r = (int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f);
         pixel.g = (int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f);
         pixel.b = (int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_snorm pixel = {0};
         pixel.r = (int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f);
         pixel.g = (int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f);
         pixel.b = (int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r8g8b8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 8);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 8);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 8);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 8);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 8);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 8);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t b;
   int8_t g;
   int8_t r;
#else
   int8_t b;
   int8_t g;
   int8_t r;
#endif
};

void
util_format_b8g8r8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_snorm pixel = {0};
         pixel.b = (int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f);
         pixel.g = (int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f);
         pixel.r = (int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_snorm pixel = {0};
         pixel.b = (int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f);
         pixel.g = (int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f);
         pixel.r = (int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_b8g8r8_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_snorm pixel = {0};
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 8);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 8);
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 8);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_snorm pixel = {0};
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 8);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 8);
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 8);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_r8g8b8a8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_b8g8r8a8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[2], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)CLAMP(src[0], -128.0f, 127.0f)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (float)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[0], -128.0f, 127.0f)) << 8) ;
         value |= (uint16_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)CLAMP(src[0], -128.0f, 127.0f)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[1], -128.0f, 127.0f)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 8) ;
         value |= (uint16_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t r;
   int8_t g;
   int8_t b;
#else
   int8_t r;
   int8_t g;
   int8_t b;
#endif
};

void
util_format_r8g8b8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sscaled pixel = {0};
         pixel.r = (int8_t)CLAMP(src[0], -128.0f, 127.0f);
         pixel.g = (int8_t)CLAMP(src[1], -128.0f, 127.0f);
         pixel.b = (int8_t)CLAMP(src[2], -128.0f, 127.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_sscaled pixel = {0};
         pixel.r = (int8_t)CLAMP(src[0], -128.0f, 127.0f);
         pixel.g = (int8_t)CLAMP(src[1], -128.0f, 127.0f);
         pixel.b = (int8_t)CLAMP(src[2], -128.0f, 127.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r8g8b8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sscaled pixel = {0};
         pixel.r = (int8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_sscaled pixel = {0};
         pixel.r = (int8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         pixel.g = (int8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.b = (int8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_sscaled {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t b;
   int8_t g;
   int8_t r;
#else
   int8_t b;
   int8_t g;
   int8_t r;
#endif
};

void
util_format_b8g8r8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sscaled pixel = {0};
         pixel.b = (int8_t)CLAMP(src[2], -128.0f, 127.0f);
         pixel.g = (int8_t)CLAMP(src[1], -128.0f, 127.0f);
         pixel.r = (int8_t)CLAMP(src[0], -128.0f, 127.0f);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_sscaled pixel = {0};
         pixel.b = (int8_t)CLAMP(src[2], -128.0f, 127.0f);
         pixel.g = (int8_t)CLAMP(src[1], -128.0f, 127.0f);
         pixel.r = (int8_t)CLAMP(src[0], -128.0f, 127.0f);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)pixel.r; /* r */
         dst[1] = (float)pixel.g; /* g */
         dst[2] = (float)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_b8g8r8_sscaled pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)(((uint32_t)CLAMP(pixel.r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(pixel.g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(pixel.b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sscaled pixel = {0};
         pixel.b = (int8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.g = (int8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.r = (int8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_sscaled pixel = {0};
         pixel.b = (int8_t)(((uint32_t)src[2]) * 0x1 / 0xff);
         pixel.g = (int8_t)(((uint32_t)src[1]) * 0x1 / 0xff);
         pixel.r = (int8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128.0f, 127.0f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128.0f, 127.0f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128.0f, 127.0f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128.0f, 127.0f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_r8g8b8a8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[2], -128.0f, 127.0f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128.0f, 127.0f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[2], -128.0f, 127.0f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128.0f, 127.0f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_b8g8r8a8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128.0f, 127.0f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128.0f, 127.0f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128.0f, 127.0f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128.0f, 127.0f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128.0f, 127.0f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128.0f, 127.0f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_a8b8g8r8_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)CLAMP(a, 0, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)(((uint32_t)src[3]) * 0x1 / 0xff)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)(((uint32_t)src[0]) * 0x1 / 0xff)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32_fixed {
   int32_t r;
};

void
util_format_r32_fixed_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_fixed_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_fixed_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
         struct util_format_r32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_fixed_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_fixed_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_fixed {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
#else
   int32_t r;
   int32_t g;
#endif
};

void
util_format_r32g32_fixed_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_fixed_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_fixed_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_fixed_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_fixed_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_fixed {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
#else
   int32_t r;
   int32_t g;
   int32_t b;
#endif
};

void
util_format_r32g32b32_fixed_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_fixed_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.b = (int32_t)(CLAMP(src[2], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.b = (int32_t)(CLAMP(src[2], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_fixed_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_fixed_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround((CLAMP(pixel.b, 0, 65536) * (1.0/0x10000)) * 0xff); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround((CLAMP(pixel.b, 0, 65536) * (1.0/0x10000)) * 0xff); /* b */
         dst[3] = 255; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_fixed_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         pixel.b = (int32_t)((float)(src[2] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         pixel.b = (int32_t)((float)(src[2] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_fixed {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#else
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#endif
};

void
util_format_r32g32b32a32_fixed_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x10000)); /* a */
#else
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x10000)); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_fixed_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.b = (int32_t)(CLAMP(src[2], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.a = (int32_t)(CLAMP(src[3], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_fixed pixel = {0};
         pixel.r = (int32_t)(CLAMP(src[0], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.g = (int32_t)(CLAMP(src[1], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.b = (int32_t)(CLAMP(src[2], -65536.0f, 65535.0f) * (double)0x10000);
         pixel.a = (int32_t)(CLAMP(src[3], -65536.0f, 65535.0f) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_fixed_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x10000)); /* a */
#else
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0/0x10000)); /* r */
         dst[1] = (float)(pixel.g * (1.0/0x10000)); /* g */
         dst[2] = (float)(pixel.b * (1.0/0x10000)); /* b */
         dst[3] = (float)(pixel.a * (1.0/0x10000)); /* a */
#endif
}

void
util_format_r32g32b32a32_fixed_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround((CLAMP(pixel.b, 0, 65536) * (1.0/0x10000)) * 0xff); /* b */
         dst[3] = (uint8_t)util_iround((CLAMP(pixel.a, 0, 65536) * (1.0/0x10000)) * 0xff); /* a */
#else
         struct util_format_r32g32b32a32_fixed pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (uint8_t)util_iround((CLAMP(pixel.r, 0, 65536) * (1.0/0x10000)) * 0xff); /* r */
         dst[1] = (uint8_t)util_iround((CLAMP(pixel.g, 0, 65536) * (1.0/0x10000)) * 0xff); /* g */
         dst[2] = (uint8_t)util_iround((CLAMP(pixel.b, 0, 65536) * (1.0/0x10000)) * 0xff); /* b */
         dst[3] = (uint8_t)util_iround((CLAMP(pixel.a, 0, 65536) * (1.0/0x10000)) * 0xff); /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_fixed_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         pixel.b = (int32_t)((float)(src[2] * (1.0f/0xff)) * (double)0x10000);
         pixel.a = (int32_t)((float)(src[3] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_fixed pixel = {0};
         pixel.r = (int32_t)((float)(src[0] * (1.0f/0xff)) * (double)0x10000);
         pixel.g = (int32_t)((float)(src[1] * (1.0f/0xff)) * (double)0x10000);
         pixel.b = (int32_t)((float)(src[2] * (1.0f/0xff)) * (double)0x10000);
         pixel.a = (int32_t)((float)(src[3] * (1.0f/0xff)) * (double)0x10000);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= ((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r10g10b10x2_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= ((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r10g10b10x2_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10x2_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10x2_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r10g10b10x2_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 4;
         uint8_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = (value) & 0xf;
         uint8_t r = value >> 4;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_a4r4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) << 4;
         value |= ((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 4;
         uint8_t a = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = (value) & 0xf;
         uint8_t r = value >> 4;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_a4r4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 4;
         uint8_t a = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = (value) & 0xf;
         uint8_t r = value >> 4;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_a4r4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 4)) << 4;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 4)) & 0xf;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 4)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4a4_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_r4a4_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 4;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xf)) & 0xf;
         value |= (uint32_t)((uint8_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xf)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4a4_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t r = (value) & 0xf;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = (float)(r * (1.0f/0xf)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xf)); /* a */
#endif
}

void
util_format_r4a4_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value >> 4;
         uint8_t r = (value) & 0xf;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0xf;
         uint8_t a = value >> 4;
         dst[0] = _mesa_unorm_to_unorm(r, 4, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 4, 8); /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_r4a4_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 4;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 4)) & 0xf;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 4)) << 4;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 8;
         value |= (float_to_ubyte(src[3])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (float_to_ubyte(src[0])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_r8a8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(src[0]) << 8;
         value |= (src[3]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (src[0]) & 0xff;
         value |= (uint32_t)(src[3]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a8r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[3])) << 8;
         value |= (float_to_ubyte(src[0])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (float_to_ubyte(src[3])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = ubyte_to_float(a); /* a */
#endif
}

void
util_format_a8r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a8r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(src[3]) << 8;
         value |= (src[0]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (src[3]) & 0xff;
         value |= (uint32_t)(src[0]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0.0f, 3.0f)) << 30;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= ((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0.0f, 3.0f)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_r10g10b10a2_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= ((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2.0f, 1.0f)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512.0f, 511.0f)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512.0f, 511.0f)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512.0f, 511.0f)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512.0f, 511.0f)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512.0f, 511.0f)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512.0f, 511.0f)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2.0f, 1.0f)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_r10g10b10a2_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_r10g10b10a2_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 2)) << 30) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 2)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_uscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_uscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0.0f, 3.0f)) << 30;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= ((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[2], 0.0f, 1023.0f)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0.0f, 1023.0f)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0.0f, 1023.0f)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0.0f, 3.0f)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_uscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_b10g10r10a2_uscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)MIN2(g, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)MIN2(b, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MIN2(a, 1)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_uscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= ((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_sscaled_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_sscaled_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2.0f, 1.0f)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512.0f, 511.0f)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512.0f, 511.0f)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512.0f, 511.0f)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512.0f, 511.0f)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512.0f, 511.0f)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512.0f, 511.0f)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2.0f, 1.0f)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_sscaled_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)r; /* r */
         dst[1] = (float)g; /* g */
         dst[2] = (float)b; /* b */
         dst[3] = (float)a; /* a */
#endif
}

void
util_format_b10g10r10a2_sscaled_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x1); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (uint8_t)(((uint32_t)CLAMP(r, 0, 1)) * 0xff / 0x1); /* r */
         dst[1] = (uint8_t)(((uint32_t)CLAMP(g, 0, 1)) * 0xff / 0x1); /* g */
         dst[2] = (uint8_t)(((uint32_t)CLAMP(b, 0, 1)) * 0xff / 0x1); /* b */
         dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x1); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_sscaled_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)(((uint32_t)src[2]) * 0x1 / 0xff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[1]) * 0x1 / 0xff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)(((uint32_t)src[0]) * 0x1 / 0xff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)(((uint32_t)src[3]) * 0x1 / 0xff)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = (float)(a * (1.0f/0x1)); /* a */
#endif
}

void
util_format_b10g10r10a2_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 2, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 2, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 2)) << 30) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 2)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)MIN2(src[0], 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[0], 0, 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 8;
         value |= ((uint8_t)MIN2(src[1], 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         value |= (uint32_t)((uint8_t)MIN2(src[1], 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t g = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t g = value >> 8;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 8;
         value |= ((uint8_t)CLAMP(src[1], 0, 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         value |= (uint32_t)((uint8_t)CLAMP(src[1], 0, 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t r;
   uint8_t g;
   uint8_t b;
#else
   uint8_t r;
   uint8_t g;
   uint8_t b;
#endif
};

void
util_format_r8g8b8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uint pixel = {0};
         pixel.r = (uint8_t)MIN2(src[0], 255);
         pixel.g = (uint8_t)MIN2(src[1], 255);
         pixel.b = (uint8_t)MIN2(src[2], 255);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_uint pixel = {0};
         pixel.r = (uint8_t)MIN2(src[0], 255);
         pixel.g = (uint8_t)MIN2(src[1], 255);
         pixel.b = (uint8_t)MIN2(src[2], 255);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_uint pixel = {0};
         pixel.r = (uint8_t)CLAMP(src[0], 0, 255);
         pixel.g = (uint8_t)CLAMP(src[1], 0, 255);
         pixel.b = (uint8_t)CLAMP(src[2], 0, 255);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_uint pixel = {0};
         pixel.r = (uint8_t)CLAMP(src[0], 0, 255);
         pixel.g = (uint8_t)CLAMP(src[1], 0, 255);
         pixel.b = (uint8_t)CLAMP(src[2], 0, 255);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 8;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r8g8b8a8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_r8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)CLAMP(src[0], -128, 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t r = (int8_t)(value) ;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)MIN2(src[0], 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8g8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 8) ;
         value |= (uint16_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[1], -128, 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t g = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 8) ;
         value |= (uint16_t)(((int8_t)MIN2(src[1], 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[1], 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r8g8b8_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t r;
   int8_t g;
   int8_t b;
#else
   int8_t r;
   int8_t g;
   int8_t b;
#endif
};

void
util_format_r8g8b8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_r8g8b8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sint pixel = {0};
         pixel.r = (int8_t)CLAMP(src[0], -128, 127);
         pixel.g = (int8_t)CLAMP(src[1], -128, 127);
         pixel.b = (int8_t)CLAMP(src[2], -128, 127);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_sint pixel = {0};
         pixel.r = (int8_t)CLAMP(src[0], -128, 127);
         pixel.g = (int8_t)CLAMP(src[1], -128, 127);
         pixel.b = (int8_t)CLAMP(src[2], -128, 127);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r8g8b8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r8g8b8_sint pixel = {0};
         pixel.r = (int8_t)MIN2(src[0], 127);
         pixel.g = (int8_t)MIN2(src[1], 127);
         pixel.b = (int8_t)MIN2(src[2], 127);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r8g8b8_sint pixel = {0};
         pixel.r = (int8_t)MIN2(src[0], 127);
         pixel.g = (int8_t)MIN2(src[1], 127);
         pixel.b = (int8_t)MIN2(src[2], 127);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8a8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8a8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_r8g8b8a8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)MIN2(src[0], 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)CLAMP(src[0], 0, 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 65535)) << 16;
         value |= ((uint16_t)MIN2(src[1], 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)MIN2(src[1], 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t g = (value) & 0xffff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t g = value >> 16;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 65535)) << 16;
         value |= ((uint16_t)CLAMP(src[1], 0, 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)CLAMP(src[1], 0, 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
#endif
};

void
util_format_r16g16b16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t a;
#endif
};

void
util_format_r16g16b16a16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = (unsigned)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = (unsigned)pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         pixel.a = (uint16_t)MIN2(src[3], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         pixel.a = (uint16_t)MIN2(src[3], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = (unsigned)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = (unsigned)pixel.a; /* a */
#endif
}

void
util_format_r16g16b16a16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         pixel.a = (uint16_t)CLAMP(src[3], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         pixel.a = (uint16_t)CLAMP(src[3], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_r16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)CLAMP(src[0], -32768, 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t r = (int16_t)(value) ;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)MIN2(src[0], 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16g16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[0], -32768, 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)CLAMP(src[1], -32768, 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)CLAMP(src[0], -32768, 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[1], -32768, 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t g = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[0], 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)MIN2(src[1], 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)MIN2(src[0], 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[1], 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
#else
   int16_t r;
   int16_t g;
   int16_t b;
#endif
};

void
util_format_r16g16b16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 6;
      dst += 4;
   }
}

void
util_format_r16g16b16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 6;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16a16_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#else
   int16_t r;
   int16_t g;
   int16_t b;
   int16_t a;
#endif
};

void
util_format_r16g16b16a16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = (int)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = (int)pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16a16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         pixel.a = (int16_t)CLAMP(src[3], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         pixel.a = (int16_t)CLAMP(src[3], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16a16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = (int)pixel.a; /* a */
#else
         struct util_format_r16g16b16a16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = (int)pixel.a; /* a */
#endif
}

void
util_format_r16g16b16a16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16a16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         pixel.a = (int16_t)MIN2(src[3], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16a16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         pixel.a = (int16_t)MIN2(src[3], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= src[0];
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)MAX2(src[0], 0);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
#else
   uint32_t r;
   uint32_t g;
#endif
};

void
util_format_r32g32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
#endif
};

void
util_format_r32g32b32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t a;
#endif
};

void
util_format_r32g32b32a32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32g32b32a32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_r32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t r = (int32_t)(value) ;
         dst[0] = r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)MIN2(src[0], 2147483647)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
#else
   int32_t r;
   int32_t g;
#endif
};

void
util_format_r32g32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32g32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
#else
   int32_t r;
   int32_t g;
   int32_t b;
#endif
};

void
util_format_r32g32b32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 12;
      dst += 4;
   }
}

void
util_format_r32g32b32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 12;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32a32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#else
   int32_t r;
   int32_t g;
   int32_t b;
   int32_t a;
#endif
};

void
util_format_r32g32b32a32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32a32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32a32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32g32b32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32g32b32a32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32a32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32a32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64_uint {
   uint64_t r;
};

void
util_format_r64_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 8;
      dst += 4;
   }
}

void
util_format_r64_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         struct util_format_r64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r64_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint64_t r;
   uint64_t g;
#else
   uint64_t r;
   uint64_t g;
#endif
};

void
util_format_r64g64_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r64g64_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r64g64_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64b64_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint64_t r;
   uint64_t g;
   uint64_t b;
#else
   uint64_t r;
   uint64_t g;
   uint64_t b;
#endif
};

void
util_format_r64g64b64_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64b64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = 1; /* a */
#endif
      src += 24;
      dst += 4;
   }
}

void
util_format_r64g64b64_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         pixel.b = (uint64_t)src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         pixel.b = (uint64_t)src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 24;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64b64_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r64g64b64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r64g64b64_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         pixel.b = (uint64_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         pixel.b = (uint64_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 24;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64g64b64a64_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint64_t r;
   uint64_t g;
   uint64_t b;
   uint64_t a;
#else
   uint64_t r;
   uint64_t g;
   uint64_t b;
   uint64_t a;
#endif
};

void
util_format_r64g64b64a64_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = (unsigned)MIN2(pixel.a, 4294967295); /* a */
#else
         struct util_format_r64g64b64a64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = (unsigned)MIN2(pixel.a, 4294967295); /* a */
#endif
      src += 32;
      dst += 4;
   }
}

void
util_format_r64g64b64a64_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         pixel.b = (uint64_t)src[2];
         pixel.a = (uint64_t)src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64a64_uint pixel = {0};
         pixel.r = (uint64_t)src[0];
         pixel.g = (uint64_t)src[1];
         pixel.b = (uint64_t)src[2];
         pixel.a = (uint64_t)src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 32;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64g64b64a64_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = (unsigned)MIN2(pixel.a, 4294967295); /* a */
#else
         struct util_format_r64g64b64a64_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)MIN2(pixel.r, 4294967295); /* r */
         dst[1] = (unsigned)MIN2(pixel.g, 4294967295); /* g */
         dst[2] = (unsigned)MIN2(pixel.b, 4294967295); /* b */
         dst[3] = (unsigned)MIN2(pixel.a, 4294967295); /* a */
#endif
}

void
util_format_r64g64b64a64_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r64g64b64a64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         pixel.b = (uint64_t)MAX2(src[2], 0);
         pixel.a = (uint64_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r64g64b64a64_uint pixel = {0};
         pixel.r = (uint64_t)MAX2(src[0], 0);
         pixel.g = (uint64_t)MAX2(src[1], 0);
         pixel.b = (uint64_t)MAX2(src[2], 0);
         pixel.a = (uint64_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 32;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r64_sint {
   int64_t r;
};

void
util_format_r64_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         struct util_format_r64_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)CLAMP(pixel.r, -2147483648, 2147483647); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
      src += 8;
      dst += 4;
   }
}

void
util_format_r64_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_sint pixel = {0};
         pixel.r = (int64_t)src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r64_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         struct util_format_r64_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)CLAMP(pixel.r, -2147483648, 2147483647); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
}

void
util_format_r64_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         struct util_format_r64_sint pixel = {0};
         pixel.r = (int64_t)src[0];
         memcpy(dst, &pixel, sizeof pixel);
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)MIN2(src[3], 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
}

void
util_format_a8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[3], 0, 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgba = value;
         dst[0] = (unsigned)rgba; /* r */
         dst[1] = (unsigned)rgba; /* g */
         dst[2] = (unsigned)rgba; /* b */
         dst[3] = (unsigned)rgba; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)MIN2(src[0], 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgba = value;
         dst[0] = (unsigned)rgba; /* r */
         dst[1] = (unsigned)rgba; /* g */
         dst[2] = (unsigned)rgba; /* b */
         dst[3] = (unsigned)rgba; /* a */
}

void
util_format_i8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[0], 0, 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)MIN2(src[0], 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         uint8_t rgb = value;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)CLAMP(src[0], 0, 255);
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 8;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_l8a8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t a = (int8_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_a8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)CLAMP(src[3], -128, 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t a = (int8_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
}

void
util_format_a8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)MIN2(src[3], 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgba = (int8_t)(value) ;
         dst[0] = (int)rgba; /* r */
         dst[1] = (int)rgba; /* g */
         dst[2] = (int)rgba; /* b */
         dst[3] = (int)rgba; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_i8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)CLAMP(src[0], -128, 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t rgba = (int8_t)(value) ;
         dst[0] = (int)rgba; /* r */
         dst[1] = (int)rgba; /* g */
         dst[2] = (int)rgba; /* b */
         dst[3] = (int)rgba; /* a */
}

void
util_format_i8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)MIN2(src[0], 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint8_t value = *(const uint8_t *)src;
         int8_t rgb = (int8_t)(value) ;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = 1; /* a */
      src += 1;
      dst += 4;
   }
}

void
util_format_l8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)CLAMP(src[0], -128, 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint8_t value = *(const uint8_t *)src;
         int8_t rgb = (int8_t)(value) ;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint8_t value = 0;
         value |= (uint8_t)((int8_t)MIN2(src[0], 127)) ;
         *(uint8_t *)dst = value;
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_l8a8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 8) ;
         value |= (uint16_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l8a8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_l8a8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 8) ;
         value |= (uint16_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)MIN2(src[3], 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
}

void
util_format_a16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)CLAMP(src[3], 0, 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgba = value;
         dst[0] = (unsigned)rgba; /* r */
         dst[1] = (unsigned)rgba; /* g */
         dst[2] = (unsigned)rgba; /* b */
         dst[3] = (unsigned)rgba; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)MIN2(src[0], 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgba = value;
         dst[0] = (unsigned)rgba; /* r */
         dst[1] = (unsigned)rgba; /* g */
         dst[2] = (unsigned)rgba; /* b */
         dst[3] = (unsigned)rgba; /* a */
}

void
util_format_i16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)CLAMP(src[0], 0, 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)MIN2(src[0], 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         uint16_t rgb = value;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)CLAMP(src[0], 0, 65535);
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 65535)) << 16;
         value |= ((uint16_t)MIN2(src[3], 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (unsigned)rgb; /* r */
         dst[1] = (unsigned)rgb; /* g */
         dst[2] = (unsigned)rgb; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_l16a16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 65535)) << 16;
         value |= ((uint16_t)CLAMP(src[3], 0, 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t a = (int16_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_a16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)CLAMP(src[3], -32768, 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t a = (int16_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
}

void
util_format_a16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)MIN2(src[3], 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgba = (int16_t)(value) ;
         dst[0] = (int)rgba; /* r */
         dst[1] = (int)rgba; /* g */
         dst[2] = (int)rgba; /* b */
         dst[3] = (int)rgba; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_i16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)CLAMP(src[0], -32768, 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t rgba = (int16_t)(value) ;
         dst[0] = (int)rgba; /* r */
         dst[1] = (int)rgba; /* g */
         dst[2] = (int)rgba; /* b */
         dst[3] = (int)rgba; /* a */
}

void
util_format_i16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)MIN2(src[0], 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = (int16_t)(value) ;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = 1; /* a */
      src += 2;
      dst += 4;
   }
}

void
util_format_l16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)CLAMP(src[0], -32768, 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint16_t value = *(const uint16_t *)src;
         int16_t rgb = (int16_t)(value) ;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint16_t value = 0;
         value |= (uint16_t)((int16_t)MIN2(src[0], 32767)) ;
         *(uint16_t *)dst = value;
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_l16a16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[0], -32768, 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)CLAMP(src[3], -32768, 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)CLAMP(src[0], -32768, 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[3], -32768, 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l16a16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (int)rgb; /* r */
         dst[1] = (int)rgb; /* g */
         dst[2] = (int)rgb; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_l16a16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[0], 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)MIN2(src[3], 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)MIN2(src[0], 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[3], 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_a32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= src[3];
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
}

void
util_format_a32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)MAX2(src[3], 0);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgba = value;
         dst[0] = rgba; /* r */
         dst[1] = rgba; /* g */
         dst[2] = rgba; /* b */
         dst[3] = rgba; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_i32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= src[0];
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgba = value;
         dst[0] = rgba; /* r */
         dst[1] = rgba; /* g */
         dst[2] = rgba; /* b */
         dst[3] = rgba; /* a */
}

void
util_format_i32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)MAX2(src[0], 0);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_l32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= src[0];
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         uint32_t rgb = value;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)MAX2(src[0], 0);
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l32a32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t rgb;
   uint32_t a;
#else
   uint32_t rgb;
   uint32_t a;
#endif
};

void
util_format_l32a32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_l32a32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_uint pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_uint pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32a32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_l32a32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_uint pixel = {0};
         pixel.rgb = (uint32_t)MAX2(src[0], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_uint pixel = {0};
         pixel.rgb = (uint32_t)MAX2(src[0], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t a = (int32_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_a32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(src[3]) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t a = (int32_t)(value) ;
         dst[0] = 0; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = a; /* a */
}

void
util_format_a32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)MIN2(src[3], 2147483647)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t rgba = (int32_t)(value) ;
         dst[0] = rgba; /* r */
         dst[1] = rgba; /* g */
         dst[2] = rgba; /* b */
         dst[3] = rgba; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_i32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_i32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t rgba = (int32_t)(value) ;
         dst[0] = rgba; /* r */
         dst[1] = rgba; /* g */
         dst[2] = rgba; /* b */
         dst[3] = rgba; /* a */
}

void
util_format_i32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)MIN2(src[0], 2147483647)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = (int32_t)(value) ;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = 1; /* a */
      src += 4;
      dst += 4;
   }
}

void
util_format_l32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)(src[0]) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
         uint32_t value = *(const uint32_t *)src;
         int32_t rgb = (int32_t)(value) ;
         dst[0] = rgb; /* r */
         dst[1] = rgb; /* g */
         dst[2] = rgb; /* b */
         dst[3] = 1; /* a */
}

void
util_format_l32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
         uint32_t value = 0;
         value |= (uint32_t)((int32_t)MIN2(src[0], 2147483647)) ;
         *(uint32_t *)dst = value;
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_l32a32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t rgb;
   int32_t a;
#else
   int32_t rgb;
   int32_t a;
#endif
};

void
util_format_l32a32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_l32a32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_sint pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_sint pixel = {0};
         pixel.rgb = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_l32a32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_l32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.rgb; /* r */
         dst[1] = pixel.rgb; /* g */
         dst[2] = pixel.rgb; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_l32a32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_l32a32_sint pixel = {0};
         pixel.rgb = (int32_t)MIN2(src[0], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_l32a32_sint pixel = {0};
         pixel.rgb = (int32_t)MIN2(src[0], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint8_t b;
   uint8_t g;
   uint8_t r;
#else
   uint8_t b;
   uint8_t g;
   uint8_t r;
#endif
};

void
util_format_b8g8r8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uint pixel = {0};
         pixel.b = (uint8_t)MIN2(src[2], 255);
         pixel.g = (uint8_t)MIN2(src[1], 255);
         pixel.r = (uint8_t)MIN2(src[0], 255);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_uint pixel = {0};
         pixel.b = (uint8_t)MIN2(src[2], 255);
         pixel.g = (uint8_t)MIN2(src[1], 255);
         pixel.r = (uint8_t)MIN2(src[0], 255);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_uint pixel = {0};
         pixel.b = (uint8_t)CLAMP(src[2], 0, 255);
         pixel.g = (uint8_t)CLAMP(src[1], 0, 255);
         pixel.r = (uint8_t)CLAMP(src[0], 0, 255);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_uint pixel = {0};
         pixel.b = (uint8_t)CLAMP(src[2], 0, 255);
         pixel.g = (uint8_t)CLAMP(src[1], 0, 255);
         pixel.r = (uint8_t)CLAMP(src[0], 0, 255);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[2], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 8;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[2], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t a = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_b8g8r8a8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[2], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_b8g8r8_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int8_t b;
   int8_t g;
   int8_t r;
#else
   int8_t b;
   int8_t g;
   int8_t r;
#endif
};

void
util_format_b8g8r8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 3;
      dst += 4;
   }
}

void
util_format_b8g8r8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sint pixel = {0};
         pixel.b = (int8_t)CLAMP(src[2], -128, 127);
         pixel.g = (int8_t)CLAMP(src[1], -128, 127);
         pixel.r = (int8_t)CLAMP(src[0], -128, 127);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_sint pixel = {0};
         pixel.b = (int8_t)CLAMP(src[2], -128, 127);
         pixel.g = (int8_t)CLAMP(src[1], -128, 127);
         pixel.r = (int8_t)CLAMP(src[0], -128, 127);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_b8g8r8_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b8g8r8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_b8g8r8_sint pixel = {0};
         pixel.b = (int8_t)MIN2(src[2], 127);
         pixel.g = (int8_t)MIN2(src[1], 127);
         pixel.r = (int8_t)MIN2(src[0], 127);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_b8g8r8_sint pixel = {0};
         pixel.b = (int8_t)MIN2(src[2], 127);
         pixel.g = (int8_t)MIN2(src[1], 127);
         pixel.r = (int8_t)MIN2(src[0], 127);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 3;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b8g8r8a8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[2], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b8g8r8a8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value << 16) ) >> 24;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 8) ) >> 24;
         int32_t a = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_b8g8r8a8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[2], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8r8g8b8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= ((uint8_t)MIN2(src[2], 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[0], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)MIN2(src[2], 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8r8g8b8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t r = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t r = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a8r8g8b8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[2], 0, 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[0], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0, 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 24;
         uint32_t b = (value >> 16) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t r = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t r = value >> 24;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a8b8g8r8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 24;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2r10g10b10_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = value >> 22;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2r10g10b10_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)MIN2(src[2], 1023)) << 22;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 1023)) & 0x3ff) << 2;
         value |= ((uint32_t)MIN2(src[3], 3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)MIN2(src[3], 3)) & 0x3;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 1023)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)MIN2(src[2], 1023)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2r10g10b10_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t r = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = value >> 22;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a2r10g10b10_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[2], 0, 1023)) << 22;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff) << 2;
         value |= ((uint32_t)CLAMP(src[3], 0, 3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[3], 0, 3)) & 0x3;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)CLAMP(src[2], 0, 1023)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2b10g10r10_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = value >> 22;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a2b10g10r10_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)MIN2(src[0], 1023)) << 22;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 1023)) & 0x3ff) << 2;
         value |= ((uint32_t)MIN2(src[3], 3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)MIN2(src[3], 3)) & 0x3;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 1023)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)MIN2(src[0], 1023)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a2b10g10r10_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 22;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t a = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = (value) & 0x3;
         uint32_t b = (value >> 2) & 0x3ff;
         uint32_t g = (value >> 12) & 0x3ff;
         uint32_t r = value >> 22;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a2b10g10r10_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[0], 0, 1023)) << 22;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 12;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff) << 2;
         value |= ((uint32_t)CLAMP(src[3], 0, 3)) & 0x3;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[3], 0, 3)) & 0x3;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff) << 2;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 12;
         value |= (uint32_t)((uint32_t)CLAMP(src[0], 0, 1023)) << 22;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)MIN2(src[3], 3)) << 30;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 1023)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 10;
         value |= ((uint32_t)MIN2(src[2], 1023)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)MIN2(src[2], 1023)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 1023)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)MIN2(src[3], 3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_b10g10r10a2_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0, 3)) << 30;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
         value |= ((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0, 3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10a2_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10a2_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_b10g10r10a2_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)MIN2(src[3], 1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)MIN2(src[3], 1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g6b5_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 31)) << 11;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 63)) & 0x3f) << 5;
         value |= ((uint16_t)MIN2(src[0], 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 63)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r5g6b5_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 31)) << 11;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 63)) & 0x3f) << 5;
         value |= ((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 63)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g6r5_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 31)) << 11;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 63)) & 0x3f) << 5;
         value |= ((uint16_t)MIN2(src[2], 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[2], 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 63)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b5g6r5_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 31)) << 11;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 63)) & 0x3f) << 5;
         value |= ((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 63)) & 0x3f) << 5;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r3g3b2_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = value >> 6;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t r = (value) & 0x7;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0x7;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t b = value >> 6;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_r3g3b2_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[2], 3)) << 6;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 7)) & 0x7) << 3;
         value |= ((uint8_t)MIN2(src[0], 7)) & 0x7;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 7)) & 0x7;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 7)) & 0x7) << 3;
         value |= (uint32_t)((uint8_t)MIN2(src[2], 3)) << 6;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r3g3b2_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = value >> 6;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t r = (value) & 0x7;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = (value) & 0x7;
         uint8_t g = (value >> 3) & 0x7;
         uint8_t b = value >> 6;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r3g3b2_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0, 3)) << 6;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 7)) & 0x7) << 3;
         value |= ((uint8_t)CLAMP(src[0], 0, 7)) & 0x7;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 7)) & 0x7;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 7)) & 0x7) << 3;
         value |= (uint32_t)((uint8_t)CLAMP(src[2], 0, 3)) << 6;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b2g3r3_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 5;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t b = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = (value) & 0x3;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t r = value >> 5;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 1;
      dst += 4;
   }
}

void
util_format_b2g3r3_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 7)) << 5;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 7)) & 0x7) << 2;
         value |= ((uint8_t)MIN2(src[2], 3)) & 0x3;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)MIN2(src[2], 3)) & 0x3;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 7)) & 0x7) << 2;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 7)) << 5;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b2g3r3_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = *(const uint8_t *)src;
         uint8_t r = value >> 5;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t b = (value) & 0x3;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint8_t value = *(const uint8_t *)src;
         uint8_t b = (value) & 0x3;
         uint8_t g = (value >> 2) & 0x7;
         uint8_t r = value >> 5;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b2g3r3_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint8_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 7)) << 5;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 7)) & 0x7) << 2;
         value |= ((uint8_t)CLAMP(src[2], 0, 3)) & 0x3;
         *(uint8_t *)dst = value;
#else
         uint8_t value = 0;
         value |= ((uint8_t)CLAMP(src[2], 0, 3)) & 0x3;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 7)) & 0x7) << 2;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 7)) << 5;
         *(uint8_t *)dst = value;
#endif
         src += 4;
         dst += 1;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4a4_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r4g4b4a4_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 15)) << 12;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 4;
         value |= ((uint16_t)MIN2(src[0], 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r4g4b4a4_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r4g4b4a4_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 15)) << 12;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 4;
         value |= ((uint16_t)CLAMP(src[0], 0, 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4a4_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b4g4r4a4_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 15)) << 12;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 4;
         value |= ((uint16_t)MIN2(src[2], 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[2], 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b4g4r4a4_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 12;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t b = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0xf;
         uint16_t g = (value >> 4) & 0xf;
         uint16_t r = (value >> 8) & 0xf;
         uint16_t a = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_b4g4r4a4_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 15)) << 12;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 4;
         value |= ((uint16_t)CLAMP(src[2], 0, 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[2], 0, 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4g4b4_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4r4g4b4_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 15)) << 12;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 15)) & 0xf) << 4;
         value |= ((uint16_t)MIN2(src[3], 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[3], 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4r4g4b4_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t r = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a4r4g4b4_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 15)) << 12;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 15)) & 0xf) << 4;
         value |= ((uint16_t)CLAMP(src[3], 0, 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[3], 0, 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4b4g4r4_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a4b4g4r4_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 15)) << 12;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 15)) & 0xf) << 4;
         value |= ((uint16_t)MIN2(src[3], 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[3], 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a4b4g4r4_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 12;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t a = (value) & 0xf;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0xf;
         uint16_t b = (value >> 4) & 0xf;
         uint16_t g = (value >> 8) & 0xf;
         uint16_t r = value >> 12;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a4b4g4r4_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 15)) << 12;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 15)) & 0xf) << 4;
         value |= ((uint16_t)CLAMP(src[3], 0, 15)) & 0xf;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[3], 0, 15)) & 0xf;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 15)) & 0xf) << 4;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 15)) & 0xf) << 8;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 15)) << 12;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1r5g5b5_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1r5g5b5_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 31)) << 11;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 31)) & 0x1f) << 1;
         value |= ((uint16_t)MIN2(src[3], 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[3], 1)) & 0x1;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 31)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)MIN2(src[2], 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1r5g5b5_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t r = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a1r5g5b5_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 31)) << 11;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f) << 1;
         value |= ((uint16_t)CLAMP(src[3], 0, 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[3], 0, 1)) & 0x1;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)CLAMP(src[2], 0, 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1b5g5r5_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_a1b5g5r5_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 31)) << 11;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 31)) & 0x1f) << 1;
         value |= ((uint16_t)MIN2(src[3], 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[3], 1)) & 0x1;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 31)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a1b5g5r5_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t a = (value) & 0x1;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = (value) & 0x1;
         uint16_t b = (value >> 1) & 0x1f;
         uint16_t g = (value >> 6) & 0x1f;
         uint16_t r = value >> 11;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_a1b5g5r5_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 31)) << 11;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 6;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f) << 1;
         value |= ((uint16_t)CLAMP(src[3], 0, 1)) & 0x1;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[3], 0, 1)) & 0x1;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f) << 1;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 6;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 31)) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5a1_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g5b5a1_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 1)) << 15;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 31)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 5;
         value |= ((uint16_t)MIN2(src[0], 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)MIN2(src[2], 31)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g5b5a1_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r5g5b5a1_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 1)) << 15;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 5;
         value |= ((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5a1_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g5r5a1_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 1)) << 15;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 31)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 5;
         value |= ((uint16_t)MIN2(src[2], 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)MIN2(src[2], 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)MIN2(src[1], 31)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)MIN2(src[0], 31)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g5r5a1_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t a = value >> 15;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t b = (value) & 0x1f;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x1f;
         uint16_t r = (value >> 10) & 0x1f;
         uint16_t a = value >> 15;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_b5g5r5a1_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 1)) << 15;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f) << 10;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 5;
         value |= ((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint16_t)CLAMP(src[2], 0, 31)) & 0x1f;
         value |= (uint32_t)(((uint16_t)CLAMP(src[1], 0, 31)) & 0x1f) << 5;
         value |= (uint32_t)(((uint16_t)CLAMP(src[0], 0, 31)) & 0x1f) << 10;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 1)) << 15;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8x8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0])) << 24;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[2])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8x8_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = util_format_srgb_to_linear_8unorm(r); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0])) << 24;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 16;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[0])) & 0xff;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1])) & 0xff) << 8;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[2])) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 24;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)MIN2(src[1], 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)MIN2(src[2], 255)) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 24;
         uint32_t g = (value >> 16) & 0xff;
         uint32_t b = (value >> 8) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xff;
         uint32_t g = (value >> 8) & 0xff;
         uint32_t b = (value >> 16) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8x8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 24;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 16;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 8;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         value |= (uint32_t)(((uint8_t)CLAMP(src[1], 0, 255)) & 0xff) << 8;
         value |= (uint32_t)(((uint8_t)CLAMP(src[2], 0, 255)) & 0xff) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r8g8b8x8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8g8b8x8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r8g8b8x8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 8) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10x2_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= ((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0x3ff)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0x3ff)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         dst[0] = (float)(r * (1.0f/0x3ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x3ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x3ff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b10g10r10x2_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t b = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value >> 20) & 0x3ff;
         dst[0] = _mesa_unorm_to_unorm(r, 10, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 10, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(b, 10, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10x2_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 20;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[2], 8, 10)) & 0x3ff;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[1], 8, 10)) & 0x3ff) << 10;
         value |= (uint32_t)((_mesa_unorm_to_unorm(src[0], 8, 10)) & 0x3ff) << 20;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10x2_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x1ff)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (float)(r * (1.0f/0x1ff)); /* r */
         dst[1] = (float)(g * (1.0f/0x1ff)); /* g */
         dst[2] = (float)(b * (1.0f/0x1ff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b10g10r10x2_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 10, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 10, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 10, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10x2_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 10)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 10)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 10)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_b10g10r10x2_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b10g10r10x2_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 2) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b10g10r10x2_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) << 20) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16x16_unorm {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#endif
};

void
util_format_r16g16b16x16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_unorm pixel = {0};
         pixel.r = (uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff);
         pixel.g = (uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff);
         pixel.b = (uint16_t)util_iround(CLAMP(src[2], 0.0f, 1.0f) * 0xffff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16x16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0xffff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0xffff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16x16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16x16_unorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_unorm_to_unorm(pixel.r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(pixel.g, 16, 8); /* g */
         dst[2] = _mesa_unorm_to_unorm(pixel.b, 16, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_unorm pixel = {0};
         pixel.r = _mesa_unorm_to_unorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_unorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_unorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16x16_snorm {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
   uint16_t x;
#else
   int16_t r;
   int16_t g;
   int16_t b;
   uint16_t x;
#endif
};

void
util_format_r16g16b16x16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_snorm pixel = {0};
         pixel.r = (int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff);
         pixel.g = (int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff);
         pixel.b = (int16_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7fff);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16x16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (float)(pixel.r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(pixel.g * (1.0f/0x7fff)); /* g */
         dst[2] = (float)(pixel.b * (1.0f/0x7fff)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16x16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16x16_snorm pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_snorm_to_unorm(MAX2(pixel.r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(pixel.g, 0), 16, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(pixel.b, 0), 16, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_snorm pixel = {0};
         pixel.r = _mesa_unorm_to_snorm(src[0], 8, 16);
         pixel.g = _mesa_unorm_to_snorm(src[1], 8, 16);
         pixel.b = _mesa_unorm_to_snorm(src[2], 8, 16);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16x16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#endif
};

void
util_format_r16g16b16x16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.g = _mesa_float_to_float16_rtz(src[1]);
         pixel.b = _mesa_float_to_float16_rtz(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16x16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = _mesa_half_to_float(pixel.g); /* g */
         dst[2] = _mesa_half_to_float(pixel.b); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16x16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r16g16b16x16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = float_to_ubyte(_mesa_half_to_float(pixel.g)); /* g */
         dst[2] = float_to_ubyte(_mesa_half_to_float(pixel.b)); /* b */
         dst[3] = 255; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.g = _mesa_float_to_float16_rtz((float)(src[1] * (1.0f/0xff)));
         pixel.b = _mesa_float_to_float16_rtz((float)(src[2] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16x16_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#else
   uint16_t r;
   uint16_t g;
   uint16_t b;
   uint16_t x;
#endif
};

void
util_format_r16g16b16x16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_uint pixel = {0};
         pixel.r = (uint16_t)MIN2(src[0], 65535);
         pixel.g = (uint16_t)MIN2(src[1], 65535);
         pixel.b = (uint16_t)MIN2(src[2], 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16x16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (unsigned)pixel.r; /* r */
         dst[1] = (unsigned)pixel.g; /* g */
         dst[2] = (unsigned)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16x16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_uint pixel = {0};
         pixel.r = (uint16_t)CLAMP(src[0], 0, 65535);
         pixel.g = (uint16_t)CLAMP(src[1], 0, 65535);
         pixel.b = (uint16_t)CLAMP(src[2], 0, 65535);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16g16b16x16_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int16_t r;
   int16_t g;
   int16_t b;
   uint16_t x;
#else
   int16_t r;
   int16_t g;
   int16_t b;
   uint16_t x;
#endif
};

void
util_format_r16g16b16x16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r16g16b16x16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_sint pixel = {0};
         pixel.r = (int16_t)CLAMP(src[0], -32768, 32767);
         pixel.g = (int16_t)CLAMP(src[1], -32768, 32767);
         pixel.b = (int16_t)CLAMP(src[2], -32768, 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16g16b16x16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r16g16b16x16_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = (int)pixel.r; /* r */
         dst[1] = (int)pixel.g; /* g */
         dst[2] = (int)pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r16g16b16x16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16g16b16x16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16g16b16x16_sint pixel = {0};
         pixel.r = (int16_t)MIN2(src[0], 32767);
         pixel.g = (int16_t)MIN2(src[1], 32767);
         pixel.b = (int16_t)MIN2(src[2], 32767);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32x32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float r;
   float g;
   float b;
   uint32_t x;
#else
   float r;
   float g;
   float b;
   uint32_t x;
#endif
};

void
util_format_r32g32b32x32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32x32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_float pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32x32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32x32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = 255; /* a */
#else
         struct util_format_r32g32b32x32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = float_to_ubyte(pixel.g); /* g */
         dst[2] = float_to_ubyte(pixel.b); /* b */
         dst[3] = 255; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32x32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.g = ubyte_to_float(src[1]);
         pixel.b = ubyte_to_float(src[2]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32x32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t x;
#else
   uint32_t r;
   uint32_t g;
   uint32_t b;
   uint32_t x;
#endif
};

void
util_format_r32g32b32x32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32x32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_uint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32x32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32x32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.g = (uint32_t)MAX2(src[1], 0);
         pixel.b = (uint32_t)MAX2(src[2], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32g32b32x32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t g;
   int32_t b;
   uint32_t x;
#else
   int32_t r;
   int32_t g;
   int32_t b;
   uint32_t x;
#endif
};

void
util_format_r32g32b32x32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 16;
      dst += 4;
   }
}

void
util_format_r32g32b32x32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_sint pixel = {0};
         pixel.r = src[0];
         pixel.g = src[1];
         pixel.b = src[2];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32g32b32x32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#else
         struct util_format_r32g32b32x32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = pixel.g; /* g */
         dst[2] = pixel.b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r32g32b32x32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32g32b32x32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32g32b32x32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.g = (int32_t)MIN2(src[1], 2147483647);
         pixel.b = (int32_t)MIN2(src[2], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 16;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 8) ;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_r8a8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 8) ;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) << 16;
         value |= ((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[3], 0.0f, 1.0f) * 0xffff)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0xffff)); /* a */
#endif
}

void
util_format_r16a16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 16, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_unorm_to_unorm(a, 16, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 16)) << 16;
         value |= (_mesa_unorm_to_unorm(src[3], 8, 16)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 16)) & 0xffff;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[3], 8, 16)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (float)(a * (1.0f/0x7fff)); /* a */
#endif
}

void
util_format_r16a16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 16, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 16, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) << 16) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 16)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 16)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 16)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r16a16_float {
#if UTIL_ARCH_BIG_ENDIAN
   uint16_t r;
   uint16_t a;
#else
   uint16_t r;
   uint16_t a;
#endif
};

void
util_format_r16a16_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz(src[0]);
         pixel.a = _mesa_float_to_float16_rtz(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#else
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = _mesa_half_to_float(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = _mesa_half_to_float(pixel.a); /* a */
#endif
}

void
util_format_r16a16_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#else
         struct util_format_r16a16_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(_mesa_half_to_float(pixel.r)); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(_mesa_half_to_float(pixel.a)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r16a16_float pixel = {0};
         pixel.r = _mesa_float_to_float16_rtz((float)(src[0] * (1.0f/0xff)));
         pixel.a = _mesa_float_to_float16_rtz((float)(src[3] * (1.0f/0xff)));
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32a32_float {
#if UTIL_ARCH_BIG_ENDIAN
   float r;
   float a;
#else
   float r;
   float a;
#endif
};

void
util_format_r32a32_float_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32a32_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_float pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_float pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32a32_float_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32a32_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#else
         struct util_format_r32a32_float pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = float_to_ubyte(pixel.r); /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = float_to_ubyte(pixel.a); /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32a32_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_float pixel = {0};
         pixel.r = ubyte_to_float(src[0]);
         pixel.a = ubyte_to_float(src[3]);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)MIN2(src[0], 255)) << 8;
         value |= ((uint8_t)MIN2(src[3], 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)MIN2(src[0], 255)) & 0xff;
         value |= (uint32_t)((uint8_t)MIN2(src[3], 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 8;
         uint16_t a = (value) & 0xff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0xff;
         uint16_t a = value >> 8;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r8a8_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)((uint8_t)CLAMP(src[0], 0, 255)) << 8;
         value |= ((uint8_t)CLAMP(src[3], 0, 255)) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= ((uint8_t)CLAMP(src[0], 0, 255)) & 0xff;
         value |= (uint32_t)((uint8_t)CLAMP(src[3], 0, 255)) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r8a8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 8) ;
         value |= (uint16_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r8a8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value) ) >> 8;
         int16_t a = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         int16_t a = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_r8a8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 8) ;
         value |= (uint16_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)MIN2(src[0], 65535)) << 16;
         value |= ((uint16_t)MIN2(src[3], 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)MIN2(src[0], 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)MIN2(src[3], 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = value >> 16;
         uint32_t a = (value) & 0xffff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0xffff;
         uint32_t a = value >> 16;
         dst[0] = (unsigned)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r16a16_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)CLAMP(src[0], 0, 65535)) << 16;
         value |= ((uint16_t)CLAMP(src[3], 0, 65535)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)CLAMP(src[0], 0, 65535)) & 0xffff;
         value |= (uint32_t)((uint16_t)CLAMP(src[3], 0, 65535)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r16a16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[0], -32768, 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)CLAMP(src[3], -32768, 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)CLAMP(src[0], -32768, 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[3], -32768, 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r16a16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value) ) >> 16;
         int32_t a = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         int32_t a = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_r16a16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[0], 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)MIN2(src[3], 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)MIN2(src[0], 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[3], 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32a32_uint {
#if UTIL_ARCH_BIG_ENDIAN
   uint32_t r;
   uint32_t a;
#else
   uint32_t r;
   uint32_t a;
#endif
};

void
util_format_r32a32_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32a32_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_uint pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_uint pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32a32_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_uint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32a32_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_uint pixel = {0};
         pixel.r = (uint32_t)MAX2(src[0], 0);
         pixel.a = (uint32_t)MAX2(src[3], 0);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

struct util_format_r32a32_sint {
#if UTIL_ARCH_BIG_ENDIAN
   int32_t r;
   int32_t a;
#else
   int32_t r;
   int32_t a;
#endif
};

void
util_format_r32a32_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
      src += 8;
      dst += 4;
   }
}

void
util_format_r32a32_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_sint pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_sint pixel = {0};
         pixel.r = src[0];
         pixel.a = src[3];
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r32a32_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#else
         struct util_format_r32a32_sint pixel;
         memcpy(&pixel, src, sizeof pixel);
         dst[0] = pixel.r; /* r */
         dst[1] = 0; /* g */
         dst[2] = 0; /* b */
         dst[3] = pixel.a; /* a */
#endif
}

void
util_format_r32a32_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         struct util_format_r32a32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#else
         struct util_format_r32a32_sint pixel = {0};
         pixel.r = (int32_t)MIN2(src[0], 2147483647);
         pixel.a = (int32_t)MIN2(src[3], 2147483647);
         memcpy(dst, &pixel, sizeof pixel);
#endif
         src += 4;
         dst += 8;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_uint_unpack_unsigned(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   unsigned *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_uint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)MIN2(src[3], 3)) << 30;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 1023)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 10;
         value |= ((uint32_t)MIN2(src[0], 1023)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)MIN2(src[0], 1023)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)MIN2(src[1], 1023)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)MIN2(src[2], 1023)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)MIN2(src[3], 3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_uint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   unsigned *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t a = value >> 30;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t r = (value) & 0x3ff;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t r = (value) & 0x3ff;
         uint32_t g = (value >> 10) & 0x3ff;
         uint32_t b = (value >> 20) & 0x3ff;
         uint32_t a = value >> 30;
         dst[0] = (unsigned)r; /* r */
         dst[1] = (unsigned)g; /* g */
         dst[2] = (unsigned)b; /* b */
         dst[3] = (unsigned)a; /* a */
#endif
}

void
util_format_r10g10b10a2_uint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0, 3)) << 30;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff) << 20;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
         value |= ((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint32_t)CLAMP(src[0], 0, 1023)) & 0x3ff;
         value |= (uint32_t)(((uint32_t)CLAMP(src[1], 0, 1023)) & 0x3ff) << 10;
         value |= (uint32_t)(((uint32_t)CLAMP(src[2], 0, 1023)) & 0x3ff) << 20;
         value |= (uint32_t)((uint32_t)CLAMP(src[3], 0, 3)) << 30;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_r10g10b10a2_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)CLAMP(src[0], -512, 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[1], -512, 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)CLAMP(src[2], -512, 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)CLAMP(src[3], -2, 1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r10g10b10a2_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 30;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t r = ((int32_t)(value << 22) ) >> 22;
         int32_t g = ((int32_t)(value << 12) ) >> 22;
         int32_t b = ((int32_t)(value << 2) ) >> 22;
         int32_t a = ((int32_t)(value) ) >> 30;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_r10g10b10a2_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((uint32_t)MIN2(src[3], 1)) << 30) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((uint32_t)MIN2(src[0], 511)) & 0x3ff) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[1], 511)) & 0x3ff) << 10) ;
         value |= (uint32_t)((uint32_t)(((uint32_t)MIN2(src[2], 511)) & 0x3ff) << 20) ;
         value |= (uint32_t)((uint32_t)((uint32_t)MIN2(src[3], 1)) << 30) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g6r5_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0]) >> 3) << 11;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2]) >> 3) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[2]) >> 3) & 0x1f;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[0]) >> 3) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_b5g6r5_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_b5g6r5_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = (value) & 0x1f;
         dst[0] = util_format_srgb_to_linear_8unorm(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b << 3 | b >> 2); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = value >> 11;
         dst[0] = util_format_srgb_to_linear_8unorm(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b << 3 | b >> 2); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_b5g6r5_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0]) >> 3) << 11;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (util_format_linear_to_srgb_8unorm(src[2]) >> 3) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[2]) >> 3) & 0x1f;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[0]) >> 3) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_srgb_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g6b5_srgb_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2]) >> 3) << 11;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0]) >> 3) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_float_to_srgb_8unorm(src[0]) >> 3) & 0x1f;
         value |= (uint32_t)((util_format_linear_float_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (uint32_t)(util_format_linear_float_to_srgb_8unorm(src[2]) >> 3) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_r5g6b5_srgb_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = util_format_srgb_8unorm_to_linear_float(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_8unorm_to_linear_float(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_8unorm_to_linear_float(b << 3 | b >> 2); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_r5g6b5_srgb_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t b = value >> 11;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t r = (value) & 0x1f;
         dst[0] = util_format_srgb_to_linear_8unorm(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b << 3 | b >> 2); /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t r = (value) & 0x1f;
         uint16_t g = (value >> 5) & 0x3f;
         uint16_t b = value >> 11;
         dst[0] = util_format_srgb_to_linear_8unorm(r << 3 | r >> 2); /* r */
         dst[1] = util_format_srgb_to_linear_8unorm(g << 2 | g >> 4); /* g */
         dst[2] = util_format_srgb_to_linear_8unorm(b << 3 | b >> 2); /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_r5g6b5_srgb_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2]) >> 3) << 11;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (util_format_linear_to_srgb_8unorm(src[0]) >> 3) & 0x1f;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (util_format_linear_to_srgb_8unorm(src[0]) >> 3) & 0x1f;
         value |= (uint32_t)((util_format_linear_to_srgb_8unorm(src[1]) >> 2) & 0x3f) << 5;
         value |= (uint32_t)(util_format_linear_to_srgb_8unorm(src[2]) >> 3) << 11;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_g8r8_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(float_to_ubyte(src[1])) << 8;
         value |= (float_to_ubyte(src[0])) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (float_to_ubyte(src[1])) & 0xff;
         value |= (uint32_t)(float_to_ubyte(src[0])) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = ubyte_to_float(r); /* r */
         dst[1] = ubyte_to_float(g); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g8r8_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = value >> 8;
         uint16_t r = (value) & 0xff;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         uint16_t g = (value) & 0xff;
         uint16_t r = value >> 8;
         dst[0] = r; /* r */
         dst[1] = g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_g8r8_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint32_t)(src[1]) << 8;
         value |= (src[0]) & 0xff;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (src[1]) & 0xff;
         value |= (uint32_t)(src[0]) << 8;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value) ) >> 8;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         int16_t r = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_g8r8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) << 8) ;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value) ) >> 8;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         int16_t r = ((int16_t)(value) ) >> 8;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g8r8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value) ) >> 8;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         int16_t r = ((int16_t)(value) ) >> 8;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_g8r8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[1], 8, 8)) << 8) ;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) ;
         value |= (uint16_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value) ) >> 8;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         int16_t r = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 2;
      dst += 4;
   }
}

void
util_format_g8r8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[1], -128, 127)) << 8) ;
         value |= (uint16_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g8r8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value) ) >> 8;
         int16_t r = ((int16_t)(value << 8) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint16_t value = *(const uint16_t *)src;
         int16_t g = ((int16_t)(value << 8) ) >> 8;
         int16_t r = ((int16_t)(value) ) >> 8;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g8r8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint16_t value = 0;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[1], 127)) << 8) ;
         value |= (uint16_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         *(uint16_t *)dst = value;
#else
         uint16_t value = 0;
         value |= (uint16_t)(((int8_t)MIN2(src[1], 127)) & 0xff) ;
         value |= (uint16_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 8) ;
         *(uint16_t *)dst = value;
#endif
         src += 4;
         dst += 2;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_unorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = value >> 16;
         uint32_t r = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = (value) & 0xffff;
         uint32_t r = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_g16r16_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff)) << 16;
         value |= ((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= ((uint16_t)util_iround(CLAMP(src[1], 0.0f, 1.0f) * 0xffff)) & 0xffff;
         value |= (uint32_t)((uint16_t)util_iround(CLAMP(src[0], 0.0f, 1.0f) * 0xffff)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_unorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = value >> 16;
         uint32_t r = (value) & 0xffff;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = (value) & 0xffff;
         uint32_t r = value >> 16;
         dst[0] = (float)(r * (1.0f/0xffff)); /* r */
         dst[1] = (float)(g * (1.0f/0xffff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g16r16_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = value >> 16;
         uint32_t r = (value) & 0xffff;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         uint32_t g = (value) & 0xffff;
         uint32_t r = value >> 16;
         dst[0] = _mesa_unorm_to_unorm(r, 16, 8); /* r */
         dst[1] = _mesa_unorm_to_unorm(g, 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_g16r16_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[1], 8, 16)) << 16;
         value |= (_mesa_unorm_to_unorm(src[0], 8, 16)) & 0xffff;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (_mesa_unorm_to_unorm(src[1], 8, 16)) & 0xffff;
         value |= (uint32_t)(_mesa_unorm_to_unorm(src[0], 8, 16)) << 16;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value) ) >> 16;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         int32_t r = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_g16r16_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7fff)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7fff)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value) ) >> 16;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         int32_t r = ((int32_t)(value) ) >> 16;
         dst[0] = (float)(r * (1.0f/0x7fff)); /* r */
         dst[1] = (float)(g * (1.0f/0x7fff)); /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g16r16_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value) ) >> 16;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         int32_t r = ((int32_t)(value) ) >> 16;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 16, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 16, 8); /* g */
         dst[2] = 0; /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_g16r16_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[1], 8, 16)) << 16) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 16)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 16)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 16)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value) ) >> 16;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         int32_t r = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_g16r16_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[1], -32768, 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)CLAMP(src[0], -32768, 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)CLAMP(src[1], -32768, 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)CLAMP(src[0], -32768, 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_g16r16_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value) ) >> 16;
         int32_t r = ((int32_t)(value << 16) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t g = ((int32_t)(value << 16) ) >> 16;
         int32_t r = ((int32_t)(value) ) >> 16;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = 0; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_g16r16_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[1], 32767)) << 16) ;
         value |= (uint32_t)(((int16_t)MIN2(src[0], 32767)) & 0xffff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int16_t)MIN2(src[1], 32767)) & 0xffff) ;
         value |= (uint32_t)((uint32_t)((int16_t)MIN2(src[0], 32767)) << 16) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[3], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = (float)(a * (1.0f/0x7f)); /* a */
#endif
}

void
util_format_a8b8g8r8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = _mesa_snorm_to_unorm(MAX2(a, 0), 8, 8); /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[3], 8, 8)) << 24) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[3], 8, 8)) & 0xff) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_a8b8g8r8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[3], -128, 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)CLAMP(src[3], -128, 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_a8b8g8r8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value) ) >> 24;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t a = ((int32_t)(value << 24) ) >> 24;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = (int)a; /* a */
#endif
}

void
util_format_a8b8g8r8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[3], 127)) << 24) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)(((int8_t)MIN2(src[3], 127)) & 0xff) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_snorm_unpack_rgba_float(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   float *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_snorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride, const float *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const float *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[2], -1.0f, 1.0f) * 0x7f)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)util_iround(CLAMP(src[1], -1.0f, 1.0f) * 0x7f)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)util_iround(CLAMP(src[0], -1.0f, 1.0f) * 0x7f)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_snorm_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   float *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (float)(r * (1.0f/0x7f)); /* r */
         dst[1] = (float)(g * (1.0f/0x7f)); /* g */
         dst[2] = (float)(b * (1.0f/0x7f)); /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8b8g8r8_snorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   uint8_t *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = _mesa_snorm_to_unorm(MAX2(r, 0), 8, 8); /* r */
         dst[1] = _mesa_snorm_to_unorm(MAX2(g, 0), 8, 8); /* g */
         dst[2] = _mesa_snorm_to_unorm(MAX2(b, 0), 8, 8); /* b */
         dst[3] = 255; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_snorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride, const uint8_t *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const uint8_t *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((_mesa_unorm_to_snorm(src[0], 8, 8)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[2], 8, 8)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)((_mesa_unorm_to_snorm(src[1], 8, 8)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(_mesa_unorm_to_snorm(src[0], 8, 8)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_sint_unpack_signed(void *restrict dst_row, const uint8_t *restrict src, unsigned width)
{
   int *dst = dst_row;
   for (unsigned x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
      src += 4;
      dst += 4;
   }
}

void
util_format_x8b8g8r8_sint_pack_signed(uint8_t *restrict dst_row, unsigned dst_stride, const int *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const int *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)CLAMP(src[0], -128, 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[2], -128, 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)CLAMP(src[1], -128, 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)CLAMP(src[0], -128, 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

void
util_format_x8b8g8r8_sint_fetch_rgba(void *restrict in_dst, const uint8_t *restrict src, UNUSED unsigned i, UNUSED unsigned j)
{
   int *dst = in_dst;
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 8) ) >> 24;
         int32_t g = ((int32_t)(value << 16) ) >> 24;
         int32_t r = ((int32_t)(value << 24) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#else
         uint32_t value = *(const uint32_t *)src;
         int32_t b = ((int32_t)(value << 16) ) >> 24;
         int32_t g = ((int32_t)(value << 8) ) >> 24;
         int32_t r = ((int32_t)(value) ) >> 24;
         dst[0] = (int)r; /* r */
         dst[1] = (int)g; /* g */
         dst[2] = (int)b; /* b */
         dst[3] = 1; /* a */
#endif
}

void
util_format_x8b8g8r8_sint_pack_unsigned(uint8_t *restrict dst_row, unsigned dst_stride, const unsigned *restrict src_row, unsigned src_stride, unsigned width, unsigned height)
{
   unsigned x, y;
   for(y = 0; y < height; y += 1) {
      const unsigned *src = src_row;
      uint8_t *dst = dst_row;
      for(x = 0; x < width; x += 1) {
#if UTIL_ARCH_BIG_ENDIAN
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 8) ;
         value |= (uint32_t)(((int8_t)MIN2(src[0], 127)) & 0xff) ;
         *(uint32_t *)dst = value;
#else
         uint32_t value = 0;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[2], 127)) & 0xff) << 8) ;
         value |= (uint32_t)((uint32_t)(((int8_t)MIN2(src[1], 127)) & 0xff) << 16) ;
         value |= (uint32_t)((uint32_t)((int8_t)MIN2(src[0], 127)) << 24) ;
         *(uint32_t *)dst = value;
#endif
         src += 4;
         dst += 4;
      }
      dst_row += dst_stride;
      src_row += src_stride/sizeof(*src_row);
   }
}

static const struct util_format_description
util_format_descriptions[PIPE_FORMAT_COUNT] = {
   [PIPE_FORMAT_NONE] = {
      PIPE_FORMAT_NONE,
      "PIPE_FORMAT_NONE",
      "none",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_UNORM] = {
      PIPE_FORMAT_B8G8R8A8_UNORM,
      "PIPE_FORMAT_B8G8R8A8_UNORM",
      "b8g8r8a8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8X8_UNORM] = {
      PIPE_FORMAT_B8G8R8X8_UNORM,
      "PIPE_FORMAT_B8G8R8X8_UNORM",
      "b8g8r8x8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8X8_SNORM] = {
      PIPE_FORMAT_B8G8R8X8_SNORM,
      "PIPE_FORMAT_B8G8R8X8_SNORM",
      "b8g8r8x8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8X8_UINT] = {
      PIPE_FORMAT_B8G8R8X8_UINT,
      "PIPE_FORMAT_B8G8R8X8_UINT",
      "b8g8r8x8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8X8_SINT] = {
      PIPE_FORMAT_B8G8R8X8_SINT,
      "PIPE_FORMAT_B8G8R8X8_SINT",
      "b8g8r8x8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8R8G8B8_UNORM] = {
      PIPE_FORMAT_A8R8G8B8_UNORM,
      "PIPE_FORMAT_A8R8G8B8_UNORM",
      "a8r8g8b8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8R8G8B8_SNORM] = {
      PIPE_FORMAT_A8R8G8B8_SNORM,
      "PIPE_FORMAT_A8R8G8B8_SNORM",
      "a8r8g8b8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8R8G8B8_SINT] = {
      PIPE_FORMAT_A8R8G8B8_SINT,
      "PIPE_FORMAT_A8R8G8B8_SINT",
      "a8r8g8b8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8R8G8B8_UNORM] = {
      PIPE_FORMAT_X8R8G8B8_UNORM,
      "PIPE_FORMAT_X8R8G8B8_UNORM",
      "x8r8g8b8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8R8G8B8_SNORM] = {
      PIPE_FORMAT_X8R8G8B8_SNORM,
      "PIPE_FORMAT_X8R8G8B8_SNORM",
      "x8r8g8b8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8R8G8B8_SINT] = {
      PIPE_FORMAT_X8R8G8B8_SINT,
      "PIPE_FORMAT_X8R8G8B8_SINT",
      "x8r8g8b8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_UNORM] = {
      PIPE_FORMAT_A8B8G8R8_UNORM,
      "PIPE_FORMAT_A8B8G8R8_UNORM",
      "a8b8g8r8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8B8G8R8_UNORM] = {
      PIPE_FORMAT_X8B8G8R8_UNORM,
      "PIPE_FORMAT_X8B8G8R8_UNORM",
      "x8b8g8r8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8X8_UNORM] = {
      PIPE_FORMAT_R8G8B8X8_UNORM,
      "PIPE_FORMAT_R8G8B8X8_UNORM",
      "r8g8b8x8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5G5B5A1_UNORM] = {
      PIPE_FORMAT_R5G5B5A1_UNORM,
      "PIPE_FORMAT_R5G5B5A1_UNORM",
      "r5g5b5a1_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 15},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 15}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5G5B5X1_UNORM] = {
      PIPE_FORMAT_R5G5B5X1_UNORM,
      "PIPE_FORMAT_R5G5B5X1_UNORM",
      "r5g5b5x1_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 15},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 15}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G5R5X1_UNORM] = {
      PIPE_FORMAT_B5G5R5X1_UNORM,
      "PIPE_FORMAT_B5G5R5X1_UNORM",
      "b5g5r5x1_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 15},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 15}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G5R5A1_UNORM] = {
      PIPE_FORMAT_B5G5R5A1_UNORM,
      "PIPE_FORMAT_B5G5R5A1_UNORM",
      "b5g5r5a1_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 15},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 10},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 15}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X1B5G5R5_UNORM] = {
      PIPE_FORMAT_X1B5G5R5_UNORM,
      "PIPE_FORMAT_X1B5G5R5_UNORM",
      "x1b5g5r5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A1R5G5B5_UNORM] = {
      PIPE_FORMAT_A1R5G5B5_UNORM,
      "PIPE_FORMAT_A1R5G5B5_UNORM",
      "a1r5g5b5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X1R5G5B5_UNORM] = {
      PIPE_FORMAT_X1R5G5B5_UNORM,
      "PIPE_FORMAT_X1R5G5B5_UNORM",
      "x1r5g5b5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 1, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A1B5G5R5_UNORM] = {
      PIPE_FORMAT_A1B5G5R5_UNORM,
      "PIPE_FORMAT_A1B5G5R5_UNORM",
      "a1b5g5r5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 1, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 1},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R4G4B4A4_UNORM] = {
      PIPE_FORMAT_R4G4B4A4_UNORM,
      "PIPE_FORMAT_R4G4B4A4_UNORM",
      "r4g4b4a4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R4G4B4X4_UNORM] = {
      PIPE_FORMAT_R4G4B4X4_UNORM,
      "PIPE_FORMAT_R4G4B4X4_UNORM",
      "r4g4b4x4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 4, 12},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 4, 12}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B4G4R4A4_UNORM] = {
      PIPE_FORMAT_B4G4R4A4_UNORM,
      "PIPE_FORMAT_B4G4R4A4_UNORM",
      "b4g4r4a4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B4G4R4X4_UNORM] = {
      PIPE_FORMAT_B4G4R4X4_UNORM,
      "PIPE_FORMAT_B4G4R4X4_UNORM",
      "b4g4r4x4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 4, 12},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 4, 12}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A4R4G4B4_UNORM] = {
      PIPE_FORMAT_A4R4G4B4_UNORM,
      "PIPE_FORMAT_A4R4G4B4_UNORM",
      "a4r4g4b4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A4B4G4R4_UNORM] = {
      PIPE_FORMAT_A4B4G4R4_UNORM,
      "PIPE_FORMAT_A4B4G4R4_UNORM",
      "a4b4g4r4_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 12}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5G6B5_UNORM] = {
      PIPE_FORMAT_R5G6B5_UNORM,
      "PIPE_FORMAT_R5G6B5_UNORM",
      "r5g6b5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G6R5_UNORM] = {
      PIPE_FORMAT_B5G6R5_UNORM,
      "PIPE_FORMAT_B5G6R5_UNORM",
      "b5g6r5_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_UNORM] = {
      PIPE_FORMAT_R10G10B10A2_UNORM,
      "PIPE_FORMAT_R10G10B10A2_UNORM",
      "r10g10b10a2_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10X2_UNORM] = {
      PIPE_FORMAT_R10G10B10X2_UNORM,
      "PIPE_FORMAT_R10G10B10X2_UNORM",
      "r10g10b10x2_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_UNORM] = {
      PIPE_FORMAT_B10G10R10A2_UNORM,
      "PIPE_FORMAT_B10G10R10A2_UNORM",
      "b10g10r10a2_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A2R10G10B10_UNORM] = {
      PIPE_FORMAT_A2R10G10B10_UNORM,
      "PIPE_FORMAT_A2R10G10B10_UNORM",
      "a2r10g10b10_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 22},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 12},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 2},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 2},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 12},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 22}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A2B10G10R10_UNORM] = {
      PIPE_FORMAT_A2B10G10R10_UNORM,
      "PIPE_FORMAT_A2B10G10R10_UNORM",
      "a2b10g10r10_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 22},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 12},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 2},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 2},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 12},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 22}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R3G3B2_UNORM] = {
      PIPE_FORMAT_R3G3B2_UNORM,
      "PIPE_FORMAT_R3G3B2_UNORM",
      "r3g3b2_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 6},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 3},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 3},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 6},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B2G3R3_UNORM] = {
      PIPE_FORMAT_B2G3R3_UNORM,
      "PIPE_FORMAT_B2G3R3_UNORM",
      "b2g3r3_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 5},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 2},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 2},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 3, 5},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8_UNORM] = {
      PIPE_FORMAT_L8_UNORM,
      "PIPE_FORMAT_L8_UNORM",
      "l8_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8_UNORM] = {
      PIPE_FORMAT_A8_UNORM,
      "PIPE_FORMAT_A8_UNORM",
      "a8_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I8_UNORM] = {
      PIPE_FORMAT_I8_UNORM,
      "PIPE_FORMAT_I8_UNORM",
      "i8_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L4A4_UNORM] = {
      PIPE_FORMAT_L4A4_UNORM,
      "PIPE_FORMAT_L4A4_UNORM",
      "l4a4_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* y = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8A8_UNORM] = {
      PIPE_FORMAT_L8A8_UNORM,
      "PIPE_FORMAT_L8A8_UNORM",
      "l8a8_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16_UNORM] = {
      PIPE_FORMAT_L16_UNORM,
      "PIPE_FORMAT_L16_UNORM",
      "l16_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A16_UNORM] = {
      PIPE_FORMAT_A16_UNORM,
      "PIPE_FORMAT_A16_UNORM",
      "a16_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I16_UNORM] = {
      PIPE_FORMAT_I16_UNORM,
      "PIPE_FORMAT_I16_UNORM",
      "i16_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16A16_UNORM] = {
      PIPE_FORMAT_L16A16_UNORM,
      "PIPE_FORMAT_L16A16_UNORM",
      "l16a16_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8_SNORM] = {
      PIPE_FORMAT_A8_SNORM,
      "PIPE_FORMAT_A8_SNORM",
      "a8_snorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8_SNORM] = {
      PIPE_FORMAT_L8_SNORM,
      "PIPE_FORMAT_L8_SNORM",
      "l8_snorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8A8_SNORM] = {
      PIPE_FORMAT_L8A8_SNORM,
      "PIPE_FORMAT_L8A8_SNORM",
      "l8a8_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I8_SNORM] = {
      PIPE_FORMAT_I8_SNORM,
      "PIPE_FORMAT_I8_SNORM",
      "i8_snorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A16_SNORM] = {
      PIPE_FORMAT_A16_SNORM,
      "PIPE_FORMAT_A16_SNORM",
      "a16_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16_SNORM] = {
      PIPE_FORMAT_L16_SNORM,
      "PIPE_FORMAT_L16_SNORM",
      "l16_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16A16_SNORM] = {
      PIPE_FORMAT_L16A16_SNORM,
      "PIPE_FORMAT_L16A16_SNORM",
      "l16a16_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I16_SNORM] = {
      PIPE_FORMAT_I16_SNORM,
      "PIPE_FORMAT_I16_SNORM",
      "i16_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A16_FLOAT] = {
      PIPE_FORMAT_A16_FLOAT,
      "PIPE_FORMAT_A16_FLOAT",
      "a16_float",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16_FLOAT] = {
      PIPE_FORMAT_L16_FLOAT,
      "PIPE_FORMAT_L16_FLOAT",
      "l16_float",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16A16_FLOAT] = {
      PIPE_FORMAT_L16A16_FLOAT,
      "PIPE_FORMAT_L16A16_FLOAT",
      "l16a16_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* x = rgb */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I16_FLOAT] = {
      PIPE_FORMAT_I16_FLOAT,
      "PIPE_FORMAT_I16_FLOAT",
      "i16_float",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A32_FLOAT] = {
      PIPE_FORMAT_A32_FLOAT,
      "PIPE_FORMAT_A32_FLOAT",
      "a32_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32_FLOAT] = {
      PIPE_FORMAT_L32_FLOAT,
      "PIPE_FORMAT_L32_FLOAT",
      "l32_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32A32_FLOAT] = {
      PIPE_FORMAT_L32A32_FLOAT,
      "PIPE_FORMAT_L32A32_FLOAT",
      "l32a32_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* x = rgb */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I32_FLOAT] = {
      PIPE_FORMAT_I32_FLOAT,
      "PIPE_FORMAT_I32_FLOAT",
      "i32_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8_SRGB] = {
      PIPE_FORMAT_L8_SRGB,
      "PIPE_FORMAT_L8_SRGB",
      "l8_srgb",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_X,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8_SRGB] = {
      PIPE_FORMAT_R8_SRGB,
      "PIPE_FORMAT_R8_SRGB",
      "r8_srgb",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_0,	/* sg */
      PIPE_SWIZZLE_0,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_L8A8_SRGB] = {
      PIPE_FORMAT_L8A8_SRGB,
      "PIPE_FORMAT_L8A8_SRGB",
      "l8a8_srgb",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_X,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_X,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8G8_SRGB] = {
      PIPE_FORMAT_R8G8_SRGB,
      "PIPE_FORMAT_R8G8_SRGB",
      "r8g8_srgb",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_0,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_0,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8G8B8_SRGB] = {
      PIPE_FORMAT_R8G8B8_SRGB,
      "PIPE_FORMAT_R8G8B8_SRGB",
      "r8g8b8_srgb",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_B8G8R8_SRGB] = {
      PIPE_FORMAT_B8G8R8_SRGB,
      "PIPE_FORMAT_B8G8R8_SRGB",
      "b8g8r8_srgb",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8G8B8A8_SRGB] = {
      PIPE_FORMAT_R8G8B8A8_SRGB,
      "PIPE_FORMAT_R8G8B8A8_SRGB",
      "r8g8b8a8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_A8B8G8R8_SRGB] = {
      PIPE_FORMAT_A8B8G8R8_SRGB,
      "PIPE_FORMAT_A8B8G8R8_SRGB",
      "a8b8g8r8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_Y,	/* sb */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_Y,	/* sb */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_X8B8G8R8_SRGB] = {
      PIPE_FORMAT_X8B8G8R8_SRGB,
      "PIPE_FORMAT_X8B8G8R8_SRGB",
      "x8b8g8r8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_Y,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_Y,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_B8G8R8A8_SRGB] = {
      PIPE_FORMAT_B8G8R8A8_SRGB,
      "PIPE_FORMAT_B8G8R8A8_SRGB",
      "b8g8r8a8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_B8G8R8X8_SRGB] = {
      PIPE_FORMAT_B8G8R8X8_SRGB,
      "PIPE_FORMAT_B8G8R8X8_SRGB",
      "b8g8r8x8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_A8R8G8B8_SRGB] = {
      PIPE_FORMAT_A8R8G8B8_SRGB,
      "PIPE_FORMAT_A8R8G8B8_SRGB",
      "a8r8g8b8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_W,	/* sb */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_W,	/* sb */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_X8R8G8B8_SRGB] = {
      PIPE_FORMAT_X8R8G8B8_SRGB,
      "PIPE_FORMAT_X8R8G8B8_SRGB",
      "x8r8g8b8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_W,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* sr */
      PIPE_SWIZZLE_Z,	/* sg */
      PIPE_SWIZZLE_W,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = {
      PIPE_FORMAT_R8SG8SB8UX8U_NORM,
      "PIPE_FORMAT_R8SG8SB8UX8U_NORM",
      "r8sg8sb8ux8u_norm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = {
      PIPE_FORMAT_R10SG10SB10SA2U_NORM,
      "PIPE_FORMAT_R10SG10SB10SA2U_NORM",
      "r10sg10sb10sa2u_norm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5SG5SB6U_NORM] = {
      PIPE_FORMAT_R5SG5SB6U_NORM,
      "PIPE_FORMAT_R5SG5SB6U_NORM",
      "r5sg5sb6u_norm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 10},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 5, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 10},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_S8_UINT] = {
      PIPE_FORMAT_S8_UINT,
      "PIPE_FORMAT_S8_UINT",
      "s8_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_X,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z16_UNORM] = {
      PIPE_FORMAT_Z16_UNORM,
      "PIPE_FORMAT_Z16_UNORM",
      "z16_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z16_UNORM_S8_UINT] = {
      PIPE_FORMAT_Z16_UNORM_S8_UINT,
      "PIPE_FORMAT_Z16_UNORM_S8_UINT",
      "z16_unorm_s8_uint",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 8},	/* x = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z32_UNORM] = {
      PIPE_FORMAT_Z32_UNORM,
      "PIPE_FORMAT_Z32_UNORM",
      "z32_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* x = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z32_FLOAT] = {
      PIPE_FORMAT_Z32_FLOAT,
      "PIPE_FORMAT_Z32_FLOAT",
      "z32_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z24_UNORM_S8_UINT] = {
      PIPE_FORMAT_Z24_UNORM_S8_UINT,
      "PIPE_FORMAT_Z24_UNORM_S8_UINT",
      "z24_unorm_s8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = s */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 0},	/* y = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 0},	/* x = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* z */
      PIPE_SWIZZLE_X,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_S8_UINT_Z24_UNORM] = {
      PIPE_FORMAT_S8_UINT_Z24_UNORM,
      "PIPE_FORMAT_S8_UINT_Z24_UNORM",
      "s8_uint_z24_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 8},	/* x = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = s */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 8},	/* y = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* z */
      PIPE_SWIZZLE_X,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_X24S8_UINT] = {
      PIPE_FORMAT_X24S8_UINT,
      "PIPE_FORMAT_X24S8_UINT",
      "x24s8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = s */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 0},	/* y = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_X,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_S8X24_UINT] = {
      PIPE_FORMAT_S8X24_UINT,
      "PIPE_FORMAT_S8X24_UINT",
      "s8x24_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 8},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = s */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = s */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 8},	/* y = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_X,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z24X8_UNORM] = {
      PIPE_FORMAT_Z24X8_UNORM,
      "PIPE_FORMAT_Z24X8_UNORM",
      "z24x8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 0},	/* y = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 0},	/* x = z */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* y = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_X8Z24_UNORM] = {
      PIPE_FORMAT_X8Z24_UNORM,
      "PIPE_FORMAT_X8Z24_UNORM",
      "x8z24_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 8},	/* x = z */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* y = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 24, 8},	/* y = z */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* z */
      PIPE_SWIZZLE_NONE,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = {
      PIPE_FORMAT_Z32_FLOAT_S8X24_UINT,
      "PIPE_FORMAT_Z32_FLOAT_S8X24_UINT",
      "z32_float_s8x24_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      TRUE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* x = z */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 8},	/* y = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* z = s */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 32},	/* y = s */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 40},	/* z = x */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Z,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_X32_S8X24_UINT] = {
      PIPE_FORMAT_X32_S8X24_UINT,
      "PIPE_FORMAT_X32_S8X24_UINT",
      "x32_s8x24_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 32},	/* x = x */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 8},	/* y = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* z = s */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 32},	/* y = s */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 24, 40},	/* z = x */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_Z,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_NONE,	/* z */
      PIPE_SWIZZLE_Y,	/* s */
      PIPE_SWIZZLE_NONE,	/* ignored */
      PIPE_SWIZZLE_NONE	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_ZS,
   },

   [PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8] = {
      PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8,
      "PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8",
      "z24_unorm_s8_uint_as_r8g8b8a8",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_UYVY] = {
      PIPE_FORMAT_UYVY,
      "PIPE_FORMAT_UYVY",
      "uyvy",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_YUYV] = {
      PIPE_FORMAT_YUYV,
      "PIPE_FORMAT_YUYV",
      "yuyv",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_AYUV] = {
      PIPE_FORMAT_AYUV,
      "PIPE_FORMAT_AYUV",
      "ayuv",
      {4, 4, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_XYUV] = {
      PIPE_FORMAT_XYUV,
      "PIPE_FORMAT_XYUV",
      "xyuv",
      {4, 4, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_R8G8_B8G8_UNORM] = {
      PIPE_FORMAT_R8G8_B8G8_UNORM,
      "PIPE_FORMAT_R8G8_B8G8_UNORM",
      "r8g8_b8g8_unorm",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8R8_G8B8_UNORM] = {
      PIPE_FORMAT_G8R8_G8B8_UNORM,
      "PIPE_FORMAT_G8R8_G8B8_UNORM",
      "g8r8_g8b8_unorm",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8R8_B8R8_UNORM] = {
      PIPE_FORMAT_G8R8_B8R8_UNORM,
      "PIPE_FORMAT_G8R8_B8R8_UNORM",
      "g8r8_b8r8_unorm",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_R8B8_UNORM] = {
      PIPE_FORMAT_R8G8_R8B8_UNORM,
      "PIPE_FORMAT_R8G8_R8B8_UNORM",
      "r8g8_r8b8_unorm",
      {2, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R11G11B10_FLOAT] = {
      PIPE_FORMAT_R11G11B10_FLOAT,
      "PIPE_FORMAT_R11G11B10_FLOAT",
      "r11g11b10_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 11, 21},	/* x = x */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 11, 10},	/* y = y */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 10, 0},	/* z = z */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 11, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 11, 11},	/* y = y */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 10, 22},	/* z = z */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R9G9B9E5_FLOAT] = {
      PIPE_FORMAT_R9G9B9E5_FLOAT,
      "PIPE_FORMAT_R9G9B9E5_FLOAT",
      "r9g9b9e5_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 23},	/* x = x */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 14},	/* y = y */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 5},	/* z = z */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 5, 0}	/* w = w */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 9},	/* y = y */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 9, 18},	/* z = z */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 5, 27}	/* w = w */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R1_UNORM] = {
      PIPE_FORMAT_R1_UNORM,
      "PIPE_FORMAT_R1_UNORM",
      "r1_unorm",
      {8, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8Bx_SNORM] = {
      PIPE_FORMAT_R8G8Bx_SNORM,
      "PIPE_FORMAT_R8G8Bx_SNORM",
      "r8g8bx_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* y = y */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = y */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_DXT1_RGB] = {
      PIPE_FORMAT_DXT1_RGB,
      "PIPE_FORMAT_DXT1_RGB",
      "dxt1_rgb",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_DXT1_RGBA] = {
      PIPE_FORMAT_DXT1_RGBA,
      "PIPE_FORMAT_DXT1_RGBA",
      "dxt1_rgba",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_DXT3_RGBA] = {
      PIPE_FORMAT_DXT3_RGBA,
      "PIPE_FORMAT_DXT3_RGBA",
      "dxt3_rgba",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_DXT5_RGBA] = {
      PIPE_FORMAT_DXT5_RGBA,
      "PIPE_FORMAT_DXT5_RGBA",
      "dxt5_rgba",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_DXT1_SRGB] = {
      PIPE_FORMAT_DXT1_SRGB,
      "PIPE_FORMAT_DXT1_SRGB",
      "dxt1_srgb",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_DXT1_SRGBA] = {
      PIPE_FORMAT_DXT1_SRGBA,
      "PIPE_FORMAT_DXT1_SRGBA",
      "dxt1_srgba",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_DXT3_SRGBA] = {
      PIPE_FORMAT_DXT3_SRGBA,
      "PIPE_FORMAT_DXT3_SRGBA",
      "dxt3_srgba",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_DXT5_SRGBA] = {
      PIPE_FORMAT_DXT5_SRGBA,
      "PIPE_FORMAT_DXT5_SRGBA",
      "dxt5_srgba",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_S3TC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_FXT1_RGB] = {
      PIPE_FORMAT_FXT1_RGB,
      "PIPE_FORMAT_FXT1_RGB",
      "fxt1_rgb",
      {8, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_FXT1,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_FXT1_RGBA] = {
      PIPE_FORMAT_FXT1_RGBA,
      "PIPE_FORMAT_FXT1_RGBA",
      "fxt1_rgba",
      {8, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_FXT1,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_RGTC1_UNORM] = {
      PIPE_FORMAT_RGTC1_UNORM,
      "PIPE_FORMAT_RGTC1_UNORM",
      "rgtc1_unorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_RGTC1_SNORM] = {
      PIPE_FORMAT_RGTC1_SNORM,
      "PIPE_FORMAT_RGTC1_SNORM",
      "rgtc1_snorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_RGTC2_UNORM] = {
      PIPE_FORMAT_RGTC2_UNORM,
      "PIPE_FORMAT_RGTC2_UNORM",
      "rgtc2_unorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_RGTC2_SNORM] = {
      PIPE_FORMAT_RGTC2_SNORM,
      "PIPE_FORMAT_RGTC2_SNORM",
      "rgtc2_snorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_LATC1_UNORM] = {
      PIPE_FORMAT_LATC1_UNORM,
      "PIPE_FORMAT_LATC1_UNORM",
      "latc1_unorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_LATC1_SNORM] = {
      PIPE_FORMAT_LATC1_SNORM,
      "PIPE_FORMAT_LATC1_SNORM",
      "latc1_snorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_LATC2_UNORM] = {
      PIPE_FORMAT_LATC2_UNORM,
      "PIPE_FORMAT_LATC2_UNORM",
      "latc2_unorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_LATC2_SNORM] = {
      PIPE_FORMAT_LATC2_SNORM,
      "PIPE_FORMAT_LATC2_SNORM",
      "latc2_snorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_RGTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC1_RGB8] = {
      PIPE_FORMAT_ETC1_RGB8,
      "PIPE_FORMAT_ETC1_RGB8",
      "etc1_rgb8",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_RGB8] = {
      PIPE_FORMAT_ETC2_RGB8,
      "PIPE_FORMAT_ETC2_RGB8",
      "etc2_rgb8",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_SRGB8] = {
      PIPE_FORMAT_ETC2_SRGB8,
      "PIPE_FORMAT_ETC2_SRGB8",
      "etc2_srgb8",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ETC2_RGB8A1] = {
      PIPE_FORMAT_ETC2_RGB8A1,
      "PIPE_FORMAT_ETC2_RGB8A1",
      "etc2_rgb8a1",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_SRGB8A1] = {
      PIPE_FORMAT_ETC2_SRGB8A1,
      "PIPE_FORMAT_ETC2_SRGB8A1",
      "etc2_srgb8a1",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ETC2_RGBA8] = {
      PIPE_FORMAT_ETC2_RGBA8,
      "PIPE_FORMAT_ETC2_RGBA8",
      "etc2_rgba8",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_SRGBA8] = {
      PIPE_FORMAT_ETC2_SRGBA8,
      "PIPE_FORMAT_ETC2_SRGBA8",
      "etc2_srgba8",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ETC2_R11_UNORM] = {
      PIPE_FORMAT_ETC2_R11_UNORM,
      "PIPE_FORMAT_ETC2_R11_UNORM",
      "etc2_r11_unorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_R11_SNORM] = {
      PIPE_FORMAT_ETC2_R11_SNORM,
      "PIPE_FORMAT_ETC2_R11_SNORM",
      "etc2_r11_snorm",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_RG11_UNORM] = {
      PIPE_FORMAT_ETC2_RG11_UNORM,
      "PIPE_FORMAT_ETC2_RG11_UNORM",
      "etc2_rg11_unorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ETC2_RG11_SNORM] = {
      PIPE_FORMAT_ETC2_RG11_SNORM,
      "PIPE_FORMAT_ETC2_RG11_SNORM",
      "etc2_rg11_snorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ETC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_BPTC_RGBA_UNORM] = {
      PIPE_FORMAT_BPTC_RGBA_UNORM,
      "PIPE_FORMAT_BPTC_RGBA_UNORM",
      "bptc_rgba_unorm",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_BPTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_BPTC_SRGBA] = {
      PIPE_FORMAT_BPTC_SRGBA,
      "PIPE_FORMAT_BPTC_SRGBA",
      "bptc_srgba",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_BPTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_BPTC_RGB_FLOAT] = {
      PIPE_FORMAT_BPTC_RGB_FLOAT,
      "PIPE_FORMAT_BPTC_RGB_FLOAT",
      "bptc_rgb_float",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_BPTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_BPTC_RGB_UFLOAT] = {
      PIPE_FORMAT_BPTC_RGB_UFLOAT,
      "PIPE_FORMAT_BPTC_RGB_UFLOAT",
      "bptc_rgb_ufloat",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_BPTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_4x4] = {
      PIPE_FORMAT_ASTC_4x4,
      "PIPE_FORMAT_ASTC_4x4",
      "astc_4x4",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_5x4] = {
      PIPE_FORMAT_ASTC_5x4,
      "PIPE_FORMAT_ASTC_5x4",
      "astc_5x4",
      {5, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_5x5] = {
      PIPE_FORMAT_ASTC_5x5,
      "PIPE_FORMAT_ASTC_5x5",
      "astc_5x5",
      {5, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_6x5] = {
      PIPE_FORMAT_ASTC_6x5,
      "PIPE_FORMAT_ASTC_6x5",
      "astc_6x5",
      {6, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_6x6] = {
      PIPE_FORMAT_ASTC_6x6,
      "PIPE_FORMAT_ASTC_6x6",
      "astc_6x6",
      {6, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_8x5] = {
      PIPE_FORMAT_ASTC_8x5,
      "PIPE_FORMAT_ASTC_8x5",
      "astc_8x5",
      {8, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_8x6] = {
      PIPE_FORMAT_ASTC_8x6,
      "PIPE_FORMAT_ASTC_8x6",
      "astc_8x6",
      {8, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_8x8] = {
      PIPE_FORMAT_ASTC_8x8,
      "PIPE_FORMAT_ASTC_8x8",
      "astc_8x8",
      {8, 8, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_10x5] = {
      PIPE_FORMAT_ASTC_10x5,
      "PIPE_FORMAT_ASTC_10x5",
      "astc_10x5",
      {10, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_10x6] = {
      PIPE_FORMAT_ASTC_10x6,
      "PIPE_FORMAT_ASTC_10x6",
      "astc_10x6",
      {10, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_10x8] = {
      PIPE_FORMAT_ASTC_10x8,
      "PIPE_FORMAT_ASTC_10x8",
      "astc_10x8",
      {10, 8, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_10x10] = {
      PIPE_FORMAT_ASTC_10x10,
      "PIPE_FORMAT_ASTC_10x10",
      "astc_10x10",
      {10, 10, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_12x10] = {
      PIPE_FORMAT_ASTC_12x10,
      "PIPE_FORMAT_ASTC_12x10",
      "astc_12x10",
      {12, 10, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_12x12] = {
      PIPE_FORMAT_ASTC_12x12,
      "PIPE_FORMAT_ASTC_12x12",
      "astc_12x12",
      {12, 12, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_4x4_SRGB] = {
      PIPE_FORMAT_ASTC_4x4_SRGB,
      "PIPE_FORMAT_ASTC_4x4_SRGB",
      "astc_4x4_srgb",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_5x4_SRGB] = {
      PIPE_FORMAT_ASTC_5x4_SRGB,
      "PIPE_FORMAT_ASTC_5x4_SRGB",
      "astc_5x4_srgb",
      {5, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_5x5_SRGB] = {
      PIPE_FORMAT_ASTC_5x5_SRGB,
      "PIPE_FORMAT_ASTC_5x5_SRGB",
      "astc_5x5_srgb",
      {5, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_6x5_SRGB] = {
      PIPE_FORMAT_ASTC_6x5_SRGB,
      "PIPE_FORMAT_ASTC_6x5_SRGB",
      "astc_6x5_srgb",
      {6, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_6x6_SRGB] = {
      PIPE_FORMAT_ASTC_6x6_SRGB,
      "PIPE_FORMAT_ASTC_6x6_SRGB",
      "astc_6x6_srgb",
      {6, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_8x5_SRGB] = {
      PIPE_FORMAT_ASTC_8x5_SRGB,
      "PIPE_FORMAT_ASTC_8x5_SRGB",
      "astc_8x5_srgb",
      {8, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_8x6_SRGB] = {
      PIPE_FORMAT_ASTC_8x6_SRGB,
      "PIPE_FORMAT_ASTC_8x6_SRGB",
      "astc_8x6_srgb",
      {8, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_8x8_SRGB] = {
      PIPE_FORMAT_ASTC_8x8_SRGB,
      "PIPE_FORMAT_ASTC_8x8_SRGB",
      "astc_8x8_srgb",
      {8, 8, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_10x5_SRGB] = {
      PIPE_FORMAT_ASTC_10x5_SRGB,
      "PIPE_FORMAT_ASTC_10x5_SRGB",
      "astc_10x5_srgb",
      {10, 5, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_10x6_SRGB] = {
      PIPE_FORMAT_ASTC_10x6_SRGB,
      "PIPE_FORMAT_ASTC_10x6_SRGB",
      "astc_10x6_srgb",
      {10, 6, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_10x8_SRGB] = {
      PIPE_FORMAT_ASTC_10x8_SRGB,
      "PIPE_FORMAT_ASTC_10x8_SRGB",
      "astc_10x8_srgb",
      {10, 8, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_10x10_SRGB] = {
      PIPE_FORMAT_ASTC_10x10_SRGB,
      "PIPE_FORMAT_ASTC_10x10_SRGB",
      "astc_10x10_srgb",
      {10, 10, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_12x10_SRGB] = {
      PIPE_FORMAT_ASTC_12x10_SRGB,
      "PIPE_FORMAT_ASTC_12x10_SRGB",
      "astc_12x10_srgb",
      {12, 10, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_12x12_SRGB] = {
      PIPE_FORMAT_ASTC_12x12_SRGB,
      "PIPE_FORMAT_ASTC_12x12_SRGB",
      "astc_12x12_srgb",
      {12, 12, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_3x3x3] = {
      PIPE_FORMAT_ASTC_3x3x3,
      "PIPE_FORMAT_ASTC_3x3x3",
      "astc_3x3x3",
      {3, 3, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_4x3x3] = {
      PIPE_FORMAT_ASTC_4x3x3,
      "PIPE_FORMAT_ASTC_4x3x3",
      "astc_4x3x3",
      {4, 3, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_4x4x3] = {
      PIPE_FORMAT_ASTC_4x4x3,
      "PIPE_FORMAT_ASTC_4x4x3",
      "astc_4x4x3",
      {4, 4, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_4x4x4] = {
      PIPE_FORMAT_ASTC_4x4x4,
      "PIPE_FORMAT_ASTC_4x4x4",
      "astc_4x4x4",
      {4, 4, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_5x4x4] = {
      PIPE_FORMAT_ASTC_5x4x4,
      "PIPE_FORMAT_ASTC_5x4x4",
      "astc_5x4x4",
      {5, 4, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_5x5x4] = {
      PIPE_FORMAT_ASTC_5x5x4,
      "PIPE_FORMAT_ASTC_5x5x4",
      "astc_5x5x4",
      {5, 5, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_5x5x5] = {
      PIPE_FORMAT_ASTC_5x5x5,
      "PIPE_FORMAT_ASTC_5x5x5",
      "astc_5x5x5",
      {5, 5, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_6x5x5] = {
      PIPE_FORMAT_ASTC_6x5x5,
      "PIPE_FORMAT_ASTC_6x5x5",
      "astc_6x5x5",
      {6, 5, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_6x6x5] = {
      PIPE_FORMAT_ASTC_6x6x5,
      "PIPE_FORMAT_ASTC_6x6x5",
      "astc_6x6x5",
      {6, 6, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_6x6x6] = {
      PIPE_FORMAT_ASTC_6x6x6,
      "PIPE_FORMAT_ASTC_6x6x6",
      "astc_6x6x6",
      {6, 6, 6, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ASTC_3x3x3_SRGB] = {
      PIPE_FORMAT_ASTC_3x3x3_SRGB,
      "PIPE_FORMAT_ASTC_3x3x3_SRGB",
      "astc_3x3x3_srgb",
      {3, 3, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_4x3x3_SRGB] = {
      PIPE_FORMAT_ASTC_4x3x3_SRGB,
      "PIPE_FORMAT_ASTC_4x3x3_SRGB",
      "astc_4x3x3_srgb",
      {4, 3, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_4x4x3_SRGB] = {
      PIPE_FORMAT_ASTC_4x4x3_SRGB,
      "PIPE_FORMAT_ASTC_4x4x3_SRGB",
      "astc_4x4x3_srgb",
      {4, 4, 3, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_4x4x4_SRGB] = {
      PIPE_FORMAT_ASTC_4x4x4_SRGB,
      "PIPE_FORMAT_ASTC_4x4x4_SRGB",
      "astc_4x4x4_srgb",
      {4, 4, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_5x4x4_SRGB] = {
      PIPE_FORMAT_ASTC_5x4x4_SRGB,
      "PIPE_FORMAT_ASTC_5x4x4_SRGB",
      "astc_5x4x4_srgb",
      {5, 4, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_5x5x4_SRGB] = {
      PIPE_FORMAT_ASTC_5x5x4_SRGB,
      "PIPE_FORMAT_ASTC_5x5x4_SRGB",
      "astc_5x5x4_srgb",
      {5, 5, 4, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_5x5x5_SRGB] = {
      PIPE_FORMAT_ASTC_5x5x5_SRGB,
      "PIPE_FORMAT_ASTC_5x5x5_SRGB",
      "astc_5x5x5_srgb",
      {5, 5, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_6x5x5_SRGB] = {
      PIPE_FORMAT_ASTC_6x5x5_SRGB,
      "PIPE_FORMAT_ASTC_6x5x5_SRGB",
      "astc_6x5x5_srgb",
      {6, 5, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_6x6x5_SRGB] = {
      PIPE_FORMAT_ASTC_6x6x5_SRGB,
      "PIPE_FORMAT_ASTC_6x6x5_SRGB",
      "astc_6x6x5_srgb",
      {6, 6, 5, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ASTC_6x6x6_SRGB] = {
      PIPE_FORMAT_ASTC_6x6x6_SRGB,
      "PIPE_FORMAT_ASTC_6x6x6_SRGB",
      "astc_6x6x6_srgb",
      {6, 6, 6, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ASTC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_ATC_RGB] = {
      PIPE_FORMAT_ATC_RGB,
      "PIPE_FORMAT_ATC_RGB",
      "atc_rgb",
      {4, 4, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_ATC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ATC_RGBA_EXPLICIT] = {
      PIPE_FORMAT_ATC_RGBA_EXPLICIT,
      "PIPE_FORMAT_ATC_RGBA_EXPLICIT",
      "atc_rgba_explicit",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ATC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_ATC_RGBA_INTERPOLATED] = {
      PIPE_FORMAT_ATC_RGBA_INTERPOLATED,
      "PIPE_FORMAT_ATC_RGBA_INTERPOLATED",
      "atc_rgba_interpolated",
      {4, 4, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_ATC,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 128, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64_FLOAT] = {
      PIPE_FORMAT_R64_FLOAT,
      "PIPE_FORMAT_R64_FLOAT",
      "r64_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64_FLOAT] = {
      PIPE_FORMAT_R64G64_FLOAT,
      "PIPE_FORMAT_R64G64_FLOAT",
      "r64g64_float",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64B64_FLOAT] = {
      PIPE_FORMAT_R64G64B64_FLOAT,
      "PIPE_FORMAT_R64G64B64_FLOAT",
      "r64g64b64_float",
      {1, 1, 1, 192},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 128},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 128},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64B64A64_FLOAT] = {
      PIPE_FORMAT_R64G64B64A64_FLOAT,
      "PIPE_FORMAT_R64G64B64A64_FLOAT",
      "r64g64b64a64_float",
      {1, 1, 1, 256},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 192},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 128},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 128},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 64, 192}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_FLOAT] = {
      PIPE_FORMAT_R32_FLOAT,
      "PIPE_FORMAT_R32_FLOAT",
      "r32_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_FLOAT] = {
      PIPE_FORMAT_R32G32_FLOAT,
      "PIPE_FORMAT_R32G32_FLOAT",
      "r32g32_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_FLOAT] = {
      PIPE_FORMAT_R32G32B32_FLOAT,
      "PIPE_FORMAT_R32G32B32_FLOAT",
      "r32g32b32_float",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_FLOAT] = {
      PIPE_FORMAT_R32G32B32A32_FLOAT,
      "PIPE_FORMAT_R32G32B32A32_FLOAT",
      "r32g32b32a32_float",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_UNORM] = {
      PIPE_FORMAT_R32_UNORM,
      "PIPE_FORMAT_R32_UNORM",
      "r32_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_UNORM] = {
      PIPE_FORMAT_R32G32_UNORM,
      "PIPE_FORMAT_R32G32_UNORM",
      "r32g32_unorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_UNORM] = {
      PIPE_FORMAT_R32G32B32_UNORM,
      "PIPE_FORMAT_R32G32B32_UNORM",
      "r32g32b32_unorm",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_UNORM] = {
      PIPE_FORMAT_R32G32B32A32_UNORM,
      "PIPE_FORMAT_R32G32B32A32_UNORM",
      "r32g32b32a32_unorm",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_USCALED] = {
      PIPE_FORMAT_R32_USCALED,
      "PIPE_FORMAT_R32_USCALED",
      "r32_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_USCALED] = {
      PIPE_FORMAT_R32G32_USCALED,
      "PIPE_FORMAT_R32G32_USCALED",
      "r32g32_uscaled",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_USCALED] = {
      PIPE_FORMAT_R32G32B32_USCALED,
      "PIPE_FORMAT_R32G32B32_USCALED",
      "r32g32b32_uscaled",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_USCALED] = {
      PIPE_FORMAT_R32G32B32A32_USCALED,
      "PIPE_FORMAT_R32G32B32A32_USCALED",
      "r32g32b32a32_uscaled",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_SNORM] = {
      PIPE_FORMAT_R32_SNORM,
      "PIPE_FORMAT_R32_SNORM",
      "r32_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_SNORM] = {
      PIPE_FORMAT_R32G32_SNORM,
      "PIPE_FORMAT_R32G32_SNORM",
      "r32g32_snorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_SNORM] = {
      PIPE_FORMAT_R32G32B32_SNORM,
      "PIPE_FORMAT_R32G32B32_SNORM",
      "r32g32b32_snorm",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_SNORM] = {
      PIPE_FORMAT_R32G32B32A32_SNORM,
      "PIPE_FORMAT_R32G32B32A32_SNORM",
      "r32g32b32a32_snorm",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_SSCALED] = {
      PIPE_FORMAT_R32_SSCALED,
      "PIPE_FORMAT_R32_SSCALED",
      "r32_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_SSCALED] = {
      PIPE_FORMAT_R32G32_SSCALED,
      "PIPE_FORMAT_R32G32_SSCALED",
      "r32g32_sscaled",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_SSCALED] = {
      PIPE_FORMAT_R32G32B32_SSCALED,
      "PIPE_FORMAT_R32G32B32_SSCALED",
      "r32g32b32_sscaled",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_SSCALED] = {
      PIPE_FORMAT_R32G32B32A32_SSCALED,
      "PIPE_FORMAT_R32G32B32A32_SSCALED",
      "r32g32b32a32_sscaled",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_FLOAT] = {
      PIPE_FORMAT_R16_FLOAT,
      "PIPE_FORMAT_R16_FLOAT",
      "r16_float",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_FLOAT] = {
      PIPE_FORMAT_R16G16_FLOAT,
      "PIPE_FORMAT_R16G16_FLOAT",
      "r16g16_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_FLOAT] = {
      PIPE_FORMAT_R16G16B16_FLOAT,
      "PIPE_FORMAT_R16G16B16_FLOAT",
      "r16g16b16_float",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_FLOAT] = {
      PIPE_FORMAT_R16G16B16A16_FLOAT,
      "PIPE_FORMAT_R16G16B16A16_FLOAT",
      "r16g16b16a16_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_UNORM] = {
      PIPE_FORMAT_R16_UNORM,
      "PIPE_FORMAT_R16_UNORM",
      "r16_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_UNORM] = {
      PIPE_FORMAT_R16G16_UNORM,
      "PIPE_FORMAT_R16G16_UNORM",
      "r16g16_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_UNORM] = {
      PIPE_FORMAT_R16G16B16_UNORM,
      "PIPE_FORMAT_R16G16B16_UNORM",
      "r16g16b16_unorm",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_UNORM] = {
      PIPE_FORMAT_R16G16B16A16_UNORM,
      "PIPE_FORMAT_R16G16B16A16_UNORM",
      "r16g16b16a16_unorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_USCALED] = {
      PIPE_FORMAT_R16_USCALED,
      "PIPE_FORMAT_R16_USCALED",
      "r16_uscaled",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_USCALED] = {
      PIPE_FORMAT_R16G16_USCALED,
      "PIPE_FORMAT_R16G16_USCALED",
      "r16g16_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_USCALED] = {
      PIPE_FORMAT_R16G16B16_USCALED,
      "PIPE_FORMAT_R16G16B16_USCALED",
      "r16g16b16_uscaled",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_USCALED] = {
      PIPE_FORMAT_R16G16B16A16_USCALED,
      "PIPE_FORMAT_R16G16B16A16_USCALED",
      "r16g16b16a16_uscaled",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_SNORM] = {
      PIPE_FORMAT_R16_SNORM,
      "PIPE_FORMAT_R16_SNORM",
      "r16_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_SNORM] = {
      PIPE_FORMAT_R16G16_SNORM,
      "PIPE_FORMAT_R16G16_SNORM",
      "r16g16_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_SNORM] = {
      PIPE_FORMAT_R16G16B16_SNORM,
      "PIPE_FORMAT_R16G16B16_SNORM",
      "r16g16b16_snorm",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_SNORM] = {
      PIPE_FORMAT_R16G16B16A16_SNORM,
      "PIPE_FORMAT_R16G16B16A16_SNORM",
      "r16g16b16a16_snorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_SSCALED] = {
      PIPE_FORMAT_R16_SSCALED,
      "PIPE_FORMAT_R16_SSCALED",
      "r16_sscaled",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_SSCALED] = {
      PIPE_FORMAT_R16G16_SSCALED,
      "PIPE_FORMAT_R16G16_SSCALED",
      "r16g16_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_SSCALED] = {
      PIPE_FORMAT_R16G16B16_SSCALED,
      "PIPE_FORMAT_R16G16B16_SSCALED",
      "r16g16b16_sscaled",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_SSCALED] = {
      PIPE_FORMAT_R16G16B16A16_SSCALED,
      "PIPE_FORMAT_R16G16B16A16_SSCALED",
      "r16g16b16a16_sscaled",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_UNORM] = {
      PIPE_FORMAT_R8_UNORM,
      "PIPE_FORMAT_R8_UNORM",
      "r8_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_UNORM] = {
      PIPE_FORMAT_R8G8_UNORM,
      "PIPE_FORMAT_R8G8_UNORM",
      "r8g8_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_UNORM] = {
      PIPE_FORMAT_R8G8B8_UNORM,
      "PIPE_FORMAT_R8G8B8_UNORM",
      "r8g8b8_unorm",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_UNORM] = {
      PIPE_FORMAT_B8G8R8_UNORM,
      "PIPE_FORMAT_B8G8R8_UNORM",
      "b8g8r8_unorm",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_UNORM] = {
      PIPE_FORMAT_R8G8B8A8_UNORM,
      "PIPE_FORMAT_R8G8B8A8_UNORM",
      "r8g8b8a8_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_USCALED] = {
      PIPE_FORMAT_R8_USCALED,
      "PIPE_FORMAT_R8_USCALED",
      "r8_uscaled",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_USCALED] = {
      PIPE_FORMAT_R8G8_USCALED,
      "PIPE_FORMAT_R8G8_USCALED",
      "r8g8_uscaled",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_USCALED] = {
      PIPE_FORMAT_R8G8B8_USCALED,
      "PIPE_FORMAT_R8G8B8_USCALED",
      "r8g8b8_uscaled",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_USCALED] = {
      PIPE_FORMAT_B8G8R8_USCALED,
      "PIPE_FORMAT_B8G8R8_USCALED",
      "b8g8r8_uscaled",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_USCALED] = {
      PIPE_FORMAT_R8G8B8A8_USCALED,
      "PIPE_FORMAT_R8G8B8A8_USCALED",
      "r8g8b8a8_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_USCALED] = {
      PIPE_FORMAT_B8G8R8A8_USCALED,
      "PIPE_FORMAT_B8G8R8A8_USCALED",
      "b8g8r8a8_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_USCALED] = {
      PIPE_FORMAT_A8B8G8R8_USCALED,
      "PIPE_FORMAT_A8B8G8R8_USCALED",
      "a8b8g8r8_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_SNORM] = {
      PIPE_FORMAT_R8_SNORM,
      "PIPE_FORMAT_R8_SNORM",
      "r8_snorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_SNORM] = {
      PIPE_FORMAT_R8G8_SNORM,
      "PIPE_FORMAT_R8G8_SNORM",
      "r8g8_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_SNORM] = {
      PIPE_FORMAT_R8G8B8_SNORM,
      "PIPE_FORMAT_R8G8B8_SNORM",
      "r8g8b8_snorm",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_SNORM] = {
      PIPE_FORMAT_B8G8R8_SNORM,
      "PIPE_FORMAT_B8G8R8_SNORM",
      "b8g8r8_snorm",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_SNORM] = {
      PIPE_FORMAT_R8G8B8A8_SNORM,
      "PIPE_FORMAT_R8G8B8A8_SNORM",
      "r8g8b8a8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_SNORM] = {
      PIPE_FORMAT_B8G8R8A8_SNORM,
      "PIPE_FORMAT_B8G8R8A8_SNORM",
      "b8g8r8a8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_SSCALED] = {
      PIPE_FORMAT_R8_SSCALED,
      "PIPE_FORMAT_R8_SSCALED",
      "r8_sscaled",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_SSCALED] = {
      PIPE_FORMAT_R8G8_SSCALED,
      "PIPE_FORMAT_R8G8_SSCALED",
      "r8g8_sscaled",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_SSCALED] = {
      PIPE_FORMAT_R8G8B8_SSCALED,
      "PIPE_FORMAT_R8G8B8_SSCALED",
      "r8g8b8_sscaled",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_SSCALED] = {
      PIPE_FORMAT_B8G8R8_SSCALED,
      "PIPE_FORMAT_B8G8R8_SSCALED",
      "b8g8r8_sscaled",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_SSCALED] = {
      PIPE_FORMAT_R8G8B8A8_SSCALED,
      "PIPE_FORMAT_R8G8B8A8_SSCALED",
      "r8g8b8a8_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_SSCALED] = {
      PIPE_FORMAT_B8G8R8A8_SSCALED,
      "PIPE_FORMAT_B8G8R8A8_SSCALED",
      "b8g8r8a8_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_SSCALED] = {
      PIPE_FORMAT_A8B8G8R8_SSCALED,
      "PIPE_FORMAT_A8B8G8R8_SSCALED",
      "a8b8g8r8_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_FIXED] = {
      PIPE_FORMAT_R32_FIXED,
      "PIPE_FORMAT_R32_FIXED",
      "r32_fixed",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_FIXED] = {
      PIPE_FORMAT_R32G32_FIXED,
      "PIPE_FORMAT_R32G32_FIXED",
      "r32g32_fixed",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_FIXED] = {
      PIPE_FORMAT_R32G32B32_FIXED,
      "PIPE_FORMAT_R32G32B32_FIXED",
      "r32g32b32_fixed",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_FIXED] = {
      PIPE_FORMAT_R32G32B32A32_FIXED,
      "PIPE_FORMAT_R32G32B32A32_FIXED",
      "r32g32b32a32_fixed",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_FIXED, FALSE, FALSE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10X2_USCALED] = {
      PIPE_FORMAT_R10G10B10X2_USCALED,
      "PIPE_FORMAT_R10G10B10X2_USCALED",
      "r10g10b10x2_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10X2_SNORM] = {
      PIPE_FORMAT_R10G10B10X2_SNORM,
      "PIPE_FORMAT_R10G10B10X2_SNORM",
      "r10g10b10x2_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10X2_SINT] = {
      PIPE_FORMAT_R10G10B10X2_SINT,
      "PIPE_FORMAT_R10G10B10X2_SINT",
      "r10g10b10x2_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_YV12] = {
      PIPE_FORMAT_YV12,
      "PIPE_FORMAT_YV12",
      "yv12",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_YV16] = {
      PIPE_FORMAT_YV16,
      "PIPE_FORMAT_YV16",
      "yv16",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_IYUV] = {
      PIPE_FORMAT_IYUV,
      "PIPE_FORMAT_IYUV",
      "iyuv",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_NV12] = {
      PIPE_FORMAT_NV12,
      "PIPE_FORMAT_NV12",
      "nv12",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_NV21] = {
      PIPE_FORMAT_NV21,
      "PIPE_FORMAT_NV21",
      "nv21",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_R8_G8B8_420_UNORM] = {
      PIPE_FORMAT_R8_G8B8_420_UNORM,
      "PIPE_FORMAT_R8_G8B8_420_UNORM",
      "r8_g8b8_420_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8_B8R8_420_UNORM] = {
      PIPE_FORMAT_G8_B8R8_420_UNORM,
      "PIPE_FORMAT_G8_B8R8_420_UNORM",
      "g8_b8r8_420_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8_B8_R8_420_UNORM] = {
      PIPE_FORMAT_G8_B8_R8_420_UNORM,
      "PIPE_FORMAT_G8_B8_R8_420_UNORM",
      "g8_b8_r8_420_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_Y8_UNORM] = {
      PIPE_FORMAT_Y8_UNORM,
      "PIPE_FORMAT_Y8_UNORM",
      "y8_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_0,	/* u */
      PIPE_SWIZZLE_0,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y8_U8_V8_422_UNORM] = {
      PIPE_FORMAT_Y8_U8_V8_422_UNORM,
      "PIPE_FORMAT_Y8_U8_V8_422_UNORM",
      "y8_u8_v8_422_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y8_U8V8_422_UNORM] = {
      PIPE_FORMAT_Y8_U8V8_422_UNORM,
      "PIPE_FORMAT_Y8_U8V8_422_UNORM",
      "y8_u8v8_422_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y8_U8_V8_444_UNORM] = {
      PIPE_FORMAT_Y8_U8_V8_444_UNORM,
      "PIPE_FORMAT_Y8_U8_V8_444_UNORM",
      "y8_u8_v8_444_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y16_U16_V16_420_UNORM] = {
      PIPE_FORMAT_Y16_U16_V16_420_UNORM,
      "PIPE_FORMAT_Y16_U16_V16_420_UNORM",
      "y16_u16_v16_420_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y16_U16_V16_422_UNORM] = {
      PIPE_FORMAT_Y16_U16_V16_422_UNORM,
      "PIPE_FORMAT_Y16_U16_V16_422_UNORM",
      "y16_u16_v16_422_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y16_U16V16_422_UNORM] = {
      PIPE_FORMAT_Y16_U16V16_422_UNORM,
      "PIPE_FORMAT_Y16_U16V16_422_UNORM",
      "y16_u16v16_422_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y16_U16_V16_444_UNORM] = {
      PIPE_FORMAT_Y16_U16_V16_444_UNORM,
      "PIPE_FORMAT_Y16_U16_V16_444_UNORM",
      "y16_u16_v16_444_unorm",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR3,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_P010] = {
      PIPE_FORMAT_P010,
      "PIPE_FORMAT_P010",
      "p010",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_P012] = {
      PIPE_FORMAT_P012,
      "PIPE_FORMAT_P012",
      "p012",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_P016] = {
      PIPE_FORMAT_P016,
      "PIPE_FORMAT_P016",
      "p016",
      {1, 1, 1, 0},	/* block */
      UTIL_FORMAT_LAYOUT_PLANAR2,
      0,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y210] = {
      PIPE_FORMAT_Y210,
      "PIPE_FORMAT_Y210",
      "y210",
      {2, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y212] = {
      PIPE_FORMAT_Y212,
      "PIPE_FORMAT_Y212",
      "y212",
      {2, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y216] = {
      PIPE_FORMAT_Y216,
      "PIPE_FORMAT_Y216",
      "y216",
      {2, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_SUBSAMPLED,
      1,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 64, 0},	/* x = x */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* y */
      PIPE_SWIZZLE_Y,	/* u */
      PIPE_SWIZZLE_Z,	/* v */
      PIPE_SWIZZLE_1	/* ignored */
   },
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y410] = {
      PIPE_FORMAT_Y410,
      "PIPE_FORMAT_Y410",
      "y410",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 22},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 12},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 2},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 0}	/* w = w */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 2, 30}	/* w = w */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y412] = {
      PIPE_FORMAT_Y412,
      "PIPE_FORMAT_Y412",
      "y412",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0}	/* w = w */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48}	/* w = w */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_Y416] = {
      PIPE_FORMAT_Y416,
      "PIPE_FORMAT_Y416",
      "y416",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_OTHER,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0}	/* w = w */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = y */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* z = z */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48}	/* w = w */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* y */
      PIPE_SWIZZLE_Z,	/* u */
      PIPE_SWIZZLE_X,	/* v */
      PIPE_SWIZZLE_W	/* ignored */
   },
#endif
      UTIL_FORMAT_COLORSPACE_YUV,
   },

   [PIPE_FORMAT_A4R4_UNORM] = {
      PIPE_FORMAT_A4R4_UNORM,
      "PIPE_FORMAT_A4R4_UNORM",
      "a4r4_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R4A4_UNORM] = {
      PIPE_FORMAT_R4A4_UNORM,
      "PIPE_FORMAT_R4A4_UNORM",
      "r4a4_unorm",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 4, 4},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8A8_UNORM] = {
      PIPE_FORMAT_R8A8_UNORM,
      "PIPE_FORMAT_R8A8_UNORM",
      "r8a8_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8R8_UNORM] = {
      PIPE_FORMAT_A8R8_UNORM,
      "PIPE_FORMAT_A8R8_UNORM",
      "a8r8_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_USCALED] = {
      PIPE_FORMAT_R10G10B10A2_USCALED,
      "PIPE_FORMAT_R10G10B10A2_USCALED",
      "r10g10b10a2_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_SSCALED] = {
      PIPE_FORMAT_R10G10B10A2_SSCALED,
      "PIPE_FORMAT_R10G10B10A2_SSCALED",
      "r10g10b10a2_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_SNORM] = {
      PIPE_FORMAT_R10G10B10A2_SNORM,
      "PIPE_FORMAT_R10G10B10A2_SNORM",
      "r10g10b10a2_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_USCALED] = {
      PIPE_FORMAT_B10G10R10A2_USCALED,
      "PIPE_FORMAT_B10G10R10A2_USCALED",
      "b10g10r10a2_uscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_SSCALED] = {
      PIPE_FORMAT_B10G10R10A2_SSCALED,
      "PIPE_FORMAT_B10G10R10A2_SSCALED",
      "b10g10r10a2_sscaled",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_SNORM] = {
      PIPE_FORMAT_B10G10R10A2_SNORM,
      "PIPE_FORMAT_B10G10R10A2_SNORM",
      "b10g10r10a2_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_UINT] = {
      PIPE_FORMAT_R8_UINT,
      "PIPE_FORMAT_R8_UINT",
      "r8_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_UINT] = {
      PIPE_FORMAT_R8G8_UINT,
      "PIPE_FORMAT_R8G8_UINT",
      "r8g8_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_UINT] = {
      PIPE_FORMAT_R8G8B8_UINT,
      "PIPE_FORMAT_R8G8B8_UINT",
      "r8g8b8_uint",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_UINT] = {
      PIPE_FORMAT_R8G8B8A8_UINT,
      "PIPE_FORMAT_R8G8B8A8_UINT",
      "r8g8b8a8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8_SINT] = {
      PIPE_FORMAT_R8_SINT,
      "PIPE_FORMAT_R8_SINT",
      "r8_sint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8_SINT] = {
      PIPE_FORMAT_R8G8_SINT,
      "PIPE_FORMAT_R8G8_SINT",
      "r8g8_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8_SINT] = {
      PIPE_FORMAT_R8G8B8_SINT,
      "PIPE_FORMAT_R8G8B8_SINT",
      "r8g8b8_sint",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8A8_SINT] = {
      PIPE_FORMAT_R8G8B8A8_SINT,
      "PIPE_FORMAT_R8G8B8A8_SINT",
      "r8g8b8a8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_UINT] = {
      PIPE_FORMAT_R16_UINT,
      "PIPE_FORMAT_R16_UINT",
      "r16_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_UINT] = {
      PIPE_FORMAT_R16G16_UINT,
      "PIPE_FORMAT_R16G16_UINT",
      "r16g16_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_UINT] = {
      PIPE_FORMAT_R16G16B16_UINT,
      "PIPE_FORMAT_R16G16B16_UINT",
      "r16g16b16_uint",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_UINT] = {
      PIPE_FORMAT_R16G16B16A16_UINT,
      "PIPE_FORMAT_R16G16B16A16_UINT",
      "r16g16b16a16_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16_SINT] = {
      PIPE_FORMAT_R16_SINT,
      "PIPE_FORMAT_R16_SINT",
      "r16_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16_SINT] = {
      PIPE_FORMAT_R16G16_SINT,
      "PIPE_FORMAT_R16G16_SINT",
      "r16g16_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16_SINT] = {
      PIPE_FORMAT_R16G16B16_SINT,
      "PIPE_FORMAT_R16G16B16_SINT",
      "r16g16b16_sint",
      {1, 1, 1, 48},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16A16_SINT] = {
      PIPE_FORMAT_R16G16B16A16_SINT,
      "PIPE_FORMAT_R16G16B16A16_SINT",
      "r16g16b16a16_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 48}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_UINT] = {
      PIPE_FORMAT_R32_UINT,
      "PIPE_FORMAT_R32_UINT",
      "r32_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_UINT] = {
      PIPE_FORMAT_R32G32_UINT,
      "PIPE_FORMAT_R32G32_UINT",
      "r32g32_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_UINT] = {
      PIPE_FORMAT_R32G32B32_UINT,
      "PIPE_FORMAT_R32G32B32_UINT",
      "r32g32b32_uint",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_UINT] = {
      PIPE_FORMAT_R32G32B32A32_UINT,
      "PIPE_FORMAT_R32G32B32A32_UINT",
      "r32g32b32a32_uint",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32_SINT] = {
      PIPE_FORMAT_R32_SINT,
      "PIPE_FORMAT_R32_SINT",
      "r32_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32_SINT] = {
      PIPE_FORMAT_R32G32_SINT,
      "PIPE_FORMAT_R32G32_SINT",
      "r32g32_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32_SINT] = {
      PIPE_FORMAT_R32G32B32_SINT,
      "PIPE_FORMAT_R32G32B32_SINT",
      "r32g32b32_sint",
      {1, 1, 1, 96},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32A32_SINT] = {
      PIPE_FORMAT_R32G32B32A32_SINT,
      "PIPE_FORMAT_R32G32B32A32_SINT",
      "r32g32b32a32_sint",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 96}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64_UINT] = {
      PIPE_FORMAT_R64_UINT,
      "PIPE_FORMAT_R64_UINT",
      "r64_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64_UINT] = {
      PIPE_FORMAT_R64G64_UINT,
      "PIPE_FORMAT_R64G64_UINT",
      "r64g64_uint",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* y = g */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64B64_UINT] = {
      PIPE_FORMAT_R64G64B64_UINT,
      "PIPE_FORMAT_R64G64B64_UINT",
      "r64g64b64_uint",
      {1, 1, 1, 192},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 128},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 128},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64G64B64A64_UINT] = {
      PIPE_FORMAT_R64G64B64A64_UINT,
      "PIPE_FORMAT_R64G64B64A64_UINT",
      "r64g64b64a64_uint",
      {1, 1, 1, 256},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 192},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 128},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 128},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 64, 192}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R64_SINT] = {
      PIPE_FORMAT_R64_SINT,
      "PIPE_FORMAT_R64_SINT",
      "r64_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 64, 0},	/* x = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8_UINT] = {
      PIPE_FORMAT_A8_UINT,
      "PIPE_FORMAT_A8_UINT",
      "a8_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I8_UINT] = {
      PIPE_FORMAT_I8_UINT,
      "PIPE_FORMAT_I8_UINT",
      "i8_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8_UINT] = {
      PIPE_FORMAT_L8_UINT,
      "PIPE_FORMAT_L8_UINT",
      "l8_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8A8_UINT] = {
      PIPE_FORMAT_L8A8_UINT,
      "PIPE_FORMAT_L8A8_UINT",
      "l8a8_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8_SINT] = {
      PIPE_FORMAT_A8_SINT,
      "PIPE_FORMAT_A8_SINT",
      "a8_sint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I8_SINT] = {
      PIPE_FORMAT_I8_SINT,
      "PIPE_FORMAT_I8_SINT",
      "i8_sint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8_SINT] = {
      PIPE_FORMAT_L8_SINT,
      "PIPE_FORMAT_L8_SINT",
      "l8_sint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L8A8_SINT] = {
      PIPE_FORMAT_L8A8_SINT,
      "PIPE_FORMAT_L8A8_SINT",
      "l8a8_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A16_UINT] = {
      PIPE_FORMAT_A16_UINT,
      "PIPE_FORMAT_A16_UINT",
      "a16_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I16_UINT] = {
      PIPE_FORMAT_I16_UINT,
      "PIPE_FORMAT_I16_UINT",
      "i16_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16_UINT] = {
      PIPE_FORMAT_L16_UINT,
      "PIPE_FORMAT_L16_UINT",
      "l16_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16A16_UINT] = {
      PIPE_FORMAT_L16A16_UINT,
      "PIPE_FORMAT_L16A16_UINT",
      "l16a16_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A16_SINT] = {
      PIPE_FORMAT_A16_SINT,
      "PIPE_FORMAT_A16_SINT",
      "a16_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I16_SINT] = {
      PIPE_FORMAT_I16_SINT,
      "PIPE_FORMAT_I16_SINT",
      "i16_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16_SINT] = {
      PIPE_FORMAT_L16_SINT,
      "PIPE_FORMAT_L16_SINT",
      "l16_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L16A16_SINT] = {
      PIPE_FORMAT_L16A16_SINT,
      "PIPE_FORMAT_L16A16_SINT",
      "l16a16_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A32_UINT] = {
      PIPE_FORMAT_A32_UINT,
      "PIPE_FORMAT_A32_UINT",
      "a32_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I32_UINT] = {
      PIPE_FORMAT_I32_UINT,
      "PIPE_FORMAT_I32_UINT",
      "i32_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32_UINT] = {
      PIPE_FORMAT_L32_UINT,
      "PIPE_FORMAT_L32_UINT",
      "l32_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32A32_UINT] = {
      PIPE_FORMAT_L32A32_UINT,
      "PIPE_FORMAT_L32A32_UINT",
      "l32a32_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A32_SINT] = {
      PIPE_FORMAT_A32_SINT,
      "PIPE_FORMAT_A32_SINT",
      "a32_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_0,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_I32_SINT] = {
      PIPE_FORMAT_I32_SINT,
      "PIPE_FORMAT_I32_SINT",
      "i32_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = rgba */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32_SINT] = {
      PIPE_FORMAT_L32_SINT,
      "PIPE_FORMAT_L32_SINT",
      "l32_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      1,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = rgb */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_L32A32_SINT] = {
      PIPE_FORMAT_L32A32_SINT,
      "PIPE_FORMAT_L32A32_SINT",
      "l32a32_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = rgb */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_UINT] = {
      PIPE_FORMAT_B8G8R8_UINT,
      "PIPE_FORMAT_B8G8R8_UINT",
      "b8g8r8_uint",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_UINT] = {
      PIPE_FORMAT_B8G8R8A8_UINT,
      "PIPE_FORMAT_B8G8R8A8_UINT",
      "b8g8r8a8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8_SINT] = {
      PIPE_FORMAT_B8G8R8_SINT,
      "PIPE_FORMAT_B8G8R8_SINT",
      "b8g8r8_sint",
      {1, 1, 1, 24},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B8G8R8A8_SINT] = {
      PIPE_FORMAT_B8G8R8A8_SINT,
      "PIPE_FORMAT_B8G8R8A8_SINT",
      "b8g8r8a8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8R8G8B8_UINT] = {
      PIPE_FORMAT_A8R8G8B8_UINT,
      "PIPE_FORMAT_A8R8G8B8_UINT",
      "a8r8g8b8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_UINT] = {
      PIPE_FORMAT_A8B8G8R8_UINT,
      "PIPE_FORMAT_A8B8G8R8_UINT",
      "a8b8g8r8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A2R10G10B10_UINT] = {
      PIPE_FORMAT_A2R10G10B10_UINT,
      "PIPE_FORMAT_A2R10G10B10_UINT",
      "a2r10g10b10_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 22},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 12},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 2},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 2},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 12},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 22}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A2B10G10R10_UINT] = {
      PIPE_FORMAT_A2B10G10R10_UINT,
      "PIPE_FORMAT_A2B10G10R10_UINT",
      "a2b10g10r10_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 22},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 12},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 2},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 2},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 12},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 22}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_UINT] = {
      PIPE_FORMAT_B10G10R10A2_UINT,
      "PIPE_FORMAT_B10G10R10A2_UINT",
      "b10g10r10a2_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10A2_SINT] = {
      PIPE_FORMAT_B10G10R10A2_SINT,
      "PIPE_FORMAT_B10G10R10A2_SINT",
      "b10g10r10a2_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5G6B5_UINT] = {
      PIPE_FORMAT_R5G6B5_UINT,
      "PIPE_FORMAT_R5G6B5_UINT",
      "r5g6b5_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G6R5_UINT] = {
      PIPE_FORMAT_B5G6R5_UINT,
      "PIPE_FORMAT_B5G6R5_UINT",
      "b5g6r5_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R3G3B2_UINT] = {
      PIPE_FORMAT_R3G3B2_UINT,
      "PIPE_FORMAT_R3G3B2_UINT",
      "r3g3b2_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 6},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 3},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 3},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 6},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B2G3R3_UINT] = {
      PIPE_FORMAT_B2G3R3_UINT,
      "PIPE_FORMAT_B2G3R3_UINT",
      "b2g3r3_uint",
      {1, 1, 1, 8},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 5},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 2},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 2},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 3, 5},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R4G4B4A4_UINT] = {
      PIPE_FORMAT_R4G4B4A4_UINT,
      "PIPE_FORMAT_R4G4B4A4_UINT",
      "r4g4b4a4_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B4G4R4A4_UINT] = {
      PIPE_FORMAT_B4G4R4A4_UINT,
      "PIPE_FORMAT_B4G4R4A4_UINT",
      "b4g4r4a4_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A4R4G4B4_UINT] = {
      PIPE_FORMAT_A4R4G4B4_UINT,
      "PIPE_FORMAT_A4R4G4B4_UINT",
      "a4r4g4b4_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A4B4G4R4_UINT] = {
      PIPE_FORMAT_A4B4G4R4_UINT,
      "PIPE_FORMAT_A4B4G4R4_UINT",
      "a4b4g4r4_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 4},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 4, 12}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A1R5G5B5_UINT] = {
      PIPE_FORMAT_A1R5G5B5_UINT,
      "PIPE_FORMAT_A1R5G5B5_UINT",
      "a1r5g5b5_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 1},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 1},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11}	/* w = b */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A1B5G5R5_UINT] = {
      PIPE_FORMAT_A1B5G5R5_UINT,
      "PIPE_FORMAT_A1B5G5R5_UINT",
      "a1b5g5r5_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 6},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 1},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 0}	/* w = a */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 1},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 6},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 11}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R5G5B5A1_UINT] = {
      PIPE_FORMAT_R5G5B5A1_UINT,
      "PIPE_FORMAT_R5G5B5A1_UINT",
      "r5g5b5a1_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 15},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 10},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 10},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 15}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G5R5A1_UINT] = {
      PIPE_FORMAT_B5G5R5A1_UINT,
      "PIPE_FORMAT_B5G5R5A1_UINT",
      "b5g5r5a1_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 15},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 10},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 5},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 5, 10},	/* z = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 1, 15}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8X8_SNORM] = {
      PIPE_FORMAT_R8G8B8X8_SNORM,
      "PIPE_FORMAT_R8G8B8X8_SNORM",
      "r8g8b8x8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8X8_SRGB] = {
      PIPE_FORMAT_R8G8B8X8_SRGB,
      "PIPE_FORMAT_R8G8B8X8_SRGB",
      "r8g8b8x8_srgb",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R8G8B8X8_UINT] = {
      PIPE_FORMAT_R8G8B8X8_UINT,
      "PIPE_FORMAT_R8G8B8X8_UINT",
      "r8g8b8x8_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8G8B8X8_SINT] = {
      PIPE_FORMAT_R8G8B8X8_SINT,
      "PIPE_FORMAT_R8G8B8X8_SINT",
      "r8g8b8x8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10X2_UNORM] = {
      PIPE_FORMAT_B10G10R10X2_UNORM,
      "PIPE_FORMAT_B10G10R10X2_UNORM",
      "b10g10r10x2_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10X2_SNORM] = {
      PIPE_FORMAT_B10G10R10X2_SNORM,
      "PIPE_FORMAT_B10G10R10X2_SNORM",
      "b10g10r10x2_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B10G10R10X2_SINT] = {
      PIPE_FORMAT_B10G10R10X2_SINT,
      "PIPE_FORMAT_B10G10R10X2_SINT",
      "b10g10r10x2_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* y = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0}	/* w = b */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* z = r */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 2, 30}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_W,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_X,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16X16_UNORM] = {
      PIPE_FORMAT_R16G16B16X16_UNORM,
      "PIPE_FORMAT_R16G16B16X16_UNORM",
      "r16g16b16x16_unorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 48}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16X16_SNORM] = {
      PIPE_FORMAT_R16G16B16X16_SNORM,
      "PIPE_FORMAT_R16G16B16X16_SNORM",
      "r16g16b16x16_snorm",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 48}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16X16_FLOAT] = {
      PIPE_FORMAT_R16G16B16X16_FLOAT,
      "PIPE_FORMAT_R16G16B16X16_FLOAT",
      "r16g16b16x16_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 48}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16X16_UINT] = {
      PIPE_FORMAT_R16G16B16X16_UINT,
      "PIPE_FORMAT_R16G16B16X16_UINT",
      "r16g16b16x16_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 48}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16G16B16X16_SINT] = {
      PIPE_FORMAT_R16G16B16X16_SINT,
      "PIPE_FORMAT_R16G16B16X16_SINT",
      "r16g16b16x16_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 48},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 16, 48}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32X32_FLOAT] = {
      PIPE_FORMAT_R32G32B32X32_FLOAT,
      "PIPE_FORMAT_R32G32B32X32_FLOAT",
      "r32g32b32x32_float",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 96}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32X32_UINT] = {
      PIPE_FORMAT_R32G32B32X32_UINT,
      "PIPE_FORMAT_R32G32B32X32_UINT",
      "r32g32b32x32_uint",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 96}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32G32B32X32_SINT] = {
      PIPE_FORMAT_R32G32B32X32_SINT,
      "PIPE_FORMAT_R32G32B32X32_SINT",
      "r32g32b32x32_sint",
      {1, 1, 1, 128},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 96},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 0}	/* w = x */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 64},	/* z = b */
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 32, 96}	/* w = x */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8A8_SNORM] = {
      PIPE_FORMAT_R8A8_SNORM,
      "PIPE_FORMAT_R8A8_SNORM",
      "r8a8_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16A16_UNORM] = {
      PIPE_FORMAT_R16A16_UNORM,
      "PIPE_FORMAT_R16A16_UNORM",
      "r16a16_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16A16_SNORM] = {
      PIPE_FORMAT_R16A16_SNORM,
      "PIPE_FORMAT_R16A16_SNORM",
      "r16a16_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16A16_FLOAT] = {
      PIPE_FORMAT_R16A16_FLOAT,
      "PIPE_FORMAT_R16A16_FLOAT",
      "r16a16_float",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32A32_FLOAT] = {
      PIPE_FORMAT_R32A32_FLOAT,
      "PIPE_FORMAT_R32A32_FLOAT",
      "r32a32_float",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_FLOAT, FALSE, FALSE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8A8_UINT] = {
      PIPE_FORMAT_R8A8_UINT,
      "PIPE_FORMAT_R8A8_UINT",
      "r8a8_uint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R8A8_SINT] = {
      PIPE_FORMAT_R8A8_SINT,
      "PIPE_FORMAT_R8A8_SINT",
      "r8a8_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16A16_UINT] = {
      PIPE_FORMAT_R16A16_UINT,
      "PIPE_FORMAT_R16A16_UINT",
      "r16a16_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R16A16_SINT] = {
      PIPE_FORMAT_R16A16_SINT,
      "PIPE_FORMAT_R16A16_SINT",
      "r16a16_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32A32_UINT] = {
      PIPE_FORMAT_R32A32_UINT,
      "PIPE_FORMAT_R32A32_UINT",
      "r32a32_uint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R32A32_SINT] = {
      PIPE_FORMAT_R32A32_SINT,
      "PIPE_FORMAT_R32A32_SINT",
      "r32a32_sint",
      {1, 1, 1, 64},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      FALSE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 32, 32},	/* y = a */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_0,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_Y	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_UINT] = {
      PIPE_FORMAT_R10G10B10A2_UINT,
      "PIPE_FORMAT_R10G10B10A2_UINT",
      "r10g10b10a2_uint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, FALSE, TRUE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_R10G10B10A2_SINT] = {
      PIPE_FORMAT_R10G10B10A2_SINT,
      "PIPE_FORMAT_R10G10B10A2_SINT",
      "r10g10b10a2_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 2, 30},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 10},	/* y = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 10, 20},	/* z = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 2, 30}	/* w = a */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* r */
      PIPE_SWIZZLE_Y,	/* g */
      PIPE_SWIZZLE_Z,	/* b */
      PIPE_SWIZZLE_W	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_B5G6R5_SRGB] = {
      PIPE_FORMAT_B5G6R5_SRGB,
      "PIPE_FORMAT_B5G6R5_SRGB",
      "b5g6r5_srgb",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_R5G6B5_SRGB] = {
      PIPE_FORMAT_R5G6B5_SRGB,
      "PIPE_FORMAT_R5G6B5_SRGB",
      "r5g6b5_srgb",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      3,	/* nr_channels */
      FALSE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* x = b */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* z = r */
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 0},	/* x = r */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 6, 5},	/* y = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 5, 11},	/* z = b */
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Z,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_X,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_X,	/* sr */
      PIPE_SWIZZLE_Y,	/* sg */
      PIPE_SWIZZLE_Z,	/* sb */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_SRGB,
   },

   [PIPE_FORMAT_G8R8_UNORM] = {
      PIPE_FORMAT_G8R8_UNORM,
      "PIPE_FORMAT_G8R8_UNORM",
      "g8r8_unorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* x = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8R8_SNORM] = {
      PIPE_FORMAT_G8R8_SNORM,
      "PIPE_FORMAT_G8R8_SNORM",
      "g8r8_snorm",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G8R8_SINT] = {
      PIPE_FORMAT_G8R8_SINT,
      "PIPE_FORMAT_G8R8_SINT",
      "g8r8_sint",
      {1, 1, 1, 16},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G16R16_UNORM] = {
      PIPE_FORMAT_G16R16_UNORM,
      "PIPE_FORMAT_G16R16_UNORM",
      "g16r16_unorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      TRUE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* x = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_UNSIGNED, TRUE, FALSE, 16, 16},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G16R16_SNORM] = {
      PIPE_FORMAT_G16R16_SNORM,
      "PIPE_FORMAT_G16R16_SNORM",
      "g16r16_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 16, 16},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_G16R16_SINT] = {
      PIPE_FORMAT_G16R16_SINT,
      "PIPE_FORMAT_G16R16_SINT",
      "g16r16_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      2,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 0},	/* x = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 16, 16},	/* y = r */
      {0, 0, 0, 0, 0},
      {0, 0, 0, 0, 0}
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_Y,	/* r */
      PIPE_SWIZZLE_X,	/* g */
      PIPE_SWIZZLE_0,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_SNORM] = {
      PIPE_FORMAT_A8B8G8R8_SNORM,
      "PIPE_FORMAT_A8B8G8R8_SNORM",
      "a8b8g8r8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_A8B8G8R8_SINT] = {
      PIPE_FORMAT_A8B8G8R8_SINT,
      "PIPE_FORMAT_A8B8G8R8_SINT",
      "a8b8g8r8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0},	/* x = a */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_X	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8B8G8R8_SNORM] = {
      PIPE_FORMAT_X8B8G8R8_SNORM,
      "PIPE_FORMAT_X8B8G8R8_SNORM",
      "x8b8g8r8_snorm",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      TRUE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, TRUE, FALSE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

   [PIPE_FORMAT_X8B8G8R8_SINT] = {
      PIPE_FORMAT_X8B8G8R8_SINT,
      "PIPE_FORMAT_X8B8G8R8_SINT",
      "x8b8g8r8_sint",
      {1, 1, 1, 32},	/* block */
      UTIL_FORMAT_LAYOUT_PLAIN,
      4,	/* nr_channels */
      TRUE,	/* is_array */
      TRUE,	/* is_bitmask */
      FALSE,	/* is_mixed */
      FALSE,	/* is_unorm */
      FALSE,	/* is_snorm */
#if UTIL_ARCH_BIG_ENDIAN
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 24},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 0}	/* w = r */
   },
#else
   {
      {UTIL_FORMAT_TYPE_VOID, FALSE, FALSE, 8, 0},	/* x = x */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 8},	/* y = b */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 16},	/* z = g */
      {UTIL_FORMAT_TYPE_SIGNED, FALSE, TRUE, 8, 24}	/* w = r */
   },
#endif
#if UTIL_ARCH_BIG_ENDIAN
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#else
   {
      PIPE_SWIZZLE_W,	/* r */
      PIPE_SWIZZLE_Z,	/* g */
      PIPE_SWIZZLE_Y,	/* b */
      PIPE_SWIZZLE_1	/* a */
   },
#endif
      UTIL_FORMAT_COLORSPACE_RGB,
   },

};

ATTRIBUTE_RETURNS_NONNULL const struct util_format_description *
util_format_description(enum pipe_format format)
{
   assert(format < PIPE_FORMAT_COUNT);
   return &util_format_descriptions[format];
}

static const struct util_format_pack_description
util_format_pack_descriptions[PIPE_FORMAT_COUNT] = {
   [PIPE_FORMAT_NONE] = {
      .pack_rgba_8unorm = &util_format_none_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_none_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8A8_UNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8a8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8a8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8X8_UNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8x8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8x8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8X8_SNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8x8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8x8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8X8_UINT] = {
      .pack_rgba_uint = &util_format_b8g8r8x8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8x8_uint_pack_signed,
   },

   [PIPE_FORMAT_B8G8R8X8_SINT] = {
      .pack_rgba_uint = &util_format_b8g8r8x8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8x8_sint_pack_signed,
   },

   [PIPE_FORMAT_A8R8G8B8_UNORM] = {
      .pack_rgba_8unorm = &util_format_a8r8g8b8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8r8g8b8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8R8G8B8_SNORM] = {
      .pack_rgba_8unorm = &util_format_a8r8g8b8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8r8g8b8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8R8G8B8_SINT] = {
      .pack_rgba_uint = &util_format_a8r8g8b8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8r8g8b8_sint_pack_signed,
   },

   [PIPE_FORMAT_X8R8G8B8_UNORM] = {
      .pack_rgba_8unorm = &util_format_x8r8g8b8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8r8g8b8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X8R8G8B8_SNORM] = {
      .pack_rgba_8unorm = &util_format_x8r8g8b8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8r8g8b8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X8R8G8B8_SINT] = {
      .pack_rgba_uint = &util_format_x8r8g8b8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_x8r8g8b8_sint_pack_signed,
   },

   [PIPE_FORMAT_A8B8G8R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_a8b8g8r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8b8g8r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X8B8G8R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_x8b8g8r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8b8g8r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8X8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8x8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8x8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R5G5B5A1_UNORM] = {
      .pack_rgba_8unorm = &util_format_r5g5b5a1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r5g5b5a1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R5G5B5X1_UNORM] = {
      .pack_rgba_8unorm = &util_format_r5g5b5x1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r5g5b5x1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B5G5R5X1_UNORM] = {
      .pack_rgba_8unorm = &util_format_b5g5r5x1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b5g5r5x1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B5G5R5A1_UNORM] = {
      .pack_rgba_8unorm = &util_format_b5g5r5a1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b5g5r5a1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X1B5G5R5_UNORM] = {
      .pack_rgba_8unorm = &util_format_x1b5g5r5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x1b5g5r5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A1R5G5B5_UNORM] = {
      .pack_rgba_8unorm = &util_format_a1r5g5b5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a1r5g5b5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X1R5G5B5_UNORM] = {
      .pack_rgba_8unorm = &util_format_x1r5g5b5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x1r5g5b5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A1B5G5R5_UNORM] = {
      .pack_rgba_8unorm = &util_format_a1b5g5r5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a1b5g5r5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R4G4B4A4_UNORM] = {
      .pack_rgba_8unorm = &util_format_r4g4b4a4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r4g4b4a4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R4G4B4X4_UNORM] = {
      .pack_rgba_8unorm = &util_format_r4g4b4x4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r4g4b4x4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B4G4R4A4_UNORM] = {
      .pack_rgba_8unorm = &util_format_b4g4r4a4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b4g4r4a4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B4G4R4X4_UNORM] = {
      .pack_rgba_8unorm = &util_format_b4g4r4x4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b4g4r4x4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A4R4G4B4_UNORM] = {
      .pack_rgba_8unorm = &util_format_a4r4g4b4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a4r4g4b4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A4B4G4R4_UNORM] = {
      .pack_rgba_8unorm = &util_format_a4b4g4r4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a4b4g4r4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R5G6B5_UNORM] = {
      .pack_rgba_8unorm = &util_format_r5g6b5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r5g6b5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B5G6R5_UNORM] = {
      .pack_rgba_8unorm = &util_format_b5g6r5_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b5g6r5_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10A2_UNORM] = {
      .pack_rgba_8unorm = &util_format_r10g10b10a2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10a2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10X2_UNORM] = {
      .pack_rgba_8unorm = &util_format_r10g10b10x2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10x2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10A2_UNORM] = {
      .pack_rgba_8unorm = &util_format_b10g10r10a2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10a2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A2R10G10B10_UNORM] = {
      .pack_rgba_8unorm = &util_format_a2r10g10b10_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a2r10g10b10_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A2B10G10R10_UNORM] = {
      .pack_rgba_8unorm = &util_format_a2b10g10r10_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a2b10g10r10_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R3G3B2_UNORM] = {
      .pack_rgba_8unorm = &util_format_r3g3b2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r3g3b2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B2G3R3_UNORM] = {
      .pack_rgba_8unorm = &util_format_b2g3r3_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b2g3r3_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L8_UNORM] = {
      .pack_rgba_8unorm = &util_format_l8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8_UNORM] = {
      .pack_rgba_8unorm = &util_format_a8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_I8_UNORM] = {
      .pack_rgba_8unorm = &util_format_i8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L4A4_UNORM] = {
      .pack_rgba_8unorm = &util_format_l4a4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l4a4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L8A8_UNORM] = {
      .pack_rgba_8unorm = &util_format_l8a8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8a8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L16_UNORM] = {
      .pack_rgba_8unorm = &util_format_l16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A16_UNORM] = {
      .pack_rgba_8unorm = &util_format_a16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_I16_UNORM] = {
      .pack_rgba_8unorm = &util_format_i16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L16A16_UNORM] = {
      .pack_rgba_8unorm = &util_format_l16a16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16a16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8_SNORM] = {
      .pack_rgba_8unorm = &util_format_a8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L8_SNORM] = {
      .pack_rgba_8unorm = &util_format_l8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L8A8_SNORM] = {
      .pack_rgba_8unorm = &util_format_l8a8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8a8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_I8_SNORM] = {
      .pack_rgba_8unorm = &util_format_i8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A16_SNORM] = {
      .pack_rgba_8unorm = &util_format_a16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L16_SNORM] = {
      .pack_rgba_8unorm = &util_format_l16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_L16A16_SNORM] = {
      .pack_rgba_8unorm = &util_format_l16a16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16a16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_I16_SNORM] = {
      .pack_rgba_8unorm = &util_format_i16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_a16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_L16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_l16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_L16A16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_l16a16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l16a16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_I16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_i16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_A32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_a32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_L32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_l32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_L32A32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_l32a32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l32a32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_I32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_i32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_i32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_L8_SRGB] = {
      .pack_rgba_8unorm = &util_format_l8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_SRGB] = {
      .pack_rgba_8unorm = &util_format_r8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_L8A8_SRGB] = {
      .pack_rgba_8unorm = &util_format_l8a8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_l8a8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8_SRGB] = {
      .pack_rgba_8unorm = &util_format_r8g8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8_SRGB] = {
      .pack_rgba_8unorm = &util_format_r8g8b8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8_SRGB] = {
      .pack_rgba_8unorm = &util_format_b8g8r8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8A8_SRGB] = {
      .pack_rgba_8unorm = &util_format_r8g8b8a8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8a8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_A8B8G8R8_SRGB] = {
      .pack_rgba_8unorm = &util_format_a8b8g8r8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8b8g8r8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_X8B8G8R8_SRGB] = {
      .pack_rgba_8unorm = &util_format_x8b8g8r8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8b8g8r8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8A8_SRGB] = {
      .pack_rgba_8unorm = &util_format_b8g8r8a8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8a8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8X8_SRGB] = {
      .pack_rgba_8unorm = &util_format_b8g8r8x8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8x8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_A8R8G8B8_SRGB] = {
      .pack_rgba_8unorm = &util_format_a8r8g8b8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8r8g8b8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_X8R8G8B8_SRGB] = {
      .pack_rgba_8unorm = &util_format_x8r8g8b8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8r8g8b8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = {
      .pack_rgba_8unorm = &util_format_r8sg8sb8ux8u_norm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8sg8sb8ux8u_norm_pack_rgba_float,
   },

   [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = {
      .pack_rgba_8unorm = &util_format_r10sg10sb10sa2u_norm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10sg10sb10sa2u_norm_pack_rgba_float,
   },

   [PIPE_FORMAT_R5SG5SB6U_NORM] = {
      .pack_rgba_8unorm = &util_format_r5sg5sb6u_norm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r5sg5sb6u_norm_pack_rgba_float,
   },

   [PIPE_FORMAT_S8_UINT] = {
      .pack_s_8uint = &util_format_s8_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_Z16_UNORM] = {
      .pack_z_32unorm = &util_format_z16_unorm_pack_z_32unorm,
      .pack_z_float = &util_format_z16_unorm_pack_z_float,
   },

   [PIPE_FORMAT_Z16_UNORM_S8_UINT] = {
      .pack_z_32unorm = &util_format_z16_unorm_s8_uint_pack_z_32unorm,
      .pack_z_float = &util_format_z16_unorm_s8_uint_pack_z_float,
      .pack_s_8uint = &util_format_z16_unorm_s8_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_Z32_UNORM] = {
      .pack_z_32unorm = &util_format_z32_unorm_pack_z_32unorm,
      .pack_z_float = &util_format_z32_unorm_pack_z_float,
   },

   [PIPE_FORMAT_Z32_FLOAT] = {
      .pack_z_32unorm = &util_format_z32_float_pack_z_32unorm,
      .pack_z_float = &util_format_z32_float_pack_z_float,
   },

   [PIPE_FORMAT_Z24_UNORM_S8_UINT] = {
      .pack_z_32unorm = &util_format_z24_unorm_s8_uint_pack_z_32unorm,
      .pack_z_float = &util_format_z24_unorm_s8_uint_pack_z_float,
      .pack_s_8uint = &util_format_z24_unorm_s8_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_S8_UINT_Z24_UNORM] = {
      .pack_z_32unorm = &util_format_s8_uint_z24_unorm_pack_z_32unorm,
      .pack_z_float = &util_format_s8_uint_z24_unorm_pack_z_float,
      .pack_s_8uint = &util_format_s8_uint_z24_unorm_pack_s_8uint,
   },

   [PIPE_FORMAT_X24S8_UINT] = {
      .pack_s_8uint = &util_format_x24s8_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_S8X24_UINT] = {
      .pack_s_8uint = &util_format_s8x24_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_Z24X8_UNORM] = {
      .pack_z_32unorm = &util_format_z24x8_unorm_pack_z_32unorm,
      .pack_z_float = &util_format_z24x8_unorm_pack_z_float,
   },

   [PIPE_FORMAT_X8Z24_UNORM] = {
      .pack_z_32unorm = &util_format_x8z24_unorm_pack_z_32unorm,
      .pack_z_float = &util_format_x8z24_unorm_pack_z_float,
   },

   [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = {
      .pack_z_32unorm = &util_format_z32_float_s8x24_uint_pack_z_32unorm,
      .pack_z_float = &util_format_z32_float_s8x24_uint_pack_z_float,
      .pack_s_8uint = &util_format_z32_float_s8x24_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_X32_S8X24_UINT] = {
      .pack_s_8uint = &util_format_x32_s8x24_uint_pack_s_8uint,
   },

   [PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8] = {
      .pack_rgba_8unorm = &util_format_z24_unorm_s8_uint_as_r8g8b8a8_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_z24_unorm_s8_uint_as_r8g8b8a8_pack_rgba_float,
   },

   [PIPE_FORMAT_UYVY] = {
      .pack_rgba_8unorm = &util_format_uyvy_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_uyvy_pack_rgba_float,
   },

   [PIPE_FORMAT_YUYV] = {
      .pack_rgba_8unorm = &util_format_yuyv_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_yuyv_pack_rgba_float,
   },

   [PIPE_FORMAT_AYUV] = { 0 },
   [PIPE_FORMAT_XYUV] = { 0 },
   [PIPE_FORMAT_R8G8_B8G8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8_b8g8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_b8g8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_G8R8_G8B8_UNORM] = { 0 },
   [PIPE_FORMAT_G8R8_B8R8_UNORM] = { 0 },
   [PIPE_FORMAT_R8G8_R8B8_UNORM] = { 0 },
   [PIPE_FORMAT_R11G11B10_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r11g11b10_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r11g11b10_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R9G9B9E5_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r9g9b9e5_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r9g9b9e5_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R1_UNORM] = { 0 },
   [PIPE_FORMAT_R8G8Bx_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8bx_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8bx_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT1_RGB] = {
      .pack_rgba_8unorm = &util_format_dxt1_rgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt1_rgb_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT1_RGBA] = {
      .pack_rgba_8unorm = &util_format_dxt1_rgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt1_rgba_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT3_RGBA] = {
      .pack_rgba_8unorm = &util_format_dxt3_rgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt3_rgba_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT5_RGBA] = {
      .pack_rgba_8unorm = &util_format_dxt5_rgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt5_rgba_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT1_SRGB] = {
      .pack_rgba_8unorm = &util_format_dxt1_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt1_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT1_SRGBA] = {
      .pack_rgba_8unorm = &util_format_dxt1_srgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt1_srgba_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT3_SRGBA] = {
      .pack_rgba_8unorm = &util_format_dxt3_srgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt3_srgba_pack_rgba_float,
   },

   [PIPE_FORMAT_DXT5_SRGBA] = {
      .pack_rgba_8unorm = &util_format_dxt5_srgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_dxt5_srgba_pack_rgba_float,
   },

   [PIPE_FORMAT_FXT1_RGB] = {
      .pack_rgba_8unorm = &util_format_fxt1_rgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_fxt1_rgb_pack_rgba_float,
   },

   [PIPE_FORMAT_FXT1_RGBA] = {
      .pack_rgba_8unorm = &util_format_fxt1_rgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_fxt1_rgba_pack_rgba_float,
   },

   [PIPE_FORMAT_RGTC1_UNORM] = {
      .pack_rgba_8unorm = &util_format_rgtc1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_rgtc1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_RGTC1_SNORM] = {
      .pack_rgba_8unorm = &util_format_rgtc1_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_rgtc1_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_RGTC2_UNORM] = {
      .pack_rgba_8unorm = &util_format_rgtc2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_rgtc2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_RGTC2_SNORM] = {
      .pack_rgba_8unorm = &util_format_rgtc2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_rgtc2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_LATC1_UNORM] = {
      .pack_rgba_8unorm = &util_format_latc1_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_latc1_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_LATC1_SNORM] = {
      .pack_rgba_8unorm = &util_format_latc1_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_latc1_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_LATC2_UNORM] = {
      .pack_rgba_8unorm = &util_format_latc2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_latc2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_LATC2_SNORM] = {
      .pack_rgba_8unorm = &util_format_latc2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_latc2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_ETC1_RGB8] = {
      .pack_rgba_8unorm = &util_format_etc1_rgb8_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_etc1_rgb8_pack_rgba_float,
   },

   [PIPE_FORMAT_ETC2_RGB8] = { 0 },
   [PIPE_FORMAT_ETC2_SRGB8] = { 0 },
   [PIPE_FORMAT_ETC2_RGB8A1] = { 0 },
   [PIPE_FORMAT_ETC2_SRGB8A1] = { 0 },
   [PIPE_FORMAT_ETC2_RGBA8] = { 0 },
   [PIPE_FORMAT_ETC2_SRGBA8] = { 0 },
   [PIPE_FORMAT_ETC2_R11_UNORM] = { 0 },
   [PIPE_FORMAT_ETC2_R11_SNORM] = { 0 },
   [PIPE_FORMAT_ETC2_RG11_UNORM] = { 0 },
   [PIPE_FORMAT_ETC2_RG11_SNORM] = { 0 },
   [PIPE_FORMAT_BPTC_RGBA_UNORM] = {
      .pack_rgba_8unorm = &util_format_bptc_rgba_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_bptc_rgba_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_BPTC_SRGBA] = {
      .pack_rgba_8unorm = &util_format_bptc_srgba_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_bptc_srgba_pack_rgba_float,
   },

   [PIPE_FORMAT_BPTC_RGB_FLOAT] = {
      .pack_rgba_8unorm = &util_format_bptc_rgb_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_bptc_rgb_float_pack_rgba_float,
   },

   [PIPE_FORMAT_BPTC_RGB_UFLOAT] = {
      .pack_rgba_8unorm = &util_format_bptc_rgb_ufloat_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_bptc_rgb_ufloat_pack_rgba_float,
   },

   [PIPE_FORMAT_ASTC_4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6] = { 0 },
   [PIPE_FORMAT_ASTC_8x5] = { 0 },
   [PIPE_FORMAT_ASTC_8x6] = { 0 },
   [PIPE_FORMAT_ASTC_8x8] = { 0 },
   [PIPE_FORMAT_ASTC_10x5] = { 0 },
   [PIPE_FORMAT_ASTC_10x6] = { 0 },
   [PIPE_FORMAT_ASTC_10x8] = { 0 },
   [PIPE_FORMAT_ASTC_10x10] = { 0 },
   [PIPE_FORMAT_ASTC_12x10] = { 0 },
   [PIPE_FORMAT_ASTC_12x12] = { 0 },
   [PIPE_FORMAT_ASTC_4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x8_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x8_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x10_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_12x10_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_12x12_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_3x3x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x3x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x6] = { 0 },
   [PIPE_FORMAT_ASTC_3x3x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x3x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x6_SRGB] = { 0 },
   [PIPE_FORMAT_ATC_RGB] = { 0 },
   [PIPE_FORMAT_ATC_RGBA_EXPLICIT] = { 0 },
   [PIPE_FORMAT_ATC_RGBA_INTERPOLATED] = { 0 },
   [PIPE_FORMAT_R64_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r64_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r64_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R64G64_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r64g64_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r64g64_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R64G64B64_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r64g64b64_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r64g64b64_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R64G64B64A64_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r64g64b64a64_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r64g64b64a64_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32g32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_UNORM] = {
      .pack_rgba_8unorm = &util_format_r32_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_UNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_UNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_UNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_USCALED] = {
      .pack_rgba_8unorm = &util_format_r32_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_USCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_USCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_USCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_SNORM] = {
      .pack_rgba_8unorm = &util_format_r32_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_SNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_SNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_SNORM] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r32_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16g16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16g16b16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16A16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16g16b16a16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16a16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16A16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16a16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16a16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16_USCALED] = {
      .pack_rgba_8unorm = &util_format_r16_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16_USCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16_USCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16b16_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16A16_USCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16b16a16_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16a16_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16A16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16a16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16a16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r16_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16b16_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16A16_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r16g16b16a16_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16a16_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8A8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8a8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8a8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_USCALED] = {
      .pack_rgba_8unorm = &util_format_r8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8_USCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8_USCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8b8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8_USCALED] = {
      .pack_rgba_8unorm = &util_format_b8g8r8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8A8_USCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8b8a8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8a8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8A8_USCALED] = {
      .pack_rgba_8unorm = &util_format_b8g8r8a8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8a8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_A8B8G8R8_USCALED] = {
      .pack_rgba_8unorm = &util_format_a8b8g8r8_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8b8g8r8_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8_SNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8A8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8a8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8a8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8A8_SNORM] = {
      .pack_rgba_8unorm = &util_format_b8g8r8a8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8a8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8b8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_b8g8r8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8A8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r8g8b8a8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8a8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B8G8R8A8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_b8g8r8a8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b8g8r8a8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_A8B8G8R8_SSCALED] = {
      .pack_rgba_8unorm = &util_format_a8b8g8r8_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8b8g8r8_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R32_FIXED] = {
      .pack_rgba_8unorm = &util_format_r32_fixed_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32_fixed_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32_FIXED] = {
      .pack_rgba_8unorm = &util_format_r32g32_fixed_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32_fixed_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32_FIXED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32_fixed_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32_fixed_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32A32_FIXED] = {
      .pack_rgba_8unorm = &util_format_r32g32b32a32_fixed_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32a32_fixed_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10X2_USCALED] = {
      .pack_rgba_8unorm = &util_format_r10g10b10x2_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10x2_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10X2_SNORM] = {
      .pack_rgba_8unorm = &util_format_r10g10b10x2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10x2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10X2_SINT] = {
      .pack_rgba_uint = &util_format_r10g10b10x2_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r10g10b10x2_sint_pack_signed,
   },

   [PIPE_FORMAT_YV12] = { 0 },
   [PIPE_FORMAT_YV16] = { 0 },
   [PIPE_FORMAT_IYUV] = { 0 },
   [PIPE_FORMAT_NV12] = { 0 },
   [PIPE_FORMAT_NV21] = { 0 },
   [PIPE_FORMAT_R8_G8B8_420_UNORM] = { 0 },
   [PIPE_FORMAT_G8_B8R8_420_UNORM] = { 0 },
   [PIPE_FORMAT_G8_B8_R8_420_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8_V8_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8V8_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8_V8_444_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_420_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16V16_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_444_UNORM] = { 0 },
   [PIPE_FORMAT_P010] = { 0 },
   [PIPE_FORMAT_P012] = { 0 },
   [PIPE_FORMAT_P016] = { 0 },
   [PIPE_FORMAT_Y210] = { 0 },
   [PIPE_FORMAT_Y212] = { 0 },
   [PIPE_FORMAT_Y216] = { 0 },
   [PIPE_FORMAT_Y410] = { 0 },
   [PIPE_FORMAT_Y412] = { 0 },
   [PIPE_FORMAT_Y416] = { 0 },
   [PIPE_FORMAT_A4R4_UNORM] = {
      .pack_rgba_8unorm = &util_format_a4r4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a4r4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R4A4_UNORM] = {
      .pack_rgba_8unorm = &util_format_r4a4_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r4a4_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8A8_UNORM] = {
      .pack_rgba_8unorm = &util_format_r8a8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8a8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_a8r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10A2_USCALED] = {
      .pack_rgba_8unorm = &util_format_r10g10b10a2_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10a2_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10A2_SSCALED] = {
      .pack_rgba_8unorm = &util_format_r10g10b10a2_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10a2_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_R10G10B10A2_SNORM] = {
      .pack_rgba_8unorm = &util_format_r10g10b10a2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r10g10b10a2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10A2_USCALED] = {
      .pack_rgba_8unorm = &util_format_b10g10r10a2_uscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10a2_uscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10A2_SSCALED] = {
      .pack_rgba_8unorm = &util_format_b10g10r10a2_sscaled_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10a2_sscaled_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10A2_SNORM] = {
      .pack_rgba_8unorm = &util_format_b10g10r10a2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10a2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8_UINT] = {
      .pack_rgba_uint = &util_format_r8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8G8_UINT] = {
      .pack_rgba_uint = &util_format_r8g8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8_UINT] = {
      .pack_rgba_uint = &util_format_r8g8b8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8A8_UINT] = {
      .pack_rgba_uint = &util_format_r8g8b8a8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8a8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8_SINT] = {
      .pack_rgba_uint = &util_format_r8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8_sint_pack_signed,
   },

   [PIPE_FORMAT_R8G8_SINT] = {
      .pack_rgba_uint = &util_format_r8g8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8_sint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8_SINT] = {
      .pack_rgba_uint = &util_format_r8g8b8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8_sint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8A8_SINT] = {
      .pack_rgba_uint = &util_format_r8g8b8a8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8a8_sint_pack_signed,
   },

   [PIPE_FORMAT_R16_UINT] = {
      .pack_rgba_uint = &util_format_r16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16G16_UINT] = {
      .pack_rgba_uint = &util_format_r16g16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16_UINT] = {
      .pack_rgba_uint = &util_format_r16g16b16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16A16_UINT] = {
      .pack_rgba_uint = &util_format_r16g16b16a16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16a16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16_SINT] = {
      .pack_rgba_uint = &util_format_r16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16_sint_pack_signed,
   },

   [PIPE_FORMAT_R16G16_SINT] = {
      .pack_rgba_uint = &util_format_r16g16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16_sint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16_SINT] = {
      .pack_rgba_uint = &util_format_r16g16b16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16_sint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16A16_SINT] = {
      .pack_rgba_uint = &util_format_r16g16b16a16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16a16_sint_pack_signed,
   },

   [PIPE_FORMAT_R32_UINT] = {
      .pack_rgba_uint = &util_format_r32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32G32_UINT] = {
      .pack_rgba_uint = &util_format_r32g32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32_UINT] = {
      .pack_rgba_uint = &util_format_r32g32b32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32A32_UINT] = {
      .pack_rgba_uint = &util_format_r32g32b32a32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32a32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32_SINT] = {
      .pack_rgba_uint = &util_format_r32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32_sint_pack_signed,
   },

   [PIPE_FORMAT_R32G32_SINT] = {
      .pack_rgba_uint = &util_format_r32g32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32_sint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32_SINT] = {
      .pack_rgba_uint = &util_format_r32g32b32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32_sint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32A32_SINT] = {
      .pack_rgba_uint = &util_format_r32g32b32a32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32a32_sint_pack_signed,
   },

   [PIPE_FORMAT_R64_UINT] = {
      .pack_rgba_uint = &util_format_r64_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r64_uint_pack_signed,
   },

   [PIPE_FORMAT_R64G64_UINT] = {
      .pack_rgba_uint = &util_format_r64g64_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r64g64_uint_pack_signed,
   },

   [PIPE_FORMAT_R64G64B64_UINT] = {
      .pack_rgba_uint = &util_format_r64g64b64_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r64g64b64_uint_pack_signed,
   },

   [PIPE_FORMAT_R64G64B64A64_UINT] = {
      .pack_rgba_uint = &util_format_r64g64b64a64_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r64g64b64a64_uint_pack_signed,
   },

   [PIPE_FORMAT_R64_SINT] = {
      .pack_rgba_uint = &util_format_r64_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r64_sint_pack_signed,
   },

   [PIPE_FORMAT_A8_UINT] = {
      .pack_rgba_uint = &util_format_a8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8_uint_pack_signed,
   },

   [PIPE_FORMAT_I8_UINT] = {
      .pack_rgba_uint = &util_format_i8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_i8_uint_pack_signed,
   },

   [PIPE_FORMAT_L8_UINT] = {
      .pack_rgba_uint = &util_format_l8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l8_uint_pack_signed,
   },

   [PIPE_FORMAT_L8A8_UINT] = {
      .pack_rgba_uint = &util_format_l8a8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l8a8_uint_pack_signed,
   },

   [PIPE_FORMAT_A8_SINT] = {
      .pack_rgba_uint = &util_format_a8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8_sint_pack_signed,
   },

   [PIPE_FORMAT_I8_SINT] = {
      .pack_rgba_uint = &util_format_i8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_i8_sint_pack_signed,
   },

   [PIPE_FORMAT_L8_SINT] = {
      .pack_rgba_uint = &util_format_l8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l8_sint_pack_signed,
   },

   [PIPE_FORMAT_L8A8_SINT] = {
      .pack_rgba_uint = &util_format_l8a8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l8a8_sint_pack_signed,
   },

   [PIPE_FORMAT_A16_UINT] = {
      .pack_rgba_uint = &util_format_a16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a16_uint_pack_signed,
   },

   [PIPE_FORMAT_I16_UINT] = {
      .pack_rgba_uint = &util_format_i16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_i16_uint_pack_signed,
   },

   [PIPE_FORMAT_L16_UINT] = {
      .pack_rgba_uint = &util_format_l16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l16_uint_pack_signed,
   },

   [PIPE_FORMAT_L16A16_UINT] = {
      .pack_rgba_uint = &util_format_l16a16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l16a16_uint_pack_signed,
   },

   [PIPE_FORMAT_A16_SINT] = {
      .pack_rgba_uint = &util_format_a16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_a16_sint_pack_signed,
   },

   [PIPE_FORMAT_I16_SINT] = {
      .pack_rgba_uint = &util_format_i16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_i16_sint_pack_signed,
   },

   [PIPE_FORMAT_L16_SINT] = {
      .pack_rgba_uint = &util_format_l16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l16_sint_pack_signed,
   },

   [PIPE_FORMAT_L16A16_SINT] = {
      .pack_rgba_uint = &util_format_l16a16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l16a16_sint_pack_signed,
   },

   [PIPE_FORMAT_A32_UINT] = {
      .pack_rgba_uint = &util_format_a32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a32_uint_pack_signed,
   },

   [PIPE_FORMAT_I32_UINT] = {
      .pack_rgba_uint = &util_format_i32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_i32_uint_pack_signed,
   },

   [PIPE_FORMAT_L32_UINT] = {
      .pack_rgba_uint = &util_format_l32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l32_uint_pack_signed,
   },

   [PIPE_FORMAT_L32A32_UINT] = {
      .pack_rgba_uint = &util_format_l32a32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_l32a32_uint_pack_signed,
   },

   [PIPE_FORMAT_A32_SINT] = {
      .pack_rgba_uint = &util_format_a32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_a32_sint_pack_signed,
   },

   [PIPE_FORMAT_I32_SINT] = {
      .pack_rgba_uint = &util_format_i32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_i32_sint_pack_signed,
   },

   [PIPE_FORMAT_L32_SINT] = {
      .pack_rgba_uint = &util_format_l32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l32_sint_pack_signed,
   },

   [PIPE_FORMAT_L32A32_SINT] = {
      .pack_rgba_uint = &util_format_l32a32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_l32a32_sint_pack_signed,
   },

   [PIPE_FORMAT_B8G8R8_UINT] = {
      .pack_rgba_uint = &util_format_b8g8r8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8_uint_pack_signed,
   },

   [PIPE_FORMAT_B8G8R8A8_UINT] = {
      .pack_rgba_uint = &util_format_b8g8r8a8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8a8_uint_pack_signed,
   },

   [PIPE_FORMAT_B8G8R8_SINT] = {
      .pack_rgba_uint = &util_format_b8g8r8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8_sint_pack_signed,
   },

   [PIPE_FORMAT_B8G8R8A8_SINT] = {
      .pack_rgba_uint = &util_format_b8g8r8a8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_b8g8r8a8_sint_pack_signed,
   },

   [PIPE_FORMAT_A8R8G8B8_UINT] = {
      .pack_rgba_uint = &util_format_a8r8g8b8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8r8g8b8_uint_pack_signed,
   },

   [PIPE_FORMAT_A8B8G8R8_UINT] = {
      .pack_rgba_uint = &util_format_a8b8g8r8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8b8g8r8_uint_pack_signed,
   },

   [PIPE_FORMAT_A2R10G10B10_UINT] = {
      .pack_rgba_uint = &util_format_a2r10g10b10_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a2r10g10b10_uint_pack_signed,
   },

   [PIPE_FORMAT_A2B10G10R10_UINT] = {
      .pack_rgba_uint = &util_format_a2b10g10r10_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a2b10g10r10_uint_pack_signed,
   },

   [PIPE_FORMAT_B10G10R10A2_UINT] = {
      .pack_rgba_uint = &util_format_b10g10r10a2_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b10g10r10a2_uint_pack_signed,
   },

   [PIPE_FORMAT_B10G10R10A2_SINT] = {
      .pack_rgba_uint = &util_format_b10g10r10a2_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_b10g10r10a2_sint_pack_signed,
   },

   [PIPE_FORMAT_R5G6B5_UINT] = {
      .pack_rgba_uint = &util_format_r5g6b5_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r5g6b5_uint_pack_signed,
   },

   [PIPE_FORMAT_B5G6R5_UINT] = {
      .pack_rgba_uint = &util_format_b5g6r5_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b5g6r5_uint_pack_signed,
   },

   [PIPE_FORMAT_R3G3B2_UINT] = {
      .pack_rgba_uint = &util_format_r3g3b2_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r3g3b2_uint_pack_signed,
   },

   [PIPE_FORMAT_B2G3R3_UINT] = {
      .pack_rgba_uint = &util_format_b2g3r3_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b2g3r3_uint_pack_signed,
   },

   [PIPE_FORMAT_R4G4B4A4_UINT] = {
      .pack_rgba_uint = &util_format_r4g4b4a4_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r4g4b4a4_uint_pack_signed,
   },

   [PIPE_FORMAT_B4G4R4A4_UINT] = {
      .pack_rgba_uint = &util_format_b4g4r4a4_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b4g4r4a4_uint_pack_signed,
   },

   [PIPE_FORMAT_A4R4G4B4_UINT] = {
      .pack_rgba_uint = &util_format_a4r4g4b4_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a4r4g4b4_uint_pack_signed,
   },

   [PIPE_FORMAT_A4B4G4R4_UINT] = {
      .pack_rgba_uint = &util_format_a4b4g4r4_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a4b4g4r4_uint_pack_signed,
   },

   [PIPE_FORMAT_A1R5G5B5_UINT] = {
      .pack_rgba_uint = &util_format_a1r5g5b5_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a1r5g5b5_uint_pack_signed,
   },

   [PIPE_FORMAT_A1B5G5R5_UINT] = {
      .pack_rgba_uint = &util_format_a1b5g5r5_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_a1b5g5r5_uint_pack_signed,
   },

   [PIPE_FORMAT_R5G5B5A1_UINT] = {
      .pack_rgba_uint = &util_format_r5g5b5a1_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r5g5b5a1_uint_pack_signed,
   },

   [PIPE_FORMAT_B5G5R5A1_UINT] = {
      .pack_rgba_uint = &util_format_b5g5r5a1_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_b5g5r5a1_uint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8X8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8g8b8x8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8x8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8X8_SRGB] = {
      .pack_rgba_8unorm = &util_format_r8g8b8x8_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8g8b8x8_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R8G8B8X8_UINT] = {
      .pack_rgba_uint = &util_format_r8g8b8x8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8x8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8G8B8X8_SINT] = {
      .pack_rgba_uint = &util_format_r8g8b8x8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8g8b8x8_sint_pack_signed,
   },

   [PIPE_FORMAT_B10G10R10X2_UNORM] = {
      .pack_rgba_8unorm = &util_format_b10g10r10x2_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10x2_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10X2_SNORM] = {
      .pack_rgba_8unorm = &util_format_b10g10r10x2_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b10g10r10x2_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_B10G10R10X2_SINT] = {
      .pack_rgba_uint = &util_format_b10g10r10x2_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_b10g10r10x2_sint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16X16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16x16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16x16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16X16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16g16b16x16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16x16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16X16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16g16b16x16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16g16b16x16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R16G16B16X16_UINT] = {
      .pack_rgba_uint = &util_format_r16g16b16x16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16x16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16G16B16X16_SINT] = {
      .pack_rgba_uint = &util_format_r16g16b16x16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16g16b16x16_sint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32X32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32g32b32x32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32g32b32x32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32G32B32X32_UINT] = {
      .pack_rgba_uint = &util_format_r32g32b32x32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32x32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32G32B32X32_SINT] = {
      .pack_rgba_uint = &util_format_r32g32b32x32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32g32b32x32_sint_pack_signed,
   },

   [PIPE_FORMAT_R8A8_SNORM] = {
      .pack_rgba_8unorm = &util_format_r8a8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r8a8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16A16_UNORM] = {
      .pack_rgba_8unorm = &util_format_r16a16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16a16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16A16_SNORM] = {
      .pack_rgba_8unorm = &util_format_r16a16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16a16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_R16A16_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r16a16_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r16a16_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R32A32_FLOAT] = {
      .pack_rgba_8unorm = &util_format_r32a32_float_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r32a32_float_pack_rgba_float,
   },

   [PIPE_FORMAT_R8A8_UINT] = {
      .pack_rgba_uint = &util_format_r8a8_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8a8_uint_pack_signed,
   },

   [PIPE_FORMAT_R8A8_SINT] = {
      .pack_rgba_uint = &util_format_r8a8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r8a8_sint_pack_signed,
   },

   [PIPE_FORMAT_R16A16_UINT] = {
      .pack_rgba_uint = &util_format_r16a16_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16a16_uint_pack_signed,
   },

   [PIPE_FORMAT_R16A16_SINT] = {
      .pack_rgba_uint = &util_format_r16a16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r16a16_sint_pack_signed,
   },

   [PIPE_FORMAT_R32A32_UINT] = {
      .pack_rgba_uint = &util_format_r32a32_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32a32_uint_pack_signed,
   },

   [PIPE_FORMAT_R32A32_SINT] = {
      .pack_rgba_uint = &util_format_r32a32_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r32a32_sint_pack_signed,
   },

   [PIPE_FORMAT_R10G10B10A2_UINT] = {
      .pack_rgba_uint = &util_format_r10g10b10a2_uint_pack_unsigned,
      .pack_rgba_sint = &util_format_r10g10b10a2_uint_pack_signed,
   },

   [PIPE_FORMAT_R10G10B10A2_SINT] = {
      .pack_rgba_uint = &util_format_r10g10b10a2_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_r10g10b10a2_sint_pack_signed,
   },

   [PIPE_FORMAT_B5G6R5_SRGB] = {
      .pack_rgba_8unorm = &util_format_b5g6r5_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_b5g6r5_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_R5G6B5_SRGB] = {
      .pack_rgba_8unorm = &util_format_r5g6b5_srgb_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_r5g6b5_srgb_pack_rgba_float,
   },

   [PIPE_FORMAT_G8R8_UNORM] = {
      .pack_rgba_8unorm = &util_format_g8r8_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_g8r8_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_G8R8_SNORM] = {
      .pack_rgba_8unorm = &util_format_g8r8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_g8r8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_G8R8_SINT] = {
      .pack_rgba_uint = &util_format_g8r8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_g8r8_sint_pack_signed,
   },

   [PIPE_FORMAT_G16R16_UNORM] = {
      .pack_rgba_8unorm = &util_format_g16r16_unorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_g16r16_unorm_pack_rgba_float,
   },

   [PIPE_FORMAT_G16R16_SNORM] = {
      .pack_rgba_8unorm = &util_format_g16r16_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_g16r16_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_G16R16_SINT] = {
      .pack_rgba_uint = &util_format_g16r16_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_g16r16_sint_pack_signed,
   },

   [PIPE_FORMAT_A8B8G8R8_SNORM] = {
      .pack_rgba_8unorm = &util_format_a8b8g8r8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_a8b8g8r8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_A8B8G8R8_SINT] = {
      .pack_rgba_uint = &util_format_a8b8g8r8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_a8b8g8r8_sint_pack_signed,
   },

   [PIPE_FORMAT_X8B8G8R8_SNORM] = {
      .pack_rgba_8unorm = &util_format_x8b8g8r8_snorm_pack_rgba_8unorm,
      .pack_rgba_float = &util_format_x8b8g8r8_snorm_pack_rgba_float,
   },

   [PIPE_FORMAT_X8B8G8R8_SINT] = {
      .pack_rgba_uint = &util_format_x8b8g8r8_sint_pack_unsigned,
      .pack_rgba_sint = &util_format_x8b8g8r8_sint_pack_signed,
   },

};

ATTRIBUTE_RETURNS_NONNULL const struct util_format_pack_description *
util_format_pack_description(enum pipe_format format)
{
   assert(format < PIPE_FORMAT_COUNT);
   return &util_format_pack_descriptions[format];
}

static const struct util_format_unpack_description
util_format_unpack_descriptions[PIPE_FORMAT_COUNT] = {
   [PIPE_FORMAT_NONE] = {
      .unpack_rgba_8unorm = &util_format_none_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_none_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8A8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8a8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8a8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8X8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8x8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8x8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8X8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8x8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8x8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8X8_UINT] = {
      .unpack_rgba = &util_format_b8g8r8x8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B8G8R8X8_SINT] = {
      .unpack_rgba = &util_format_b8g8r8x8_sint_unpack_signed,
   },
   [PIPE_FORMAT_A8R8G8B8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a8r8g8b8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8r8g8b8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8R8G8B8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_a8r8g8b8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8r8g8b8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8R8G8B8_SINT] = {
      .unpack_rgba = &util_format_a8r8g8b8_sint_unpack_signed,
   },
   [PIPE_FORMAT_X8R8G8B8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_x8r8g8b8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8r8g8b8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8R8G8B8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_x8r8g8b8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8r8g8b8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8R8G8B8_SINT] = {
      .unpack_rgba = &util_format_x8r8g8b8_sint_unpack_signed,
   },
   [PIPE_FORMAT_A8B8G8R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a8b8g8r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8b8g8r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8B8G8R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_x8b8g8r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8b8g8r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8X8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8x8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8x8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R5G5B5A1_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r5g5b5a1_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r5g5b5a1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R5G5B5X1_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r5g5b5x1_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r5g5b5x1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B5G5R5X1_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b5g5r5x1_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b5g5r5x1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B5G5R5A1_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b5g5r5a1_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b5g5r5a1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X1B5G5R5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_x1b5g5r5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x1b5g5r5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A1R5G5B5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a1r5g5b5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a1r5g5b5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X1R5G5B5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_x1r5g5b5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x1r5g5b5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A1B5G5R5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a1b5g5r5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a1b5g5r5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R4G4B4A4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r4g4b4a4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r4g4b4a4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R4G4B4X4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r4g4b4x4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r4g4b4x4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B4G4R4A4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b4g4r4a4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b4g4r4a4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B4G4R4X4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b4g4r4x4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b4g4r4x4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A4R4G4B4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a4r4g4b4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a4r4g4b4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A4B4G4R4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a4b4g4r4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a4b4g4r4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R5G6B5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r5g6b5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r5g6b5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B5G6R5_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b5g6r5_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b5g6r5_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10A2_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10a2_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10a2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10X2_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10x2_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10x2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10A2_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10a2_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10a2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A2R10G10B10_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a2r10g10b10_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a2r10g10b10_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A2B10G10R10_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a2b10g10r10_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a2b10g10r10_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R3G3B2_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r3g3b2_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r3g3b2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B2G3R3_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b2g3r3_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b2g3r3_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_l8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_I8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_i8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L4A4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_l4a4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l4a4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8A8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_l8a8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8a8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_l16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_I16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_i16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16A16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_l16a16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16a16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_a8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_l8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8A8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_l8a8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8a8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_I8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_i8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_a16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_l16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16A16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_l16a16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16a16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_I16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_i16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_a16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_l16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_L16A16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_l16a16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l16a16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_I16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_i16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_A32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_a32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_L32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_l32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_L32A32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_l32a32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l32a32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_I32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_i32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_i32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_l8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_L8A8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_l8a8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_l8a8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r8g8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8A8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8a8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8a8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8B8G8R8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_a8b8g8r8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8b8g8r8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8B8G8R8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_x8b8g8r8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8b8g8r8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8A8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8a8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8a8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8X8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8x8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8x8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8R8G8B8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_a8r8g8b8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8r8g8b8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8R8G8B8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_x8r8g8b8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8r8g8b8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = {
      .unpack_rgba_8unorm = &util_format_r8sg8sb8ux8u_norm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8sg8sb8ux8u_norm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = {
      .unpack_rgba_8unorm = &util_format_r10sg10sb10sa2u_norm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10sg10sb10sa2u_norm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R5SG5SB6U_NORM] = {
      .unpack_rgba_8unorm = &util_format_r5sg5sb6u_norm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r5sg5sb6u_norm_unpack_rgba_float,
   },
   [PIPE_FORMAT_S8_UINT] = {
      .unpack_s_8uint = &util_format_s8_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_Z16_UNORM] = {
      .unpack_z_32unorm = &util_format_z16_unorm_unpack_z_32unorm,
      .unpack_z_float = &util_format_z16_unorm_unpack_z_float,
   },
   [PIPE_FORMAT_Z16_UNORM_S8_UINT] = {
      .unpack_z_32unorm = &util_format_z16_unorm_s8_uint_unpack_z_32unorm,
      .unpack_z_float = &util_format_z16_unorm_s8_uint_unpack_z_float,
      .unpack_s_8uint = &util_format_z16_unorm_s8_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_Z32_UNORM] = {
      .unpack_z_32unorm = &util_format_z32_unorm_unpack_z_32unorm,
      .unpack_z_float = &util_format_z32_unorm_unpack_z_float,
   },
   [PIPE_FORMAT_Z32_FLOAT] = {
      .unpack_z_32unorm = &util_format_z32_float_unpack_z_32unorm,
      .unpack_z_float = &util_format_z32_float_unpack_z_float,
   },
   [PIPE_FORMAT_Z24_UNORM_S8_UINT] = {
      .unpack_z_32unorm = &util_format_z24_unorm_s8_uint_unpack_z_32unorm,
      .unpack_z_float = &util_format_z24_unorm_s8_uint_unpack_z_float,
      .unpack_s_8uint = &util_format_z24_unorm_s8_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_S8_UINT_Z24_UNORM] = {
      .unpack_z_32unorm = &util_format_s8_uint_z24_unorm_unpack_z_32unorm,
      .unpack_z_float = &util_format_s8_uint_z24_unorm_unpack_z_float,
      .unpack_s_8uint = &util_format_s8_uint_z24_unorm_unpack_s_8uint,
   },
   [PIPE_FORMAT_X24S8_UINT] = {
      .unpack_s_8uint = &util_format_x24s8_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_S8X24_UINT] = {
      .unpack_s_8uint = &util_format_s8x24_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_Z24X8_UNORM] = {
      .unpack_z_32unorm = &util_format_z24x8_unorm_unpack_z_32unorm,
      .unpack_z_float = &util_format_z24x8_unorm_unpack_z_float,
   },
   [PIPE_FORMAT_X8Z24_UNORM] = {
      .unpack_z_32unorm = &util_format_x8z24_unorm_unpack_z_32unorm,
      .unpack_z_float = &util_format_x8z24_unorm_unpack_z_float,
   },
   [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = {
      .unpack_z_32unorm = &util_format_z32_float_s8x24_uint_unpack_z_32unorm,
      .unpack_z_float = &util_format_z32_float_s8x24_uint_unpack_z_float,
      .unpack_s_8uint = &util_format_z32_float_s8x24_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_X32_S8X24_UINT] = {
      .unpack_s_8uint = &util_format_x32_s8x24_uint_unpack_s_8uint,
   },
   [PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8] = {
      .unpack_rgba_8unorm = &util_format_z24_unorm_s8_uint_as_r8g8b8a8_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_z24_unorm_s8_uint_as_r8g8b8a8_unpack_rgba_float,
   },
   [PIPE_FORMAT_UYVY] = {
      .unpack_rgba_8unorm_rect = &util_format_uyvy_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_uyvy_unpack_rgba_float,
   },
   [PIPE_FORMAT_YUYV] = {
      .unpack_rgba_8unorm_rect = &util_format_yuyv_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_yuyv_unpack_rgba_float,
   },
   [PIPE_FORMAT_AYUV] = { 0 },
   [PIPE_FORMAT_XYUV] = { 0 },
   [PIPE_FORMAT_R8G8_B8G8_UNORM] = {
      .unpack_rgba_8unorm_rect = &util_format_r8g8_b8g8_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_r8g8_b8g8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_G8R8_G8B8_UNORM] = { 0 },
   [PIPE_FORMAT_G8R8_B8R8_UNORM] = { 0 },
   [PIPE_FORMAT_R8G8_R8B8_UNORM] = { 0 },
   [PIPE_FORMAT_R11G11B10_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r11g11b10_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r11g11b10_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R9G9B9E5_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r9g9b9e5_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r9g9b9e5_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R1_UNORM] = { 0 },
   [PIPE_FORMAT_R8G8Bx_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8bx_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8bx_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT1_RGB] = {
      .fetch_rgba_8unorm = &util_format_dxt1_rgb_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt1_rgb_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt1_rgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT1_RGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt1_rgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt1_rgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt1_rgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT3_RGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt3_rgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt3_rgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt3_rgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT5_RGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt5_rgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt5_rgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt5_rgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT1_SRGB] = {
      .fetch_rgba_8unorm = &util_format_dxt1_srgb_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt1_srgb_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt1_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT1_SRGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt1_srgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt1_srgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt1_srgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT3_SRGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt3_srgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt3_srgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt3_srgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_DXT5_SRGBA] = {
      .fetch_rgba_8unorm = &util_format_dxt5_srgba_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_dxt5_srgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_dxt5_srgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_FXT1_RGB] = {
      .unpack_rgba_8unorm_rect = &util_format_fxt1_rgb_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_fxt1_rgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_FXT1_RGBA] = {
      .unpack_rgba_8unorm_rect = &util_format_fxt1_rgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_fxt1_rgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_RGTC1_UNORM] = {
      .fetch_rgba_8unorm = &util_format_rgtc1_unorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_rgtc1_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_rgtc1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_RGTC1_SNORM] = {
      .fetch_rgba_8unorm = &util_format_rgtc1_snorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_rgtc1_snorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_rgtc1_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_RGTC2_UNORM] = {
      .fetch_rgba_8unorm = &util_format_rgtc2_unorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_rgtc2_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_rgtc2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_RGTC2_SNORM] = {
      .fetch_rgba_8unorm = &util_format_rgtc2_snorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_rgtc2_snorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_rgtc2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_LATC1_UNORM] = {
      .fetch_rgba_8unorm = &util_format_latc1_unorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_latc1_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_latc1_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_LATC1_SNORM] = {
      .fetch_rgba_8unorm = &util_format_latc1_snorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_latc1_snorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_latc1_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_LATC2_UNORM] = {
      .fetch_rgba_8unorm = &util_format_latc2_unorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_latc2_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_latc2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_LATC2_SNORM] = {
      .fetch_rgba_8unorm = &util_format_latc2_snorm_fetch_rgba_8unorm,
      .unpack_rgba_8unorm_rect = &util_format_latc2_snorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_latc2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_ETC1_RGB8] = {
      .unpack_rgba_8unorm_rect = &util_format_etc1_rgb8_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_etc1_rgb8_unpack_rgba_float,
   },
   [PIPE_FORMAT_ETC2_RGB8] = { 0 },
   [PIPE_FORMAT_ETC2_SRGB8] = { 0 },
   [PIPE_FORMAT_ETC2_RGB8A1] = { 0 },
   [PIPE_FORMAT_ETC2_SRGB8A1] = { 0 },
   [PIPE_FORMAT_ETC2_RGBA8] = { 0 },
   [PIPE_FORMAT_ETC2_SRGBA8] = { 0 },
   [PIPE_FORMAT_ETC2_R11_UNORM] = { 0 },
   [PIPE_FORMAT_ETC2_R11_SNORM] = { 0 },
   [PIPE_FORMAT_ETC2_RG11_UNORM] = { 0 },
   [PIPE_FORMAT_ETC2_RG11_SNORM] = { 0 },
   [PIPE_FORMAT_BPTC_RGBA_UNORM] = {
      .unpack_rgba_8unorm_rect = &util_format_bptc_rgba_unorm_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_bptc_rgba_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_BPTC_SRGBA] = {
      .unpack_rgba_8unorm_rect = &util_format_bptc_srgba_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_bptc_srgba_unpack_rgba_float,
   },
   [PIPE_FORMAT_BPTC_RGB_FLOAT] = {
      .unpack_rgba_8unorm_rect = &util_format_bptc_rgb_float_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_bptc_rgb_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_BPTC_RGB_UFLOAT] = {
      .unpack_rgba_8unorm_rect = &util_format_bptc_rgb_ufloat_unpack_rgba_8unorm,
      .unpack_rgba_rect = &util_format_bptc_rgb_ufloat_unpack_rgba_float,
   },
   [PIPE_FORMAT_ASTC_4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6] = { 0 },
   [PIPE_FORMAT_ASTC_8x5] = { 0 },
   [PIPE_FORMAT_ASTC_8x6] = { 0 },
   [PIPE_FORMAT_ASTC_8x8] = { 0 },
   [PIPE_FORMAT_ASTC_10x5] = { 0 },
   [PIPE_FORMAT_ASTC_10x6] = { 0 },
   [PIPE_FORMAT_ASTC_10x8] = { 0 },
   [PIPE_FORMAT_ASTC_10x10] = { 0 },
   [PIPE_FORMAT_ASTC_12x10] = { 0 },
   [PIPE_FORMAT_ASTC_12x12] = { 0 },
   [PIPE_FORMAT_ASTC_4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_8x8_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x6_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x8_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_10x10_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_12x10_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_12x12_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_3x3x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x3x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x3] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x4x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x4] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x5x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x5] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x6] = { 0 },
   [PIPE_FORMAT_ASTC_3x3x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x3x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x3_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_4x4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x4x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x4_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_5x5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x5x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x5_SRGB] = { 0 },
   [PIPE_FORMAT_ASTC_6x6x6_SRGB] = { 0 },
   [PIPE_FORMAT_ATC_RGB] = { 0 },
   [PIPE_FORMAT_ATC_RGBA_EXPLICIT] = { 0 },
   [PIPE_FORMAT_ATC_RGBA_INTERPOLATED] = { 0 },
   [PIPE_FORMAT_R64_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r64_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r64_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R64G64_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r64g64_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r64g64_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R64G64B64_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r64g64b64_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r64g64b64_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R64G64B64A64_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r64g64b64a64_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r64g64b64a64_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32g32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r32_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r32_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r32_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r32_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16g16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16A16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16a16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16a16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16A16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16a16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16a16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r16_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16A16_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16a16_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16a16_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16A16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16a16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16a16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r16_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16A16_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16a16_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16a16_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8A8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8a8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8a8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8A8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8a8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8a8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8A8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8a8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8a8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8B8G8R8_USCALED] = {
      .unpack_rgba_8unorm = &util_format_a8b8g8r8_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8b8g8r8_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8A8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8a8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8a8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8A8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8a8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8a8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8A8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8a8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8a8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B8G8R8A8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_b8g8r8a8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b8g8r8a8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8B8G8R8_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_a8b8g8r8_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8b8g8r8_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32_FIXED] = {
      .unpack_rgba_8unorm = &util_format_r32_fixed_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32_fixed_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32_FIXED] = {
      .unpack_rgba_8unorm = &util_format_r32g32_fixed_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32_fixed_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32_FIXED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32_fixed_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32_fixed_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32A32_FIXED] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32a32_fixed_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32a32_fixed_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10X2_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10x2_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10x2_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10X2_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10x2_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10x2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10X2_SINT] = {
      .unpack_rgba = &util_format_r10g10b10x2_sint_unpack_signed,
   },
   [PIPE_FORMAT_YV12] = { 0 },
   [PIPE_FORMAT_YV16] = { 0 },
   [PIPE_FORMAT_IYUV] = { 0 },
   [PIPE_FORMAT_NV12] = { 0 },
   [PIPE_FORMAT_NV21] = { 0 },
   [PIPE_FORMAT_R8_G8B8_420_UNORM] = { 0 },
   [PIPE_FORMAT_G8_B8R8_420_UNORM] = { 0 },
   [PIPE_FORMAT_G8_B8_R8_420_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8_V8_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8V8_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y8_U8_V8_444_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_420_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16V16_422_UNORM] = { 0 },
   [PIPE_FORMAT_Y16_U16_V16_444_UNORM] = { 0 },
   [PIPE_FORMAT_P010] = { 0 },
   [PIPE_FORMAT_P012] = { 0 },
   [PIPE_FORMAT_P016] = { 0 },
   [PIPE_FORMAT_Y210] = { 0 },
   [PIPE_FORMAT_Y212] = { 0 },
   [PIPE_FORMAT_Y216] = { 0 },
   [PIPE_FORMAT_Y410] = { 0 },
   [PIPE_FORMAT_Y412] = { 0 },
   [PIPE_FORMAT_Y416] = { 0 },
   [PIPE_FORMAT_A4R4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a4r4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a4r4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R4A4_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r4a4_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r4a4_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8A8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r8a8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8a8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_a8r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10A2_USCALED] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10a2_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10a2_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10A2_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10a2_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10a2_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_R10G10B10A2_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r10g10b10a2_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r10g10b10a2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10A2_USCALED] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10a2_uscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10a2_uscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10A2_SSCALED] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10a2_sscaled_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10a2_sscaled_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10A2_SNORM] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10a2_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10a2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8_UINT] = {
      .unpack_rgba = &util_format_r8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8G8_UINT] = {
      .unpack_rgba = &util_format_r8g8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8G8B8_UINT] = {
      .unpack_rgba = &util_format_r8g8b8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8G8B8A8_UINT] = {
      .unpack_rgba = &util_format_r8g8b8a8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8_SINT] = {
      .unpack_rgba = &util_format_r8_sint_unpack_signed,
   },
   [PIPE_FORMAT_R8G8_SINT] = {
      .unpack_rgba = &util_format_r8g8_sint_unpack_signed,
   },
   [PIPE_FORMAT_R8G8B8_SINT] = {
      .unpack_rgba = &util_format_r8g8b8_sint_unpack_signed,
   },
   [PIPE_FORMAT_R8G8B8A8_SINT] = {
      .unpack_rgba = &util_format_r8g8b8a8_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16_UINT] = {
      .unpack_rgba = &util_format_r16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16G16_UINT] = {
      .unpack_rgba = &util_format_r16g16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16G16B16_UINT] = {
      .unpack_rgba = &util_format_r16g16b16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16G16B16A16_UINT] = {
      .unpack_rgba = &util_format_r16g16b16a16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16_SINT] = {
      .unpack_rgba = &util_format_r16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16G16_SINT] = {
      .unpack_rgba = &util_format_r16g16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16G16B16_SINT] = {
      .unpack_rgba = &util_format_r16g16b16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16G16B16A16_SINT] = {
      .unpack_rgba = &util_format_r16g16b16a16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32_UINT] = {
      .unpack_rgba = &util_format_r32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32G32_UINT] = {
      .unpack_rgba = &util_format_r32g32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32G32B32_UINT] = {
      .unpack_rgba = &util_format_r32g32b32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32G32B32A32_UINT] = {
      .unpack_rgba = &util_format_r32g32b32a32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32_SINT] = {
      .unpack_rgba = &util_format_r32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32G32_SINT] = {
      .unpack_rgba = &util_format_r32g32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32G32B32_SINT] = {
      .unpack_rgba = &util_format_r32g32b32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32G32B32A32_SINT] = {
      .unpack_rgba = &util_format_r32g32b32a32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R64_UINT] = {
      .unpack_rgba = &util_format_r64_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R64G64_UINT] = {
      .unpack_rgba = &util_format_r64g64_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R64G64B64_UINT] = {
      .unpack_rgba = &util_format_r64g64b64_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R64G64B64A64_UINT] = {
      .unpack_rgba = &util_format_r64g64b64a64_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R64_SINT] = {
      .unpack_rgba = &util_format_r64_sint_unpack_signed,
   },
   [PIPE_FORMAT_A8_UINT] = {
      .unpack_rgba = &util_format_a8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_I8_UINT] = {
      .unpack_rgba = &util_format_i8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L8_UINT] = {
      .unpack_rgba = &util_format_l8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L8A8_UINT] = {
      .unpack_rgba = &util_format_l8a8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A8_SINT] = {
      .unpack_rgba = &util_format_a8_sint_unpack_signed,
   },
   [PIPE_FORMAT_I8_SINT] = {
      .unpack_rgba = &util_format_i8_sint_unpack_signed,
   },
   [PIPE_FORMAT_L8_SINT] = {
      .unpack_rgba = &util_format_l8_sint_unpack_signed,
   },
   [PIPE_FORMAT_L8A8_SINT] = {
      .unpack_rgba = &util_format_l8a8_sint_unpack_signed,
   },
   [PIPE_FORMAT_A16_UINT] = {
      .unpack_rgba = &util_format_a16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_I16_UINT] = {
      .unpack_rgba = &util_format_i16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L16_UINT] = {
      .unpack_rgba = &util_format_l16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L16A16_UINT] = {
      .unpack_rgba = &util_format_l16a16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A16_SINT] = {
      .unpack_rgba = &util_format_a16_sint_unpack_signed,
   },
   [PIPE_FORMAT_I16_SINT] = {
      .unpack_rgba = &util_format_i16_sint_unpack_signed,
   },
   [PIPE_FORMAT_L16_SINT] = {
      .unpack_rgba = &util_format_l16_sint_unpack_signed,
   },
   [PIPE_FORMAT_L16A16_SINT] = {
      .unpack_rgba = &util_format_l16a16_sint_unpack_signed,
   },
   [PIPE_FORMAT_A32_UINT] = {
      .unpack_rgba = &util_format_a32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_I32_UINT] = {
      .unpack_rgba = &util_format_i32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L32_UINT] = {
      .unpack_rgba = &util_format_l32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_L32A32_UINT] = {
      .unpack_rgba = &util_format_l32a32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A32_SINT] = {
      .unpack_rgba = &util_format_a32_sint_unpack_signed,
   },
   [PIPE_FORMAT_I32_SINT] = {
      .unpack_rgba = &util_format_i32_sint_unpack_signed,
   },
   [PIPE_FORMAT_L32_SINT] = {
      .unpack_rgba = &util_format_l32_sint_unpack_signed,
   },
   [PIPE_FORMAT_L32A32_SINT] = {
      .unpack_rgba = &util_format_l32a32_sint_unpack_signed,
   },
   [PIPE_FORMAT_B8G8R8_UINT] = {
      .unpack_rgba = &util_format_b8g8r8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B8G8R8A8_UINT] = {
      .unpack_rgba = &util_format_b8g8r8a8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B8G8R8_SINT] = {
      .unpack_rgba = &util_format_b8g8r8_sint_unpack_signed,
   },
   [PIPE_FORMAT_B8G8R8A8_SINT] = {
      .unpack_rgba = &util_format_b8g8r8a8_sint_unpack_signed,
   },
   [PIPE_FORMAT_A8R8G8B8_UINT] = {
      .unpack_rgba = &util_format_a8r8g8b8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A8B8G8R8_UINT] = {
      .unpack_rgba = &util_format_a8b8g8r8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A2R10G10B10_UINT] = {
      .unpack_rgba = &util_format_a2r10g10b10_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A2B10G10R10_UINT] = {
      .unpack_rgba = &util_format_a2b10g10r10_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B10G10R10A2_UINT] = {
      .unpack_rgba = &util_format_b10g10r10a2_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B10G10R10A2_SINT] = {
      .unpack_rgba = &util_format_b10g10r10a2_sint_unpack_signed,
   },
   [PIPE_FORMAT_R5G6B5_UINT] = {
      .unpack_rgba = &util_format_r5g6b5_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B5G6R5_UINT] = {
      .unpack_rgba = &util_format_b5g6r5_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R3G3B2_UINT] = {
      .unpack_rgba = &util_format_r3g3b2_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B2G3R3_UINT] = {
      .unpack_rgba = &util_format_b2g3r3_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R4G4B4A4_UINT] = {
      .unpack_rgba = &util_format_r4g4b4a4_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B4G4R4A4_UINT] = {
      .unpack_rgba = &util_format_b4g4r4a4_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A4R4G4B4_UINT] = {
      .unpack_rgba = &util_format_a4r4g4b4_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A4B4G4R4_UINT] = {
      .unpack_rgba = &util_format_a4b4g4r4_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A1R5G5B5_UINT] = {
      .unpack_rgba = &util_format_a1r5g5b5_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_A1B5G5R5_UINT] = {
      .unpack_rgba = &util_format_a1b5g5r5_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R5G5B5A1_UINT] = {
      .unpack_rgba = &util_format_r5g5b5a1_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_B5G5R5A1_UINT] = {
      .unpack_rgba = &util_format_b5g5r5a1_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8G8B8X8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8x8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8x8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8X8_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r8g8b8x8_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8g8b8x8_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8G8B8X8_UINT] = {
      .unpack_rgba = &util_format_r8g8b8x8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8G8B8X8_SINT] = {
      .unpack_rgba = &util_format_r8g8b8x8_sint_unpack_signed,
   },
   [PIPE_FORMAT_B10G10R10X2_UNORM] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10x2_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10x2_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10X2_SNORM] = {
      .unpack_rgba_8unorm = &util_format_b10g10r10x2_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b10g10r10x2_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_B10G10R10X2_SINT] = {
      .unpack_rgba = &util_format_b10g10r10x2_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16G16B16X16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16x16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16x16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16X16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16x16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16x16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16X16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16g16b16x16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16g16b16x16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16G16B16X16_UINT] = {
      .unpack_rgba = &util_format_r16g16b16x16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16G16B16X16_SINT] = {
      .unpack_rgba = &util_format_r16g16b16x16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32G32B32X32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32g32b32x32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32g32b32x32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32G32B32X32_UINT] = {
      .unpack_rgba = &util_format_r32g32b32x32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32G32B32X32_SINT] = {
      .unpack_rgba = &util_format_r32g32b32x32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R8A8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r8a8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r8a8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16A16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_r16a16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16a16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16A16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_r16a16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16a16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_R16A16_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r16a16_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r16a16_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R32A32_FLOAT] = {
      .unpack_rgba_8unorm = &util_format_r32a32_float_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r32a32_float_unpack_rgba_float,
   },
   [PIPE_FORMAT_R8A8_UINT] = {
      .unpack_rgba = &util_format_r8a8_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R8A8_SINT] = {
      .unpack_rgba = &util_format_r8a8_sint_unpack_signed,
   },
   [PIPE_FORMAT_R16A16_UINT] = {
      .unpack_rgba = &util_format_r16a16_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R16A16_SINT] = {
      .unpack_rgba = &util_format_r16a16_sint_unpack_signed,
   },
   [PIPE_FORMAT_R32A32_UINT] = {
      .unpack_rgba = &util_format_r32a32_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R32A32_SINT] = {
      .unpack_rgba = &util_format_r32a32_sint_unpack_signed,
   },
   [PIPE_FORMAT_R10G10B10A2_UINT] = {
      .unpack_rgba = &util_format_r10g10b10a2_uint_unpack_unsigned,
   },
   [PIPE_FORMAT_R10G10B10A2_SINT] = {
      .unpack_rgba = &util_format_r10g10b10a2_sint_unpack_signed,
   },
   [PIPE_FORMAT_B5G6R5_SRGB] = {
      .unpack_rgba_8unorm = &util_format_b5g6r5_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_b5g6r5_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_R5G6B5_SRGB] = {
      .unpack_rgba_8unorm = &util_format_r5g6b5_srgb_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_r5g6b5_srgb_unpack_rgba_float,
   },
   [PIPE_FORMAT_G8R8_UNORM] = {
      .unpack_rgba_8unorm = &util_format_g8r8_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_g8r8_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_G8R8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_g8r8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_g8r8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_G8R8_SINT] = {
      .unpack_rgba = &util_format_g8r8_sint_unpack_signed,
   },
   [PIPE_FORMAT_G16R16_UNORM] = {
      .unpack_rgba_8unorm = &util_format_g16r16_unorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_g16r16_unorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_G16R16_SNORM] = {
      .unpack_rgba_8unorm = &util_format_g16r16_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_g16r16_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_G16R16_SINT] = {
      .unpack_rgba = &util_format_g16r16_sint_unpack_signed,
   },
   [PIPE_FORMAT_A8B8G8R8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_a8b8g8r8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_a8b8g8r8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_A8B8G8R8_SINT] = {
      .unpack_rgba = &util_format_a8b8g8r8_sint_unpack_signed,
   },
   [PIPE_FORMAT_X8B8G8R8_SNORM] = {
      .unpack_rgba_8unorm = &util_format_x8b8g8r8_snorm_unpack_rgba_8unorm,
      .unpack_rgba = &util_format_x8b8g8r8_snorm_unpack_rgba_float,
   },
   [PIPE_FORMAT_X8B8G8R8_SINT] = {
      .unpack_rgba = &util_format_x8b8g8r8_sint_unpack_signed,
   },
};

ATTRIBUTE_RETURNS_NONNULL const struct util_format_unpack_description *
util_format_unpack_description_generic(enum pipe_format format)
{
   assert(format < PIPE_FORMAT_COUNT);
   return &util_format_unpack_descriptions[format];
}

static const util_format_fetch_rgba_func_ptr util_format_fetch_rgba_table[PIPE_FORMAT_COUNT] = {
  [PIPE_FORMAT_NONE] = &util_format_none_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_UNORM] = &util_format_b8g8r8a8_unorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8X8_UNORM] = &util_format_b8g8r8x8_unorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8X8_SNORM] = &util_format_b8g8r8x8_snorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8X8_UINT] = &util_format_b8g8r8x8_uint_fetch_rgba,
  [PIPE_FORMAT_B8G8R8X8_SINT] = &util_format_b8g8r8x8_sint_fetch_rgba,
  [PIPE_FORMAT_A8R8G8B8_UNORM] = &util_format_a8r8g8b8_unorm_fetch_rgba,
  [PIPE_FORMAT_A8R8G8B8_SNORM] = &util_format_a8r8g8b8_snorm_fetch_rgba,
  [PIPE_FORMAT_A8R8G8B8_SINT] = &util_format_a8r8g8b8_sint_fetch_rgba,
  [PIPE_FORMAT_X8R8G8B8_UNORM] = &util_format_x8r8g8b8_unorm_fetch_rgba,
  [PIPE_FORMAT_X8R8G8B8_SNORM] = &util_format_x8r8g8b8_snorm_fetch_rgba,
  [PIPE_FORMAT_X8R8G8B8_SINT] = &util_format_x8r8g8b8_sint_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_UNORM] = &util_format_a8b8g8r8_unorm_fetch_rgba,
  [PIPE_FORMAT_X8B8G8R8_UNORM] = &util_format_x8b8g8r8_unorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8X8_UNORM] = &util_format_r8g8b8x8_unorm_fetch_rgba,
  [PIPE_FORMAT_R5G5B5A1_UNORM] = &util_format_r5g5b5a1_unorm_fetch_rgba,
  [PIPE_FORMAT_R5G5B5X1_UNORM] = &util_format_r5g5b5x1_unorm_fetch_rgba,
  [PIPE_FORMAT_B5G5R5X1_UNORM] = &util_format_b5g5r5x1_unorm_fetch_rgba,
  [PIPE_FORMAT_B5G5R5A1_UNORM] = &util_format_b5g5r5a1_unorm_fetch_rgba,
  [PIPE_FORMAT_X1B5G5R5_UNORM] = &util_format_x1b5g5r5_unorm_fetch_rgba,
  [PIPE_FORMAT_A1R5G5B5_UNORM] = &util_format_a1r5g5b5_unorm_fetch_rgba,
  [PIPE_FORMAT_X1R5G5B5_UNORM] = &util_format_x1r5g5b5_unorm_fetch_rgba,
  [PIPE_FORMAT_A1B5G5R5_UNORM] = &util_format_a1b5g5r5_unorm_fetch_rgba,
  [PIPE_FORMAT_R4G4B4A4_UNORM] = &util_format_r4g4b4a4_unorm_fetch_rgba,
  [PIPE_FORMAT_R4G4B4X4_UNORM] = &util_format_r4g4b4x4_unorm_fetch_rgba,
  [PIPE_FORMAT_B4G4R4A4_UNORM] = &util_format_b4g4r4a4_unorm_fetch_rgba,
  [PIPE_FORMAT_B4G4R4X4_UNORM] = &util_format_b4g4r4x4_unorm_fetch_rgba,
  [PIPE_FORMAT_A4R4G4B4_UNORM] = &util_format_a4r4g4b4_unorm_fetch_rgba,
  [PIPE_FORMAT_A4B4G4R4_UNORM] = &util_format_a4b4g4r4_unorm_fetch_rgba,
  [PIPE_FORMAT_R5G6B5_UNORM] = &util_format_r5g6b5_unorm_fetch_rgba,
  [PIPE_FORMAT_B5G6R5_UNORM] = &util_format_b5g6r5_unorm_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_UNORM] = &util_format_r10g10b10a2_unorm_fetch_rgba,
  [PIPE_FORMAT_R10G10B10X2_UNORM] = &util_format_r10g10b10x2_unorm_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_UNORM] = &util_format_b10g10r10a2_unorm_fetch_rgba,
  [PIPE_FORMAT_A2R10G10B10_UNORM] = &util_format_a2r10g10b10_unorm_fetch_rgba,
  [PIPE_FORMAT_A2B10G10R10_UNORM] = &util_format_a2b10g10r10_unorm_fetch_rgba,
  [PIPE_FORMAT_R3G3B2_UNORM] = &util_format_r3g3b2_unorm_fetch_rgba,
  [PIPE_FORMAT_B2G3R3_UNORM] = &util_format_b2g3r3_unorm_fetch_rgba,
  [PIPE_FORMAT_L8_UNORM] = &util_format_l8_unorm_fetch_rgba,
  [PIPE_FORMAT_A8_UNORM] = &util_format_a8_unorm_fetch_rgba,
  [PIPE_FORMAT_I8_UNORM] = &util_format_i8_unorm_fetch_rgba,
  [PIPE_FORMAT_L4A4_UNORM] = &util_format_l4a4_unorm_fetch_rgba,
  [PIPE_FORMAT_L8A8_UNORM] = &util_format_l8a8_unorm_fetch_rgba,
  [PIPE_FORMAT_L16_UNORM] = &util_format_l16_unorm_fetch_rgba,
  [PIPE_FORMAT_A16_UNORM] = &util_format_a16_unorm_fetch_rgba,
  [PIPE_FORMAT_I16_UNORM] = &util_format_i16_unorm_fetch_rgba,
  [PIPE_FORMAT_L16A16_UNORM] = &util_format_l16a16_unorm_fetch_rgba,
  [PIPE_FORMAT_A8_SNORM] = &util_format_a8_snorm_fetch_rgba,
  [PIPE_FORMAT_L8_SNORM] = &util_format_l8_snorm_fetch_rgba,
  [PIPE_FORMAT_L8A8_SNORM] = &util_format_l8a8_snorm_fetch_rgba,
  [PIPE_FORMAT_I8_SNORM] = &util_format_i8_snorm_fetch_rgba,
  [PIPE_FORMAT_A16_SNORM] = &util_format_a16_snorm_fetch_rgba,
  [PIPE_FORMAT_L16_SNORM] = &util_format_l16_snorm_fetch_rgba,
  [PIPE_FORMAT_L16A16_SNORM] = &util_format_l16a16_snorm_fetch_rgba,
  [PIPE_FORMAT_I16_SNORM] = &util_format_i16_snorm_fetch_rgba,
  [PIPE_FORMAT_A16_FLOAT] = &util_format_a16_float_fetch_rgba,
  [PIPE_FORMAT_L16_FLOAT] = &util_format_l16_float_fetch_rgba,
  [PIPE_FORMAT_L16A16_FLOAT] = &util_format_l16a16_float_fetch_rgba,
  [PIPE_FORMAT_I16_FLOAT] = &util_format_i16_float_fetch_rgba,
  [PIPE_FORMAT_A32_FLOAT] = &util_format_a32_float_fetch_rgba,
  [PIPE_FORMAT_L32_FLOAT] = &util_format_l32_float_fetch_rgba,
  [PIPE_FORMAT_L32A32_FLOAT] = &util_format_l32a32_float_fetch_rgba,
  [PIPE_FORMAT_I32_FLOAT] = &util_format_i32_float_fetch_rgba,
  [PIPE_FORMAT_L8_SRGB] = &util_format_l8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8_SRGB] = &util_format_r8_srgb_fetch_rgba,
  [PIPE_FORMAT_L8A8_SRGB] = &util_format_l8a8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8G8_SRGB] = &util_format_r8g8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_SRGB] = &util_format_r8g8b8_srgb_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_SRGB] = &util_format_b8g8r8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_SRGB] = &util_format_r8g8b8a8_srgb_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_SRGB] = &util_format_a8b8g8r8_srgb_fetch_rgba,
  [PIPE_FORMAT_X8B8G8R8_SRGB] = &util_format_x8b8g8r8_srgb_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_SRGB] = &util_format_b8g8r8a8_srgb_fetch_rgba,
  [PIPE_FORMAT_B8G8R8X8_SRGB] = &util_format_b8g8r8x8_srgb_fetch_rgba,
  [PIPE_FORMAT_A8R8G8B8_SRGB] = &util_format_a8r8g8b8_srgb_fetch_rgba,
  [PIPE_FORMAT_X8R8G8B8_SRGB] = &util_format_x8r8g8b8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = &util_format_r8sg8sb8ux8u_norm_fetch_rgba,
  [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = &util_format_r10sg10sb10sa2u_norm_fetch_rgba,
  [PIPE_FORMAT_R5SG5SB6U_NORM] = &util_format_r5sg5sb6u_norm_fetch_rgba,
  [PIPE_FORMAT_S8_UINT] = NULL,
  [PIPE_FORMAT_Z16_UNORM] = NULL,
  [PIPE_FORMAT_Z16_UNORM_S8_UINT] = NULL,
  [PIPE_FORMAT_Z32_UNORM] = NULL,
  [PIPE_FORMAT_Z32_FLOAT] = NULL,
  [PIPE_FORMAT_Z24_UNORM_S8_UINT] = NULL,
  [PIPE_FORMAT_S8_UINT_Z24_UNORM] = NULL,
  [PIPE_FORMAT_X24S8_UINT] = NULL,
  [PIPE_FORMAT_S8X24_UINT] = NULL,
  [PIPE_FORMAT_Z24X8_UNORM] = NULL,
  [PIPE_FORMAT_X8Z24_UNORM] = NULL,
  [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = NULL,
  [PIPE_FORMAT_X32_S8X24_UINT] = NULL,
  [PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8] = &util_format_z24_unorm_s8_uint_as_r8g8b8a8_fetch_rgba,
  [PIPE_FORMAT_UYVY] = &util_format_uyvy_fetch_rgba,
  [PIPE_FORMAT_YUYV] = &util_format_yuyv_fetch_rgba,
  [PIPE_FORMAT_AYUV] = NULL,
  [PIPE_FORMAT_XYUV] = NULL,
  [PIPE_FORMAT_R8G8_B8G8_UNORM] = &util_format_r8g8_b8g8_unorm_fetch_rgba,
  [PIPE_FORMAT_G8R8_G8B8_UNORM] = NULL,
  [PIPE_FORMAT_G8R8_B8R8_UNORM] = NULL,
  [PIPE_FORMAT_R8G8_R8B8_UNORM] = NULL,
  [PIPE_FORMAT_R11G11B10_FLOAT] = &util_format_r11g11b10_float_fetch_rgba,
  [PIPE_FORMAT_R9G9B9E5_FLOAT] = &util_format_r9g9b9e5_float_fetch_rgba,
  [PIPE_FORMAT_R1_UNORM] = NULL,
  [PIPE_FORMAT_R8G8Bx_SNORM] = &util_format_r8g8bx_snorm_fetch_rgba,
  [PIPE_FORMAT_DXT1_RGB] = &util_format_dxt1_rgb_fetch_rgba,
  [PIPE_FORMAT_DXT1_RGBA] = &util_format_dxt1_rgba_fetch_rgba,
  [PIPE_FORMAT_DXT3_RGBA] = &util_format_dxt3_rgba_fetch_rgba,
  [PIPE_FORMAT_DXT5_RGBA] = &util_format_dxt5_rgba_fetch_rgba,
  [PIPE_FORMAT_DXT1_SRGB] = &util_format_dxt1_srgb_fetch_rgba,
  [PIPE_FORMAT_DXT1_SRGBA] = &util_format_dxt1_srgba_fetch_rgba,
  [PIPE_FORMAT_DXT3_SRGBA] = &util_format_dxt3_srgba_fetch_rgba,
  [PIPE_FORMAT_DXT5_SRGBA] = &util_format_dxt5_srgba_fetch_rgba,
  [PIPE_FORMAT_FXT1_RGB] = &util_format_fxt1_rgb_fetch_rgba,
  [PIPE_FORMAT_FXT1_RGBA] = &util_format_fxt1_rgba_fetch_rgba,
  [PIPE_FORMAT_RGTC1_UNORM] = &util_format_rgtc1_unorm_fetch_rgba,
  [PIPE_FORMAT_RGTC1_SNORM] = &util_format_rgtc1_snorm_fetch_rgba,
  [PIPE_FORMAT_RGTC2_UNORM] = &util_format_rgtc2_unorm_fetch_rgba,
  [PIPE_FORMAT_RGTC2_SNORM] = &util_format_rgtc2_snorm_fetch_rgba,
  [PIPE_FORMAT_LATC1_UNORM] = &util_format_latc1_unorm_fetch_rgba,
  [PIPE_FORMAT_LATC1_SNORM] = &util_format_latc1_snorm_fetch_rgba,
  [PIPE_FORMAT_LATC2_UNORM] = &util_format_latc2_unorm_fetch_rgba,
  [PIPE_FORMAT_LATC2_SNORM] = &util_format_latc2_snorm_fetch_rgba,
  [PIPE_FORMAT_ETC1_RGB8] = &util_format_etc1_rgb8_fetch_rgba,
  [PIPE_FORMAT_ETC2_RGB8] = NULL,
  [PIPE_FORMAT_ETC2_SRGB8] = NULL,
  [PIPE_FORMAT_ETC2_RGB8A1] = NULL,
  [PIPE_FORMAT_ETC2_SRGB8A1] = NULL,
  [PIPE_FORMAT_ETC2_RGBA8] = NULL,
  [PIPE_FORMAT_ETC2_SRGBA8] = NULL,
  [PIPE_FORMAT_ETC2_R11_UNORM] = NULL,
  [PIPE_FORMAT_ETC2_R11_SNORM] = NULL,
  [PIPE_FORMAT_ETC2_RG11_UNORM] = NULL,
  [PIPE_FORMAT_ETC2_RG11_SNORM] = NULL,
  [PIPE_FORMAT_BPTC_RGBA_UNORM] = &util_format_bptc_rgba_unorm_fetch_rgba,
  [PIPE_FORMAT_BPTC_SRGBA] = &util_format_bptc_srgba_fetch_rgba,
  [PIPE_FORMAT_BPTC_RGB_FLOAT] = &util_format_bptc_rgb_float_fetch_rgba,
  [PIPE_FORMAT_BPTC_RGB_UFLOAT] = &util_format_bptc_rgb_ufloat_fetch_rgba,
  [PIPE_FORMAT_ASTC_4x4] = NULL,
  [PIPE_FORMAT_ASTC_5x4] = NULL,
  [PIPE_FORMAT_ASTC_5x5] = NULL,
  [PIPE_FORMAT_ASTC_6x5] = NULL,
  [PIPE_FORMAT_ASTC_6x6] = NULL,
  [PIPE_FORMAT_ASTC_8x5] = NULL,
  [PIPE_FORMAT_ASTC_8x6] = NULL,
  [PIPE_FORMAT_ASTC_8x8] = NULL,
  [PIPE_FORMAT_ASTC_10x5] = NULL,
  [PIPE_FORMAT_ASTC_10x6] = NULL,
  [PIPE_FORMAT_ASTC_10x8] = NULL,
  [PIPE_FORMAT_ASTC_10x10] = NULL,
  [PIPE_FORMAT_ASTC_12x10] = NULL,
  [PIPE_FORMAT_ASTC_12x12] = NULL,
  [PIPE_FORMAT_ASTC_4x4_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_5x4_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_5x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_6x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_6x6_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_8x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_8x6_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_8x8_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_10x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_10x6_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_10x8_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_10x10_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_12x10_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_12x12_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_3x3x3] = NULL,
  [PIPE_FORMAT_ASTC_4x3x3] = NULL,
  [PIPE_FORMAT_ASTC_4x4x3] = NULL,
  [PIPE_FORMAT_ASTC_4x4x4] = NULL,
  [PIPE_FORMAT_ASTC_5x4x4] = NULL,
  [PIPE_FORMAT_ASTC_5x5x4] = NULL,
  [PIPE_FORMAT_ASTC_5x5x5] = NULL,
  [PIPE_FORMAT_ASTC_6x5x5] = NULL,
  [PIPE_FORMAT_ASTC_6x6x5] = NULL,
  [PIPE_FORMAT_ASTC_6x6x6] = NULL,
  [PIPE_FORMAT_ASTC_3x3x3_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_4x3x3_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_4x4x3_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_4x4x4_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_5x4x4_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_5x5x4_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_5x5x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_6x5x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_6x6x5_SRGB] = NULL,
  [PIPE_FORMAT_ASTC_6x6x6_SRGB] = NULL,
  [PIPE_FORMAT_ATC_RGB] = NULL,
  [PIPE_FORMAT_ATC_RGBA_EXPLICIT] = NULL,
  [PIPE_FORMAT_ATC_RGBA_INTERPOLATED] = NULL,
  [PIPE_FORMAT_R64_FLOAT] = &util_format_r64_float_fetch_rgba,
  [PIPE_FORMAT_R64G64_FLOAT] = &util_format_r64g64_float_fetch_rgba,
  [PIPE_FORMAT_R64G64B64_FLOAT] = &util_format_r64g64b64_float_fetch_rgba,
  [PIPE_FORMAT_R64G64B64A64_FLOAT] = &util_format_r64g64b64a64_float_fetch_rgba,
  [PIPE_FORMAT_R32_FLOAT] = &util_format_r32_float_fetch_rgba,
  [PIPE_FORMAT_R32G32_FLOAT] = &util_format_r32g32_float_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_FLOAT] = &util_format_r32g32b32_float_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_FLOAT] = &util_format_r32g32b32a32_float_fetch_rgba,
  [PIPE_FORMAT_R32_UNORM] = &util_format_r32_unorm_fetch_rgba,
  [PIPE_FORMAT_R32G32_UNORM] = &util_format_r32g32_unorm_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_UNORM] = &util_format_r32g32b32_unorm_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_UNORM] = &util_format_r32g32b32a32_unorm_fetch_rgba,
  [PIPE_FORMAT_R32_USCALED] = &util_format_r32_uscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32_USCALED] = &util_format_r32g32_uscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_USCALED] = &util_format_r32g32b32_uscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_USCALED] = &util_format_r32g32b32a32_uscaled_fetch_rgba,
  [PIPE_FORMAT_R32_SNORM] = &util_format_r32_snorm_fetch_rgba,
  [PIPE_FORMAT_R32G32_SNORM] = &util_format_r32g32_snorm_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_SNORM] = &util_format_r32g32b32_snorm_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_SNORM] = &util_format_r32g32b32a32_snorm_fetch_rgba,
  [PIPE_FORMAT_R32_SSCALED] = &util_format_r32_sscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32_SSCALED] = &util_format_r32g32_sscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_SSCALED] = &util_format_r32g32b32_sscaled_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_SSCALED] = &util_format_r32g32b32a32_sscaled_fetch_rgba,
  [PIPE_FORMAT_R16_FLOAT] = &util_format_r16_float_fetch_rgba,
  [PIPE_FORMAT_R16G16_FLOAT] = &util_format_r16g16_float_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_FLOAT] = &util_format_r16g16b16_float_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_FLOAT] = &util_format_r16g16b16a16_float_fetch_rgba,
  [PIPE_FORMAT_R16_UNORM] = &util_format_r16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16G16_UNORM] = &util_format_r16g16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_UNORM] = &util_format_r16g16b16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_UNORM] = &util_format_r16g16b16a16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16_USCALED] = &util_format_r16_uscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16_USCALED] = &util_format_r16g16_uscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_USCALED] = &util_format_r16g16b16_uscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_USCALED] = &util_format_r16g16b16a16_uscaled_fetch_rgba,
  [PIPE_FORMAT_R16_SNORM] = &util_format_r16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16G16_SNORM] = &util_format_r16g16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_SNORM] = &util_format_r16g16b16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_SNORM] = &util_format_r16g16b16a16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16_SSCALED] = &util_format_r16_sscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16_SSCALED] = &util_format_r16g16_sscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_SSCALED] = &util_format_r16g16b16_sscaled_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_SSCALED] = &util_format_r16g16b16a16_sscaled_fetch_rgba,
  [PIPE_FORMAT_R8_UNORM] = &util_format_r8_unorm_fetch_rgba,
  [PIPE_FORMAT_R8G8_UNORM] = &util_format_r8g8_unorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_UNORM] = &util_format_r8g8b8_unorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_UNORM] = &util_format_b8g8r8_unorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_UNORM] = &util_format_r8g8b8a8_unorm_fetch_rgba,
  [PIPE_FORMAT_R8_USCALED] = &util_format_r8_uscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8_USCALED] = &util_format_r8g8_uscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_USCALED] = &util_format_r8g8b8_uscaled_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_USCALED] = &util_format_b8g8r8_uscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_USCALED] = &util_format_r8g8b8a8_uscaled_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_USCALED] = &util_format_b8g8r8a8_uscaled_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_USCALED] = &util_format_a8b8g8r8_uscaled_fetch_rgba,
  [PIPE_FORMAT_R8_SNORM] = &util_format_r8_snorm_fetch_rgba,
  [PIPE_FORMAT_R8G8_SNORM] = &util_format_r8g8_snorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_SNORM] = &util_format_r8g8b8_snorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_SNORM] = &util_format_b8g8r8_snorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_SNORM] = &util_format_r8g8b8a8_snorm_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_SNORM] = &util_format_b8g8r8a8_snorm_fetch_rgba,
  [PIPE_FORMAT_R8_SSCALED] = &util_format_r8_sscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8_SSCALED] = &util_format_r8g8_sscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_SSCALED] = &util_format_r8g8b8_sscaled_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_SSCALED] = &util_format_b8g8r8_sscaled_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_SSCALED] = &util_format_r8g8b8a8_sscaled_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_SSCALED] = &util_format_b8g8r8a8_sscaled_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_SSCALED] = &util_format_a8b8g8r8_sscaled_fetch_rgba,
  [PIPE_FORMAT_R32_FIXED] = &util_format_r32_fixed_fetch_rgba,
  [PIPE_FORMAT_R32G32_FIXED] = &util_format_r32g32_fixed_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_FIXED] = &util_format_r32g32b32_fixed_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_FIXED] = &util_format_r32g32b32a32_fixed_fetch_rgba,
  [PIPE_FORMAT_R10G10B10X2_USCALED] = &util_format_r10g10b10x2_uscaled_fetch_rgba,
  [PIPE_FORMAT_R10G10B10X2_SNORM] = &util_format_r10g10b10x2_snorm_fetch_rgba,
  [PIPE_FORMAT_R10G10B10X2_SINT] = &util_format_r10g10b10x2_sint_fetch_rgba,
  [PIPE_FORMAT_YV12] = NULL,
  [PIPE_FORMAT_YV16] = NULL,
  [PIPE_FORMAT_IYUV] = NULL,
  [PIPE_FORMAT_NV12] = NULL,
  [PIPE_FORMAT_NV21] = NULL,
  [PIPE_FORMAT_R8_G8B8_420_UNORM] = NULL,
  [PIPE_FORMAT_G8_B8R8_420_UNORM] = NULL,
  [PIPE_FORMAT_G8_B8_R8_420_UNORM] = NULL,
  [PIPE_FORMAT_Y8_UNORM] = NULL,
  [PIPE_FORMAT_Y8_U8_V8_422_UNORM] = NULL,
  [PIPE_FORMAT_Y8_U8V8_422_UNORM] = NULL,
  [PIPE_FORMAT_Y8_U8_V8_444_UNORM] = NULL,
  [PIPE_FORMAT_Y16_U16_V16_420_UNORM] = NULL,
  [PIPE_FORMAT_Y16_U16_V16_422_UNORM] = NULL,
  [PIPE_FORMAT_Y16_U16V16_422_UNORM] = NULL,
  [PIPE_FORMAT_Y16_U16_V16_444_UNORM] = NULL,
  [PIPE_FORMAT_P010] = NULL,
  [PIPE_FORMAT_P012] = NULL,
  [PIPE_FORMAT_P016] = NULL,
  [PIPE_FORMAT_Y210] = NULL,
  [PIPE_FORMAT_Y212] = NULL,
  [PIPE_FORMAT_Y216] = NULL,
  [PIPE_FORMAT_Y410] = NULL,
  [PIPE_FORMAT_Y412] = NULL,
  [PIPE_FORMAT_Y416] = NULL,
  [PIPE_FORMAT_A4R4_UNORM] = &util_format_a4r4_unorm_fetch_rgba,
  [PIPE_FORMAT_R4A4_UNORM] = &util_format_r4a4_unorm_fetch_rgba,
  [PIPE_FORMAT_R8A8_UNORM] = &util_format_r8a8_unorm_fetch_rgba,
  [PIPE_FORMAT_A8R8_UNORM] = &util_format_a8r8_unorm_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_USCALED] = &util_format_r10g10b10a2_uscaled_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_SSCALED] = &util_format_r10g10b10a2_sscaled_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_SNORM] = &util_format_r10g10b10a2_snorm_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_USCALED] = &util_format_b10g10r10a2_uscaled_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_SSCALED] = &util_format_b10g10r10a2_sscaled_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_SNORM] = &util_format_b10g10r10a2_snorm_fetch_rgba,
  [PIPE_FORMAT_R8_UINT] = &util_format_r8_uint_fetch_rgba,
  [PIPE_FORMAT_R8G8_UINT] = &util_format_r8g8_uint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_UINT] = &util_format_r8g8b8_uint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_UINT] = &util_format_r8g8b8a8_uint_fetch_rgba,
  [PIPE_FORMAT_R8_SINT] = &util_format_r8_sint_fetch_rgba,
  [PIPE_FORMAT_R8G8_SINT] = &util_format_r8g8_sint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8_SINT] = &util_format_r8g8b8_sint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8A8_SINT] = &util_format_r8g8b8a8_sint_fetch_rgba,
  [PIPE_FORMAT_R16_UINT] = &util_format_r16_uint_fetch_rgba,
  [PIPE_FORMAT_R16G16_UINT] = &util_format_r16g16_uint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_UINT] = &util_format_r16g16b16_uint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_UINT] = &util_format_r16g16b16a16_uint_fetch_rgba,
  [PIPE_FORMAT_R16_SINT] = &util_format_r16_sint_fetch_rgba,
  [PIPE_FORMAT_R16G16_SINT] = &util_format_r16g16_sint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16_SINT] = &util_format_r16g16b16_sint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16A16_SINT] = &util_format_r16g16b16a16_sint_fetch_rgba,
  [PIPE_FORMAT_R32_UINT] = &util_format_r32_uint_fetch_rgba,
  [PIPE_FORMAT_R32G32_UINT] = &util_format_r32g32_uint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_UINT] = &util_format_r32g32b32_uint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_UINT] = &util_format_r32g32b32a32_uint_fetch_rgba,
  [PIPE_FORMAT_R32_SINT] = &util_format_r32_sint_fetch_rgba,
  [PIPE_FORMAT_R32G32_SINT] = &util_format_r32g32_sint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32_SINT] = &util_format_r32g32b32_sint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32A32_SINT] = &util_format_r32g32b32a32_sint_fetch_rgba,
  [PIPE_FORMAT_R64_UINT] = &util_format_r64_uint_fetch_rgba,
  [PIPE_FORMAT_R64G64_UINT] = &util_format_r64g64_uint_fetch_rgba,
  [PIPE_FORMAT_R64G64B64_UINT] = &util_format_r64g64b64_uint_fetch_rgba,
  [PIPE_FORMAT_R64G64B64A64_UINT] = &util_format_r64g64b64a64_uint_fetch_rgba,
  [PIPE_FORMAT_R64_SINT] = &util_format_r64_sint_fetch_rgba,
  [PIPE_FORMAT_A8_UINT] = &util_format_a8_uint_fetch_rgba,
  [PIPE_FORMAT_I8_UINT] = &util_format_i8_uint_fetch_rgba,
  [PIPE_FORMAT_L8_UINT] = &util_format_l8_uint_fetch_rgba,
  [PIPE_FORMAT_L8A8_UINT] = &util_format_l8a8_uint_fetch_rgba,
  [PIPE_FORMAT_A8_SINT] = &util_format_a8_sint_fetch_rgba,
  [PIPE_FORMAT_I8_SINT] = &util_format_i8_sint_fetch_rgba,
  [PIPE_FORMAT_L8_SINT] = &util_format_l8_sint_fetch_rgba,
  [PIPE_FORMAT_L8A8_SINT] = &util_format_l8a8_sint_fetch_rgba,
  [PIPE_FORMAT_A16_UINT] = &util_format_a16_uint_fetch_rgba,
  [PIPE_FORMAT_I16_UINT] = &util_format_i16_uint_fetch_rgba,
  [PIPE_FORMAT_L16_UINT] = &util_format_l16_uint_fetch_rgba,
  [PIPE_FORMAT_L16A16_UINT] = &util_format_l16a16_uint_fetch_rgba,
  [PIPE_FORMAT_A16_SINT] = &util_format_a16_sint_fetch_rgba,
  [PIPE_FORMAT_I16_SINT] = &util_format_i16_sint_fetch_rgba,
  [PIPE_FORMAT_L16_SINT] = &util_format_l16_sint_fetch_rgba,
  [PIPE_FORMAT_L16A16_SINT] = &util_format_l16a16_sint_fetch_rgba,
  [PIPE_FORMAT_A32_UINT] = &util_format_a32_uint_fetch_rgba,
  [PIPE_FORMAT_I32_UINT] = &util_format_i32_uint_fetch_rgba,
  [PIPE_FORMAT_L32_UINT] = &util_format_l32_uint_fetch_rgba,
  [PIPE_FORMAT_L32A32_UINT] = &util_format_l32a32_uint_fetch_rgba,
  [PIPE_FORMAT_A32_SINT] = &util_format_a32_sint_fetch_rgba,
  [PIPE_FORMAT_I32_SINT] = &util_format_i32_sint_fetch_rgba,
  [PIPE_FORMAT_L32_SINT] = &util_format_l32_sint_fetch_rgba,
  [PIPE_FORMAT_L32A32_SINT] = &util_format_l32a32_sint_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_UINT] = &util_format_b8g8r8_uint_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_UINT] = &util_format_b8g8r8a8_uint_fetch_rgba,
  [PIPE_FORMAT_B8G8R8_SINT] = &util_format_b8g8r8_sint_fetch_rgba,
  [PIPE_FORMAT_B8G8R8A8_SINT] = &util_format_b8g8r8a8_sint_fetch_rgba,
  [PIPE_FORMAT_A8R8G8B8_UINT] = &util_format_a8r8g8b8_uint_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_UINT] = &util_format_a8b8g8r8_uint_fetch_rgba,
  [PIPE_FORMAT_A2R10G10B10_UINT] = &util_format_a2r10g10b10_uint_fetch_rgba,
  [PIPE_FORMAT_A2B10G10R10_UINT] = &util_format_a2b10g10r10_uint_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_UINT] = &util_format_b10g10r10a2_uint_fetch_rgba,
  [PIPE_FORMAT_B10G10R10A2_SINT] = &util_format_b10g10r10a2_sint_fetch_rgba,
  [PIPE_FORMAT_R5G6B5_UINT] = &util_format_r5g6b5_uint_fetch_rgba,
  [PIPE_FORMAT_B5G6R5_UINT] = &util_format_b5g6r5_uint_fetch_rgba,
  [PIPE_FORMAT_R3G3B2_UINT] = &util_format_r3g3b2_uint_fetch_rgba,
  [PIPE_FORMAT_B2G3R3_UINT] = &util_format_b2g3r3_uint_fetch_rgba,
  [PIPE_FORMAT_R4G4B4A4_UINT] = &util_format_r4g4b4a4_uint_fetch_rgba,
  [PIPE_FORMAT_B4G4R4A4_UINT] = &util_format_b4g4r4a4_uint_fetch_rgba,
  [PIPE_FORMAT_A4R4G4B4_UINT] = &util_format_a4r4g4b4_uint_fetch_rgba,
  [PIPE_FORMAT_A4B4G4R4_UINT] = &util_format_a4b4g4r4_uint_fetch_rgba,
  [PIPE_FORMAT_A1R5G5B5_UINT] = &util_format_a1r5g5b5_uint_fetch_rgba,
  [PIPE_FORMAT_A1B5G5R5_UINT] = &util_format_a1b5g5r5_uint_fetch_rgba,
  [PIPE_FORMAT_R5G5B5A1_UINT] = &util_format_r5g5b5a1_uint_fetch_rgba,
  [PIPE_FORMAT_B5G5R5A1_UINT] = &util_format_b5g5r5a1_uint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8X8_SNORM] = &util_format_r8g8b8x8_snorm_fetch_rgba,
  [PIPE_FORMAT_R8G8B8X8_SRGB] = &util_format_r8g8b8x8_srgb_fetch_rgba,
  [PIPE_FORMAT_R8G8B8X8_UINT] = &util_format_r8g8b8x8_uint_fetch_rgba,
  [PIPE_FORMAT_R8G8B8X8_SINT] = &util_format_r8g8b8x8_sint_fetch_rgba,
  [PIPE_FORMAT_B10G10R10X2_UNORM] = &util_format_b10g10r10x2_unorm_fetch_rgba,
  [PIPE_FORMAT_B10G10R10X2_SNORM] = &util_format_b10g10r10x2_snorm_fetch_rgba,
  [PIPE_FORMAT_B10G10R10X2_SINT] = &util_format_b10g10r10x2_sint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16X16_UNORM] = &util_format_r16g16b16x16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16X16_SNORM] = &util_format_r16g16b16x16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16G16B16X16_FLOAT] = &util_format_r16g16b16x16_float_fetch_rgba,
  [PIPE_FORMAT_R16G16B16X16_UINT] = &util_format_r16g16b16x16_uint_fetch_rgba,
  [PIPE_FORMAT_R16G16B16X16_SINT] = &util_format_r16g16b16x16_sint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32X32_FLOAT] = &util_format_r32g32b32x32_float_fetch_rgba,
  [PIPE_FORMAT_R32G32B32X32_UINT] = &util_format_r32g32b32x32_uint_fetch_rgba,
  [PIPE_FORMAT_R32G32B32X32_SINT] = &util_format_r32g32b32x32_sint_fetch_rgba,
  [PIPE_FORMAT_R8A8_SNORM] = &util_format_r8a8_snorm_fetch_rgba,
  [PIPE_FORMAT_R16A16_UNORM] = &util_format_r16a16_unorm_fetch_rgba,
  [PIPE_FORMAT_R16A16_SNORM] = &util_format_r16a16_snorm_fetch_rgba,
  [PIPE_FORMAT_R16A16_FLOAT] = &util_format_r16a16_float_fetch_rgba,
  [PIPE_FORMAT_R32A32_FLOAT] = &util_format_r32a32_float_fetch_rgba,
  [PIPE_FORMAT_R8A8_UINT] = &util_format_r8a8_uint_fetch_rgba,
  [PIPE_FORMAT_R8A8_SINT] = &util_format_r8a8_sint_fetch_rgba,
  [PIPE_FORMAT_R16A16_UINT] = &util_format_r16a16_uint_fetch_rgba,
  [PIPE_FORMAT_R16A16_SINT] = &util_format_r16a16_sint_fetch_rgba,
  [PIPE_FORMAT_R32A32_UINT] = &util_format_r32a32_uint_fetch_rgba,
  [PIPE_FORMAT_R32A32_SINT] = &util_format_r32a32_sint_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_UINT] = &util_format_r10g10b10a2_uint_fetch_rgba,
  [PIPE_FORMAT_R10G10B10A2_SINT] = &util_format_r10g10b10a2_sint_fetch_rgba,
  [PIPE_FORMAT_B5G6R5_SRGB] = &util_format_b5g6r5_srgb_fetch_rgba,
  [PIPE_FORMAT_R5G6B5_SRGB] = &util_format_r5g6b5_srgb_fetch_rgba,
  [PIPE_FORMAT_G8R8_UNORM] = &util_format_g8r8_unorm_fetch_rgba,
  [PIPE_FORMAT_G8R8_SNORM] = &util_format_g8r8_snorm_fetch_rgba,
  [PIPE_FORMAT_G8R8_SINT] = &util_format_g8r8_sint_fetch_rgba,
  [PIPE_FORMAT_G16R16_UNORM] = &util_format_g16r16_unorm_fetch_rgba,
  [PIPE_FORMAT_G16R16_SNORM] = &util_format_g16r16_snorm_fetch_rgba,
  [PIPE_FORMAT_G16R16_SINT] = &util_format_g16r16_sint_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_SNORM] = &util_format_a8b8g8r8_snorm_fetch_rgba,
  [PIPE_FORMAT_A8B8G8R8_SINT] = &util_format_a8b8g8r8_sint_fetch_rgba,
  [PIPE_FORMAT_X8B8G8R8_SNORM] = &util_format_x8b8g8r8_snorm_fetch_rgba,
  [PIPE_FORMAT_X8B8G8R8_SINT] = &util_format_x8b8g8r8_sint_fetch_rgba,
};

util_format_fetch_rgba_func_ptr
util_format_fetch_rgba_func(enum pipe_format format)
{
   assert(format < PIPE_FORMAT_COUNT);
   return util_format_fetch_rgba_table[format];
}

