<div dir="ltr"><div>Dylan,<br>Thanks for reviewing.  I've got a new version coming that is much better documented and incorporates all of your comments.  It even has docstrings!<br></div>--Jason<br><div><div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Mon, Jul 21, 2014 at 11:26 AM, Dylan Baker <span dir="ltr"><<a href="mailto:baker.dylan.c@gmail.com" target="_blank">baker.dylan.c@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="">On Thursday, July 17, 2014 11:04:24 AM Jason Ekstrand wrote:<br>
> Instead of a having all of the format metadata in a gigantic hard-to-edit<br>
> array of type struct format_info, we now use a human-readable CSV file.<br>
> The CSV file also contains more format information than the format_info<br>
> struct contained so we can potentially make format_info more detailed later.<br>
><br>
> The idea (and some of the implementation) for this was taken from the<br>
> gallium driver.  However, due to differences in the way the two systems<br>
> handle formats, they are NOT the same; watch out for differences.<br>
><br>
> Signed-off-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br>
<br>
</div>I have some formatting/style/cleanup comments for your python. I also have a<br>
general suggestion, that you might want to use division from the __future__<br>
module. This fixes division to behave like the more sensible python3 default:<br>
// is floor division always, and / is true division always.<br>
<div><div class="h5"><br>
> ---<br>
>  src/mesa/Makefile.am           |   10 +<br>
>  src/mesa/main/.gitignore       |    1 +<br>
>  src/mesa/main/format_info.py   |  181 +++++<br>
>  src/mesa/main/format_parser.py |  406 ++++++++++<br>
>  src/mesa/main/formats.c        | 1739<br>
> +--------------------------------------- 5 files changed, 599<br>
> insertions(+), 1738 deletions(-)<br>
>  create mode 100644 src/mesa/main/format_info.py<br>
>  create mode 100755 src/mesa/main/format_parser.py<br>
><br>
> diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am<br>
> index 88eeff9..57c1e4a 100644<br>
> --- a/src/mesa/Makefile.am<br>
> +++ b/src/mesa/Makefile.am<br>
> @@ -64,6 +64,7 @@ include Makefile.sources<br>
><br>
>  BUILT_SOURCES = \<br>
>       main/get_hash.h \<br>
> +        main/format_info.c \<br>
>       $(BUILDDIR)main/git_sha1.h \<br>
>       $(BUILDDIR)program/program_parse.tab.c \<br>
>       $(BUILDDIR)program/lex.yy.c<br>
> @@ -81,6 +82,15 @@ main/get_hash.h: $(GLAPI)/gl_and_es_API.xml<br>
> main/get_hash_params.py       \ -f $< > $@.tmp;                                               \<br>
>       mv $@.tmp $@;<br>
><br>
> +main/format_info.c: main/formats.csv                                    \<br>
> +                    main/format_parser.py main/format_info.py<br>
> +     $(AM_V_GEN)set -e;                                              \<br>
> +     $(PYTHON2) $(PYTHON_FLAGS) $(srcdir)/main/format_info.py        \<br>
> +                   $< > $@.tmp;                                         \<br>
> +     mv $@.tmp $@;<br>
> +<br>
> +main/formats.c: main/format_info.c<br>
> +<br>
>  noinst_LTLIBRARIES = $(ARCH_LIBS)<br>
>  if NEED_LIBMESA<br>
>  noinst_LTLIBRARIES += <a href="http://libmesa.la" target="_blank">libmesa.la</a><br>
> diff --git a/src/mesa/main/.gitignore b/src/mesa/main/.gitignore<br>
> index 837f490..fec0629 100644<br>
> --- a/src/mesa/main/.gitignore<br>
> +++ b/src/mesa/main/.gitignore<br>
> @@ -8,3 +8,4 @@ git_sha1.h.tmp<br>
>  remap_helper.h<br>
>  get_hash.h<br>
>  get_hash.h.tmp<br>
> +format_info.c<br>
> diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py<br>
> new file mode 100644<br>
> index 0000000..9b63bfb<br>
> --- /dev/null<br>
> +++ b/src/mesa/main/format_info.py<br>
> @@ -0,0 +1,181 @@<br>
> +#!/usr/bin/env python<br>
> +#<br>
> +# Copyright 2014 Intel Corporation<br>
> +#<br>
> +# Permission is hereby granted, free of charge, to any person obtaining a<br>
> +# copy of this software and associated documentation files (the<br>
> +# "Software"), to deal in the Software without restriction, including<br>
> +# without limitation the rights to use, copy, modify, merge, publish,<br>
> +# distribute, sub license, and/or sell copies of the Software, and to<br>
> +# permit persons to whom the Software is furnished to do so, subject to<br>
> +# the following conditions:<br>
> +#<br>
> +# The above copyright notice and this permission notice (including the<br>
> +# next paragraph) shall be included in all copies or substantial portions<br>
> +# of the Software.<br>
> +#<br>
> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS<br>
> +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
> +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.<br>
> +# IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR<br>
> +# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,<br>
> +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE<br>
> +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
> +<br>
> +import format_parser as parser<br>
> +import sys<br>
> +<br>
> +def get_gl_base_format(fmat):<br>
> +   if <a href="http://fmat.name" target="_blank">fmat.name</a> == 'MESA_FORMAT_NONE':<br>
> +      return 'GL_NONE'<br>
> +   elif <a href="http://fmat.name" target="_blank">fmat.name</a> in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']:<br>
> +      return 'GL_YCBCR_MESA'<br>
> +   elif fmat.has_channel('r'):<br>
> +      if fmat.has_channel('g'):<br>
> +         if fmat.has_channel('b'):<br>
> +            if fmat.has_channel('a'):<br>
> +               return 'GL_RGBA'<br>
> +            else:<br>
> +               return 'GL_RGB'<br>
> +         else:<br>
> +            return 'GL_RG'<br>
> +      else:<br>
> +         return 'GL_RED'<br>
> +   elif fmat.has_channel('l'):<br>
> +      if fmat.has_channel('a'):<br>
> +         return 'GL_LUMINANCE_ALPHA'<br>
> +      else:<br>
> +         return 'GL_LUMINANCE'<br>
> +   elif fmat.has_channel('a') and fmat.num_channels() == 1:<br>
> +      return 'GL_ALPHA'<br>
> +   elif fmat.has_channel('z'):<br>
> +      if fmat.has_channel('s'):<br>
> +         return 'GL_DEPTH_STENCIL'<br>
> +      else:<br>
> +         return 'GL_DEPTH_COMPONENT'<br>
> +   elif fmat.has_channel('s'):<br>
> +      return 'GL_STENCIL_INDEX'<br>
> +   elif fmat.has_channel('i') and fmat.num_channels() == 1:<br>
> +      return 'GL_INTENSITY'<br>
> +   else:<br>
> +      assert False<br>
> +<br>
> +def get_gl_data_type(fmat):<br>
> +   if fmat.is_compressed():<br>
> +      if 'SIGNED' in <a href="http://fmat.name" target="_blank">fmat.name</a> or 'SNORM' in <a href="http://fmat.name" target="_blank">fmat.name</a>:<br>
> +         return 'GL_SIGNED_NORMALIZED'<br>
> +      else:<br>
> +         return 'GL_UNSIGNED_NORMALIZED'<br>
> +   elif <a href="http://fmat.name" target="_blank">fmat.name</a> in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']:<br>
> +      return 'GL_UNSIGNED_NORMALIZED'<br>
> +<br>
> +   channel = None<br>
> +   for chan in fmat.channels:<br>
> +      if chan.type == 'x' and len(fmat.channels) > 1:<br>
> +         continue # We can do better<br>
> +      elif <a href="http://chan.name" target="_blank">chan.name</a> == 's' and fmat.has_channel('z'):<br>
> +         continue # We'll use the type from the depth instead<br>
> +<br>
> +      channel = chan<br>
> +      break;<br>
> +<br>
> +   if channel.type == parser.UNSIGNED:<br>
> +      if channel.norm:<br>
> +         return 'GL_UNSIGNED_NORMALIZED'<br>
> +      else:<br>
> +         return 'GL_UNSIGNED_INT'<br>
> +   elif channel.type == parser.SIGNED:<br>
> +      if channel.norm:<br>
> +         return 'GL_SIGNED_NORMALIZED'<br>
> +      else:<br>
> +         return 'GL_INT'<br>
> +   elif channel.type == parser.FLOAT:<br>
> +      return 'GL_FLOAT'<br>
> +   elif channel.type == parser.VOID:<br>
> +      return 'GL_NONE'<br>
> +   else:<br>
> +      assert False<br>
> +<br>
> +def get_channel_bits(fmat, chan_name):<br>
> +   if fmat.is_compressed():<br>
> +      # These values are pretty-much bogus, but OpenGL requires that we<br>
> +      # return an "approximate" number of bits.<br>
> +      if fmat.layout == 's3tc':<br>
> +         return 4 if fmat.has_channel(chan_name) else 0<br>
> +      elif fmat.layout == 'fxt1':<br>
> +         if chan_name in 'rgb':<br>
> +            return 4<br>
> +         elif chan_name == 'a':<br>
> +            return 1 if fmat.has_channel('a') else 0<br>
> +         else:<br>
> +            return 0<br>
> +      elif fmat.layout == 'rgtc':<br>
> +         return 8 if fmat.has_channel(chan_name) else 0<br>
> +      elif fmat.layout in ('etc1', 'etc2'):<br>
> +         if fmat.name.endswith('_ALPHA1') and chan_name == 'a':<br>
> +            return 1<br>
> +<br>
> +         bits = 11 if fmat.name.endswith('11_EAC') else 8<br>
> +         return bits if fmat.has_channel(chan_name) else 0<br>
> +      else:<br>
> +         assert False<br>
> +   else:<br>
> +      # Uncompressed textures<br>
> +      for chan in fmat.channels:<br>
> +         if <a href="http://chan.name" target="_blank">chan.name</a> == chan_name:<br>
> +            return chan.size<br>
> +      return 0<br>
> +<br>
> +formats = parser.parse(sys.argv[1])<br>
> +<br>
> +print '''<br>
> +/*<br>
> + * Mesa 3-D graphics library<br>
> + *<br>
> + * Copyright (c) 2014 Intel Corporation<br>
> + *<br>
> + * Permission is hereby granted, free of charge, to any person obtaining a<br>
> + * copy of this software and associated documentation files (the<br>
> "Software"), + * to deal in the Software without restriction, including<br>
> without limitation + * the rights to use, copy, modify, merge, publish,<br>
> distribute, sublicense, + * and/or sell copies of the Software, and to<br>
> permit persons to whom the + * Software is furnished to do so, subject to<br>
> the following conditions: + *<br>
> + * The above copyright notice and this permission notice shall be included<br>
> + * in all copies or substantial portions of the Software.<br>
> + *<br>
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS<br>
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
> MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.<br>
> IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY<br>
> CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,<br>
> TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE<br>
> SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE.<br>
> + */<br>
> +<br>
> + /*<br>
> +  * This file is AUTOGENERATED by format_info.py.  Do not edit it<br>
> +  * manually or commit it into version control.<br>
> +  */<br>
> +<br>
> +static struct gl_format_info format_info[MESA_FORMAT_COUNT] =<br>
> +{<br>
> +'''<br>
> +<br>
> +for fmat in formats:<br>
> +   print '   {'<br>
> +   print '      {0},'.format(<a href="http://fmat.name" target="_blank">fmat.name</a>)<br>
> +   print '      "{0}",'.format(<a href="http://fmat.name" target="_blank">fmat.name</a>)<br>
> +   print '      {0},'.format(get_gl_base_format(fmat))<br>
> +   print '      {0},'.format(get_gl_data_type(fmat))<br>
> +<br>
> +   bits = [ get_channel_bits(fmat, name) for name in ['r', 'g', 'b', 'a']]<br>
> +   print '      {0},'.format(', '.join(map(str, bits)))<br>
> +   bits = [ get_channel_bits(fmat, name) for name in ['l', 'i', 'I', 'z',<br>
> 's']] +   print '      {0},'.format(', '.join(map(str, bits)))<br>
> +<br>
> +   print '      {0}, {1}, {2},'.format(fmat.block_width, fmat.block_height,<br>
> +                                       int(fmat.block_size() / 8)) +<br>
> print '   },'<br>
> +<br>
> +print '};'<br>
> diff --git a/src/mesa/main/format_parser.py b/src/mesa/main/format_parser.py<br>
> new file mode 100755<br>
> index 0000000..2791c6c<br>
> --- /dev/null<br>
> +++ b/src/mesa/main/format_parser.py<br>
> @@ -0,0 +1,406 @@<br>
> +#!/usr/bin/env python<br>
> +#<br>
> +# Copyright 2009 VMware, Inc.<br>
> +# Copyright 2014 Intel Corporation<br>
> +# All Rights Reserved.<br>
> +#<br>
> +# Permission is hereby granted, free of charge, to any person obtaining a<br>
> +# copy of this software and associated documentation files (the<br>
> +# "Software"), to deal in the Software without restriction, including<br>
> +# without limitation the rights to use, copy, modify, merge, publish,<br>
> +# distribute, sub license, and/or sell copies of the Software, and to<br>
> +# permit persons to whom the Software is furnished to do so, subject to<br>
> +# the following conditions:<br>
> +#<br>
> +# The above copyright notice and this permission notice (including the<br>
> +# next paragraph) shall be included in all copies or substantial portions<br>
> +# of the Software.<br>
> +#<br>
> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS<br>
> +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF<br>
> +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.<br>
> +# IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR<br>
> +# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,<br>
> +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE<br>
> +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
> +<br>
> +VOID = 'x'<br>
> +UNSIGNED = 'u'<br>
> +SIGNED = 's'<br>
> +FLOAT = 'f'<br>
> +<br>
> +ARRAY = 'array'<br>
> +PACKED = 'packed'<br>
> +OTHER = 'other'<br>
> +<br>
> +RGB = 'rgb'<br>
> +SRGB = 'srgb'<br>
> +YUV = 'yuv'<br>
> +ZS = 'zs'<br>
> +<br>
> +def is_power_of_two(x):<br>
> +   return not bool(x & (x - 1))<br>
> +<br>
> +VERY_LARGE = 99999999999999999999999<br>
> +<br>
> +class Channel:<br>
<br>
</div></div>You should use a new-style class, class Channel(object), you should do this<br>
for your other classes as well<br>
<div><div class="h5"><br>
> +   '''Describe the channel of a color channel.'''<br>
> +<br>
> +   def __init__(self, type, norm, size):<br>
> +      self.type = type<br>
> +      self.norm = norm<br>
> +      self.size = size<br>
> +      self.sign = type in (SIGNED, FLOAT)<br>
> +      <a href="http://self.name" target="_blank">self.name</a> = None # Set when the channels are added to the format<br>
> +      self.shift = -1 # Set when the channels are added to the format<br>
> +      self.index = -1 # Set when the channels are added to the format<br>
> +<br>
> +   def __str__(self):<br>
> +      s = str(self.type)<br>
> +      if self.norm:<br>
> +         s += 'n'<br>
> +      s += str(self.size)<br>
> +      return s<br>
> +<br>
> +   def __eq__(self, other):<br>
> +      return self.type == other.type and self.norm == other.norm and<br>
> self.size == other.size +<br>
> +   def max(self):<br>
> +      '''Maximum representable number.'''<br>
> +      if self.type == FLOAT:<br>
> +         return VERY_LARGE<br>
> +      if self.norm:<br>
> +         return 1<br>
> +      if self.type == UNSIGNED:<br>
> +         return (1 << self.size) - 1<br>
> +      if self.type == SIGNED:<br>
> +         return (1 << (self.size - 1)) - 1<br>
> +      assert False<br>
> +<br>
> +   def min(self):<br>
> +      '''Minimum representable number.'''<br>
> +      if self.type == FLOAT:<br>
> +         return -VERY_LARGE<br>
> +      if self.type == UNSIGNED:<br>
> +         return 0<br>
> +      if self.norm:<br>
> +         return -1<br>
> +      if self.type == SIGNED:<br>
> +         return -(1 << (self.size - 1))<br>
> +      assert False<br>
> +<br>
> +   def one(self):<br>
> +      '''Representation of 1.0f.'''<br>
> +      if self.type == UNSIGNED:<br>
> +         return (1 << self.size) - 1<br>
> +      if self.type == SIGNED:<br>
> +         return (1 << (self.size - 1)) - 1<br>
> +      else:<br>
> +         return 1<br>
> +<br>
> +   def is_power_of_two(self):<br>
> +      return is_power_of_two(self.size)<br>
> +<br>
> +class Swizzle:<br>
> +   __identity_str = 'xyzw01_'<br>
> +<br>
> +   SWIZZLE_X = 0<br>
> +   SWIZZLE_Y = 1<br>
> +   SWIZZLE_Z = 2<br>
> +   SWIZZLE_W = 3<br>
> +   SWIZZLE_ZERO = 4<br>
> +   SWIZZLE_ONE = 5<br>
> +   SWIZZLE_NONE = 6<br>
> +<br>
> +   def __init__(self, swizzle):<br>
> +      if type(swizzle) is str:<br>
> +         swizzle = [Swizzle.__identity_str.index(c) for c in swizzle]<br>
> +      else:<br>
> +         for s in swizzle:<br>
> +            assert type(s) is int and 0 <= s and s <= Swizzle.SWIZZLE_NONE<br>
> +         swizzle = list(swizzle)<br>
> +<br>
> +      assert len(swizzle) <= 4<br>
> +<br>
> +      self.__list = swizzle + [Swizzle.SWIZZLE_NONE] * (4 - len(swizzle))<br>
> +<br>
> +   def __iter__(self):<br>
> +      return self.__list.__iter__()<br>
<br>
</div></div>Don't call magic methods directly (anything that starts and ends with __), you<br>
should use the iter() function<br>
        return iter(self.__list)<br>
<div class=""><br>
> +<br>
> +   def __str__(self):<br>
> +      return ''.join([Swizzle.__identity_str[i] for i in self.__list])[:4]<br>
<br>
</div>You could replace the list comprehension with a generator, (just drop the '['<br>
and ']'). You should probably also have a comment mentioning that you are<br>
intentionally do string slicing<br>
<div class=""><br>
> +<br>
> +   def __getitem__(self, idx):<br>
> +      if type(idx) is int:<br>
<br>
</div>this works and is correct, but generally isinstance() is used for this<br>
operation<br>
<div class=""><br>
> +         assert idx >= Swizzle.SWIZZLE_X and idx <= Swizzle.SWIZZLE_NONE<br>
> +         if idx <= Swizzle.SWIZZLE_W:<br>
> +            return self.__list.__getitem__(idx)<br>
> +         else:<br>
> +            return idx<br>
> +      elif type(idx) is str:<br>
> +         if idx in 'xyzw':<br>
> +            idx = 'xyzw'.find(idx)<br>
> +         elif idx in 'rgba':<br>
> +            idx = 'rgba'.find(idx)<br>
> +         elif idx in 'zs':<br>
> +            idx = 'zs'.find(idx)<br>
> +         else:<br>
> +            assert False<br>
> +         return self.__list.__getitem__(idx)<br>
> +      else:<br>
> +         assert False<br>
> +<br>
> +   def __mul__(self, other):<br>
> +      assert isinstance(other, Swizzle)<br>
> +      return Swizzle([self[other[i]] for i in range(4)])<br>
<br>
</div>This is generally not the way this is done in python. You should be able to do<br>
this with list slicing. Something like:<br>
return Swizzle(self[x] for x in other[:4])<br>
<div class=""><br>
> +<br>
> +   def inverse(self):<br>
> +      rev = [Swizzle.SWIZZLE_NONE] * 4<br>
> +      for i in range(4):<br>
> +         for j in range(4):<br>
<br>
</div>in python2 don't use range(), use xrange() instead. xrange() returns an<br>
iterator, while range() returns a list.<br>
<br>
You could also use itertools.product() to remove the nested loop if you<br>
wanted.<br>
<div><div class="h5"><br>
> +            if self.__list[j] == i and rev[i] == Swizzle.SWIZZLE_NONE:<br>
> +               rev[i] = j<br>
> +      return Swizzle(rev)<br>
> +<br>
> +<br>
> +class Format:<br>
> +   '''Describe a pixel format.'''<br>
> +<br>
> +   def __init__(self, name, layout, block_width, block_height, channels,<br>
> swizzle, colorspace): +      <a href="http://self.name" target="_blank">self.name</a> = name<br>
> +      self.layout = layout<br>
> +      self.block_width = block_width<br>
> +      self.block_height = block_height<br>
> +      self.channels = channels<br>
> +      assert isinstance(swizzle, Swizzle)<br>
> +      self.swizzle = swizzle<br>
> +      <a href="http://self.name" target="_blank">self.name</a> = name<br>
> +      self.colorspace = colorspace<br>
> +<br>
> +      # Name the channels<br>
> +      chan_names = ['']*4<br>
> +      if self.colorspace in (RGB, SRGB):<br>
> +         for (i, s) in enumerate(swizzle):<br>
> +            if s < 4:<br>
> +               chan_names[s] += 'rgba'[i]<br>
> +      elif colorspace == ZS:<br>
> +         for (i, s) in enumerate(swizzle):<br>
> +            if s < 4:<br>
> +               chan_names[s] += 'zs'[i]<br>
> +      else:<br>
> +         chan_names = ['x', 'y', 'z', 'w']<br>
> +<br>
> +      for c, name in zip(self.channels, chan_names):<br>
> +         if name == 'rgb':<br>
> +            <a href="http://c.name" target="_blank">c.name</a> = 'l'<br>
> +         elif name == 'rgba':<br>
> +            <a href="http://c.name" target="_blank">c.name</a> = 'i'<br>
> +         elif name == '':<br>
> +            <a href="http://c.name" target="_blank">c.name</a> = 'x'<br>
> +         else:<br>
> +            <a href="http://c.name" target="_blank">c.name</a> = name<br>
> +<br>
> +      # Set indices and offsets<br>
> +      if self.layout == PACKED:<br>
> +         shift = 0<br>
> +         for channel in self.channels:<br>
> +            channel.shift = shift<br>
> +            shift += channel.size<br>
> +      for idx, channel in enumerate(self.channels):<br>
> +         channel.index = idx<br>
> +      else:<br>
> +         pass # Shift means nothing here<br>
> +<br>
> +   def __str__(self):<br>
> +      return <a href="http://self.name" target="_blank">self.name</a><br>
> +<br>
> +   def short_name(self):<br>
> +      '''Make up a short norm for a format, suitable to be used as suffix<br>
> in +      function names.'''<br>
> +<br>
> +      name = <a href="http://self.name" target="_blank">self.name</a><br>
> +      if name.startswith('MESA_FORMAT_'):<br>
> +         name = name[len('MESA_FORMAT_'):]<br>
> +      name = name.lower()<br>
> +      return name<br>
> +<br>
> +   def block_size(self):<br>
> +      size = 0<br>
> +      for channel in self.channels:<br>
> +         size += channel.size<br>
> +      return size<br>
> +<br>
> +   def num_channels(self):<br>
> +      nr_channels = 0<br>
> +      for channel in self.channels:<br>
> +         if channel.size:<br>
> +            nr_channels += 1<br>
> +      return nr_channels<br>
> +<br>
> +   def array_element(self):<br>
> +      if self.layout == ARRAY:<br>
> +         return self.channels[0]<br>
> +      elif self.layout == PACKED:<br>
> +         ref_channel = self.channels[0]<br>
> +         if ref_channel.type == VOID:<br>
> +            ref_channel = self.channels[1]<br>
> +         for channel in self.channels:<br>
> +            if channel.size == 0 or channel.type == VOID:<br>
> +               continue<br>
> +            if channel.size != ref_channel.size or channel.size % 8 != 0:<br>
> +               return None<br>
> +            if channel.type != ref_channel.type:<br>
> +               return None<br>
> +            if channel.norm != ref_channel.norm:<br>
> +               return None<br>
> +         return ref_channel<br>
> +      else:<br>
> +         return None<br>
> +<br>
> +   def is_array(self):<br>
> +      return self.array_element() != None<br>
> +<br>
> +   def is_compressed(self):<br>
> +      return self.block_width != 1 or self.block_height != 1<br>
> +<br>
> +   def is_int(self):<br>
> +      if self.layout not in (ARRAY, PACKED):<br>
> +         return False<br>
> +      for channel in self.channels:<br>
> +         if channel.type not in (VOID, UNSIGNED, SIGNED):<br>
> +            return False<br>
> +      return True<br>
> +<br>
> +   def is_float(self):<br>
> +      if self.layout not in (ARRAY, PACKED):<br>
> +         return False<br>
> +      for channel in self.channels:<br>
> +         if channel.type not in (VOID, FLOAT):<br>
> +            return False<br>
> +      return True<br>
> +<br>
> +   def channel_type(self):<br>
> +      _type = VOID<br>
> +      for c in self.channels:<br>
> +         if c.type == VOID:<br>
> +            continue<br>
> +         if _type == VOID:<br>
> +            _type = c.type<br>
> +         assert c.type == _type<br>
> +      return _type<br>
> +<br>
> +   def channel_size(self):<br>
> +      size = None<br>
> +      for c in self.channels:<br>
> +         if c.type == VOID:<br>
> +            continue<br>
> +         if size is None:<br>
> +            size = c.size<br>
> +         assert c.size == size<br>
> +      return size<br>
> +<br>
> +   def max_channel_size(self):<br>
> +      size = 0<br>
> +      for c in self.channels:<br>
> +         if c.type == VOID:<br>
> +            continue<br>
> +         size = max(size, c.size)<br>
> +      return size<br>
> +<br>
> +   def is_normalized(self):<br>
> +      norm = None<br>
> +      for c in self.channels:<br>
> +         if c.type == VOID:<br>
> +            continue<br>
> +         if norm is None:<br>
> +            norm = c.norm<br>
> +         assert c.norm == norm<br>
> +      return norm<br>
> +<br>
> +   def has_channel(self, name):<br>
> +      if self.is_compressed():<br>
> +         # No channel information, so we pull it from the swizzle<br>
> +         if str(self.swizzle) == 'xxxx':<br>
> +            return name == 'i'<br>
> +         elif str(self.swizzle)[0:3] in ('xxx', 'yyy'):<br>
> +            if name == 'l':<br>
> +               return True<br>
> +            elif name == 'a':<br>
> +               return self.swizzle['a'] <= Swizzle.SWIZZLE_W<br>
> +            else:<br>
> +               return False<br>
> +         elif name in 'rgba':<br>
> +            return self.swizzle[name] <= Swizzle.SWIZZLE_W<br>
> +         else:<br>
> +            return False<br>
> +      else:<br>
> +         for channel in self.channels:<br>
> +            if <a href="http://channel.name" target="_blank">channel.name</a> == name:<br>
> +               return True<br>
> +         return False<br>
> +<br>
> +   def get_channel(self, name):<br>
> +      for channel in self.channels:<br>
> +         if <a href="http://channel.name" target="_blank">channel.name</a> == name:<br>
> +            return channel<br>
> +      assert False<br>
> +<br>
> +   def has_depth(self):<br>
> +      return self.colorspace == ZS and self.has_channel(0)<br>
> +<br>
> +   def has_stencil(self):<br>
> +      return self.colorspace == ZS and self.has_channel(1)<br>
> +<br>
> +   def stride(self):<br>
> +      return self.block_size()/8<br>
> +<br>
> +def _parse_channels(fields, layout, colorspace, swizzle):<br>
> +   channels = []<br>
> +   for field in fields:<br>
> +      if not field:<br>
> +         continue;<br>
<br>
</div></div>remove the semicolon<br>
<div class=""><br>
> +<br>
> +      type = field[0] if field[0] else 'x'<br>
> +<br>
> +      if field[1] == 'n':<br>
> +         norm = True<br>
> +         size = int(field[2:])<br>
> +      else:<br>
> +         norm = False<br>
> +         size = int(field[1:])<br>
> +<br>
> +      channel = Channel(type, norm, size)<br>
> +      channels.append(channel)<br>
> +<br>
> +   return channels<br>
> +<br>
> +def parse(filename):<br>
> +   '''Parse the format descrition in CSV format in terms of the<br>
> +   Channel and Format classes above.'''<br>
> +<br>
> +   stream = open(filename)<br>
<br>
</div>you should use open() as a context manager, that way you don't need to<br>
remember to close the file (which you forgot). like so:<br>
with open(filename, 'r') as stream:<br>
<div class="">    for line in stream:<br>
<br>
> +   formats = []<br>
> +   for line in stream:<br>
> +      try:<br>
> +         comment = line.index('#')<br>
> +      except ValueError:<br>
> +         pass<br>
> +      else:<br>
> +         line = line[:comment]<br>
> +      line = line.strip()<br>
> +      if not line:<br>
> +         continue<br>
> +<br>
> +      fields = [field.strip() for field in line.split(',')]<br>
> +<br>
> +      name = fields[0]<br>
> +      layout = fields[1]<br>
> +      block_width, block_height = map(int, fields[2:4])<br>
<br>
</div>map() is deprecated (so is filter(), in case you where wondering), using a<br>
list comprehension or generator is the modern way to handle this.<br>
block_width, block_height = (int(x) for x in fields[2:4])<br>
<div class="HOEnZb"><div class="h5"><br>
> +      colorspace = fields[9]<br>
> +<br>
> +      swizzle = Swizzle(fields[8])<br>
> +      channels = _parse_channels(fields[4:8], layout, colorspace, swizzle)<br>
> +<br>
> +      format = Format(name, layout, block_width, block_height, channels,<br>
> swizzle, colorspace) +      formats.append(format)<br>
> +   return formats<br>
> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c<br>
> index 1f20a9a..e237064 100644<br>
> --- a/src/mesa/main/formats.c<br>
> +++ b/src/mesa/main/formats.c<br>
> @@ -70,1743 +70,7 @@ struct gl_format_info<br>
>     GLubyte BytesPerBlock;<br>
>  };<br>
><br>
> -<br>
> -/**<br>
> - * Info about each format.<br>
> - * These must be in the same order as the MESA_FORMAT_* enums so that<br>
> - * we can do lookups without searching.<br>
> - */<br>
> -static struct gl_format_info format_info[MESA_FORMAT_COUNT] =<br>
> -{<br>
> -   /* Packed unorm formats */<br>
> -   {<br>
> -      MESA_FORMAT_NONE,            /* Name */<br>
> -      "MESA_FORMAT_NONE",          /* StrName */<br>
> -      GL_NONE,                     /* BaseFormat */<br>
> -      GL_NONE,                     /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      0, 0, 0                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A8B8G8R8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_A8B8G8R8_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_X8B8G8R8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_X8B8G8R8_UNORM",/* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8A8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_R8G8B8A8_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8X8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_R8G8B8X8_UNORM",/* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B8G8R8A8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_B8G8R8A8_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B8G8R8X8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_B8G8R8X8_UNORM",/* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A8R8G8B8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_A8R8G8B8_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_X8R8G8B8_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_X8R8G8B8_UNORM",/* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L16A16_UNORM,    /* Name */<br>
> -      "MESA_FORMAT_L16A16_UNORM",  /* StrName */<br>
> -      GL_LUMINANCE_ALPHA,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */<br>
> -      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A16L16_UNORM,    /* Name */<br>
> -      "MESA_FORMAT_A16L16_UNORM",  /* StrName */<br>
> -      GL_LUMINANCE_ALPHA,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */<br>
> -      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B5G6R5_UNORM,    /* Name */<br>
> -      "MESA_FORMAT_B5G6R5_UNORM",  /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R5G6B5_UNORM,    /* Name */<br>
> -      "MESA_FORMAT_R5G6B5_UNORM",  /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B4G4R4A4_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_B4G4R4A4_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B4G4R4X4_UNORM,<br>
> -      "MESA_FORMAT_B4G4R4X4_UNORM",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A4R4G4B4_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_A4R4G4B4_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A1B5G5R5_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_A1B5G5R5_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B5G5R5A1_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_B5G5R5A1_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B5G5R5X1_UNORM,<br>
> -      "MESA_FORMAT_B5G5R5X1_UNORM",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      5, 5, 5, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A1R5G5B5_UNORM,  /* Name */<br>
> -      "MESA_FORMAT_A1R5G5B5_UNORM",/* StrName */<br>
> -      GL_RGBA,                     /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L8A8_UNORM,      /* Name */<br>
> -      "MESA_FORMAT_L8A8_UNORM",    /* StrName */<br>
> -      GL_LUMINANCE_ALPHA,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A8L8_UNORM,      /* Name */<br>
> -      "MESA_FORMAT_A8L8_UNORM",    /* StrName */<br>
> -      GL_LUMINANCE_ALPHA,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8_UNORM,<br>
> -      "MESA_FORMAT_R8G8_UNORM",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_G8R8_UNORM,<br>
> -      "MESA_FORMAT_G8R8_UNORM",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L4A4_UNORM,      /* Name */<br>
> -      "MESA_FORMAT_L4A4_UNORM",    /* StrName */<br>
> -      GL_LUMINANCE_ALPHA,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 4,                  /* Red/Green/Blue/AlphaBits */<br>
> -      4, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B2G3R3_UNORM,    /* Name */<br>
> -      "MESA_FORMAT_B2G3R3_UNORM",  /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      3, 3, 2, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R16G16_UNORM,<br>
> -      "MESA_FORMAT_R16G16_UNORM",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_G16R16_UNORM,<br>
> -      "MESA_FORMAT_G16R16_UNORM",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B10G10R10A2_UNORM,<br>
> -      "MESA_FORMAT_B10G10R10A2_UNORM",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      10, 10, 10, 2,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B10G10R10X2_UNORM,<br>
> -      "MESA_FORMAT_B10G10R10X2_UNORM",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      10, 10, 10, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R10G10B10A2_UNORM,<br>
> -      "MESA_FORMAT_R10G10B10A2_UNORM",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      10, 10, 10, 2,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_S8_UINT_Z24_UNORM,   /* Name */<br>
> -      "MESA_FORMAT_S8_UINT_Z24_UNORM", /* StrName */<br>
> -      GL_DEPTH_STENCIL,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,          /* DataType */<br>
> -      0, 0, 0, 0,                      /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 24, 8,                  /* Lum/Int/Index/Depth/StencilBits<br>
> */ -      1, 1, 4                          /* BlockWidth/Height,Bytes */ -<br>
>  },<br>
> -   {<br>
> -      MESA_FORMAT_X8_UINT_Z24_UNORM,   /* Name */<br>
> -      "MESA_FORMAT_X8_UINT_Z24_UNORM", /* StrName */<br>
> -      GL_DEPTH_COMPONENT,              /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,          /* DataType */<br>
> -      0, 0, 0, 0,                      /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 24, 0,                  /* Lum/Int/Index/Depth/StencilBits<br>
> */ -      1, 1, 4                          /* BlockWidth/Height,Bytes */ -<br>
>  },<br>
> -   {<br>
> -      MESA_FORMAT_Z24_UNORM_S8_UINT,   /* Name */<br>
> -      "MESA_FORMAT_Z24_UNORM_S8_UINT", /* StrName */<br>
> -      GL_DEPTH_STENCIL,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,          /* DataType */<br>
> -      0, 0, 0, 0,                      /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 24, 8,                  /* Lum/Int/Index/Depth/StencilBits<br>
> */ -      1, 1, 4                          /* BlockWidth/Height,Bytes */ -<br>
>  },<br>
> -   {<br>
> -      MESA_FORMAT_Z24_UNORM_X8_UINT,   /* Name */<br>
> -      "MESA_FORMAT_Z24_UNORM_X8_UINT", /* StrName */<br>
> -      GL_DEPTH_COMPONENT,              /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,          /* DataType */<br>
> -      0, 0, 0, 0,                      /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 24, 0,                  /* Lum/Int/Index/Depth/StencilBits<br>
> */ -      1, 1, 4                          /* BlockWidth/Height,Bytes */ -<br>
>  },<br>
> -   {<br>
> -      MESA_FORMAT_YCBCR,           /* Name */<br>
> -      "MESA_FORMAT_YCBCR",         /* StrName */<br>
> -      GL_YCBCR_MESA,               /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_YCBCR_REV,       /* Name */<br>
> -      "MESA_FORMAT_YCBCR_REV",     /* StrName */<br>
> -      GL_YCBCR_MESA,               /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -<br>
> -   /* Array unorm formats */<br>
> -   {<br>
> -      MESA_FORMAT_A_UNORM8,        /* Name */<br>
> -      "MESA_FORMAT_A_UNORM8",      /* StrName */<br>
> -      GL_ALPHA,                    /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_UNORM16,       /* Name */<br>
> -      "MESA_FORMAT_A_UNORM16",     /* StrName */<br>
> -      GL_ALPHA,                    /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_UNORM8,        /* Name */<br>
> -      "MESA_FORMAT_L_UNORM8",      /* StrName */<br>
> -      GL_LUMINANCE,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_UNORM16,       /* Name */<br>
> -      "MESA_FORMAT_L_UNORM16",     /* StrName */<br>
> -      GL_LUMINANCE,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_UNORM8,        /* Name */<br>
> -      "MESA_FORMAT_I_UNORM8",      /* StrName */<br>
> -      GL_INTENSITY,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 8, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_UNORM16,       /* Name */<br>
> -      "MESA_FORMAT_I_UNORM16",     /* StrName */<br>
> -      GL_INTENSITY,                /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 16, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_UNORM8,<br>
> -      "MESA_FORMAT_R_UNORM8",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_UNORM16,<br>
> -      "MESA_FORMAT_R_UNORM16",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      16, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_BGR_UNORM8,      /* Name */<br>
> -      "MESA_FORMAT_BGR_UNORM8",    /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 3                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_UNORM8,      /* Name */<br>
> -      "MESA_FORMAT_RGB_UNORM8",    /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 3                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_UNORM16,<br>
> -      "MESA_FORMAT_RGBA_UNORM16",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      16, 16, 16, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_UNORM16,<br>
> -      "MESA_FORMAT_RGBX_UNORM16",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_Z_UNORM16,       /* Name */<br>
> -      "MESA_FORMAT_Z_UNORM16",     /* StrName */<br>
> -      GL_DEPTH_COMPONENT,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 16, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 2                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_Z_UNORM32,       /* Name */<br>
> -      "MESA_FORMAT_Z_UNORM32",     /* StrName */<br>
> -      GL_DEPTH_COMPONENT,          /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_S_UINT8,         /* Name */<br>
> -      "MESA_FORMAT_S_UINT8",       /* StrName */<br>
> -      GL_STENCIL_INDEX,            /* BaseFormat */<br>
> -      GL_UNSIGNED_INT,             /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 8,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -<br>
> -   /* Packed signed/normalized formats */<br>
> -   {<br>
> -      MESA_FORMAT_A8B8G8R8_SNORM,<br>
> -      "MESA_FORMAT_A8B8G8R8_SNORM",<br>
> -      GL_RGBA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_X8B8G8R8_SNORM,<br>
> -      "MESA_FORMAT_X8B8G8R8_SNORM",<br>
> -      GL_RGB,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4                       /* 4 bpp, but no alpha */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8A8_SNORM,<br>
> -      "MESA_FORMAT_R8G8B8A8_SNORM",<br>
> -      GL_RGBA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8X8_SNORM,<br>
> -      "MESA_FORMAT_R8G8B8X8_SNORM",<br>
> -      GL_RGB,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R16G16_SNORM,<br>
> -      "MESA_FORMAT_R16G16_SNORM",<br>
> -      GL_RG,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_G16R16_SNORM,<br>
> -      "MESA_FORMAT_G16R16_SNORM",<br>
> -      GL_RG,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8_SNORM,<br>
> -      "MESA_FORMAT_R8G8_SNORM",<br>
> -      GL_RG,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_G8R8_SNORM,<br>
> -      "MESA_FORMAT_G8R8_SNORM",<br>
> -      GL_RG,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L8A8_SNORM,<br>
> -      "MESA_FORMAT_L8A8_SNORM",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 8,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -<br>
> -   /* Array signed/normalized formats */<br>
> -   {<br>
> -      MESA_FORMAT_A_SNORM8,<br>
> -      "MESA_FORMAT_A_SNORM8",<br>
> -      GL_ALPHA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_SNORM16,<br>
> -      "MESA_FORMAT_A_SNORM16",<br>
> -      GL_ALPHA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_SNORM8,<br>
> -      "MESA_FORMAT_L_SNORM8",<br>
> -      GL_LUMINANCE,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 0,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_SNORM16,<br>
> -      "MESA_FORMAT_L_SNORM16",<br>
> -      GL_LUMINANCE,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 0,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_SNORM8,<br>
> -      "MESA_FORMAT_I_SNORM8",<br>
> -      GL_INTENSITY,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 0,<br>
> -      0, 8, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_SNORM16,<br>
> -      "MESA_FORMAT_I_SNORM16",<br>
> -      GL_INTENSITY,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 0,<br>
> -      0, 16, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_SNORM8,         /* Name */<br>
> -      "MESA_FORMAT_R_SNORM8",       /* StrName */<br>
> -      GL_RED,                       /* BaseFormat */<br>
> -      GL_SIGNED_NORMALIZED,         /* DataType */<br>
> -      8, 0, 0, 0,                   /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,                /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 1                       /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_SNORM16,<br>
> -      "MESA_FORMAT_R_SNORM16",<br>
> -      GL_RED,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_SNORM16,<br>
> -      "MESA_FORMAT_LA_SNORM16",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      0, 0, 0, 16,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_SNORM16,<br>
> -      "MESA_FORMAT_RGB_SNORM16",<br>
> -      GL_RGB,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 6<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_SNORM16,<br>
> -      "MESA_FORMAT_RGBA_SNORM16",<br>
> -      GL_RGBA,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 16, 16, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_SNORM16,<br>
> -      "MESA_FORMAT_RGBX_SNORM16",<br>
> -      GL_RGB,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -<br>
> -   /* Packed sRGB formats */<br>
> -   {<br>
> -      MESA_FORMAT_A8B8G8R8_SRGB,<br>
> -      "MESA_FORMAT_A8B8G8R8_SRGB",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B8G8R8A8_SRGB,<br>
> -      "MESA_FORMAT_B8G8R8A8_SRGB",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_B8G8R8X8_SRGB,<br>
> -      "MESA_FORMAT_B8G8R8X8_SRGB",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8A8_SRGB,<br>
> -      "MESA_FORMAT_R8G8B8A8_SRGB",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R8G8B8X8_SRGB,<br>
> -      "MESA_FORMAT_R8G8B8X8_SRGB",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L8A8_SRGB,<br>
> -      "MESA_FORMAT_L8A8_SRGB",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      0, 0, 0, 8,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -<br>
> -   /* Array sRGB formats */<br>
> -   {<br>
> -      MESA_FORMAT_L_SRGB8,<br>
> -      "MESA_FORMAT_L_SRGB8",<br>
> -      GL_LUMINANCE,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      0, 0, 0, 0,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_BGR_SRGB8,<br>
> -      "MESA_FORMAT_BGR_SRGB8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 3<br>
> -   },<br>
> -<br>
> -   /* Packed float formats */<br>
> -   {<br>
> -      MESA_FORMAT_R9G9B9E5_FLOAT,<br>
> -      "MESA_FORMAT_RGB9_E5",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      9, 9, 9, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R11G11B10_FLOAT,<br>
> -      "MESA_FORMAT_R11G11B10_FLOAT",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      11, 11, 10, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_Z32_FLOAT_S8X24_UINT,   /* Name */<br>
> -      "MESA_FORMAT_Z32_FLOAT_S8X24_UINT", /* StrName */<br>
> -      GL_DEPTH_STENCIL,                   /* BaseFormat */<br>
> -      /* DataType here is used to answer GL_TEXTURE_DEPTH_TYPE queries, and<br>
> is -       * never used for stencil because stencil is always<br>
> GL_UNSIGNED_INT. -       */<br>
> -      GL_FLOAT,                    /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 32, 8,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 8                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -<br>
> -   /* Array float formats */<br>
> -   {<br>
> -      MESA_FORMAT_A_FLOAT16,<br>
> -      "MESA_FORMAT_A_FLOAT16",<br>
> -      GL_ALPHA,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_FLOAT32,<br>
> -      "MESA_FORMAT_A_FLOAT32",<br>
> -      GL_ALPHA,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_FLOAT16,<br>
> -      "MESA_FORMAT_L_FLOAT16",<br>
> -      GL_LUMINANCE,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 0,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_FLOAT32,<br>
> -      "MESA_FORMAT_L_FLOAT32",<br>
> -      GL_LUMINANCE,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 0,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_FLOAT16,<br>
> -      "MESA_FORMAT_LA_FLOAT16",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 16,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_FLOAT32,<br>
> -      "MESA_FORMAT_LA_FLOAT32",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 32,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_FLOAT16,<br>
> -      "MESA_FORMAT_I_FLOAT16",<br>
> -      GL_INTENSITY,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 16, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_FLOAT32,<br>
> -      "MESA_FORMAT_I_FLOAT32",<br>
> -      GL_INTENSITY,<br>
> -      GL_FLOAT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 32, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_FLOAT16,<br>
> -      "MESA_FORMAT_R_FLOAT16",<br>
> -      GL_RED,<br>
> -      GL_FLOAT,<br>
> -      16, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_FLOAT32,<br>
> -      "MESA_FORMAT_R_FLOAT32",<br>
> -      GL_RED,<br>
> -      GL_FLOAT,<br>
> -      32, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_FLOAT16,<br>
> -      "MESA_FORMAT_RG_FLOAT16",<br>
> -      GL_RG,<br>
> -      GL_FLOAT,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_FLOAT32,<br>
> -      "MESA_FORMAT_RG_FLOAT32",<br>
> -      GL_RG,<br>
> -      GL_FLOAT,<br>
> -      32, 32, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_FLOAT16,<br>
> -      "MESA_FORMAT_RGB_FLOAT16",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 6<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_FLOAT32,<br>
> -      "MESA_FORMAT_RGB_FLOAT32",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 12<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_FLOAT16,<br>
> -      "MESA_FORMAT_RGBA_FLOAT16",<br>
> -      GL_RGBA,<br>
> -      GL_FLOAT,<br>
> -      16, 16, 16, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_FLOAT32,<br>
> -      "MESA_FORMAT_RGBA_FLOAT32",<br>
> -      GL_RGBA,<br>
> -      GL_FLOAT,<br>
> -      32, 32, 32, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_FLOAT16,<br>
> -      "MESA_FORMAT_RGBX_FLOAT16",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_FLOAT32,<br>
> -      "MESA_FORMAT_RGBX_FLOAT32",<br>
> -      GL_RGB,<br>
> -      GL_FLOAT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_Z_FLOAT32,       /* Name */<br>
> -      "MESA_FORMAT_Z_FLOAT32",     /* StrName */<br>
> -      GL_DEPTH_COMPONENT,          /* BaseFormat */<br>
> -      GL_FLOAT,                    /* DataType */<br>
> -      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */<br>
> -      1, 1, 4                      /* BlockWidth/Height,Bytes */<br>
> -   },<br>
> -<br>
> -   /* Packed signed/unsigned non-normalized integer formats */<br>
> -   {<br>
> -      MESA_FORMAT_B10G10R10A2_UINT,<br>
> -      "MESA_FORMAT_B10G10R10A2_UINT",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      10, 10, 10, 2,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R10G10B10A2_UINT,<br>
> -      "MESA_FORMAT_R10G10B10A2_UINT",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      10, 10, 10, 2,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -<br>
> -   /* Array signed/unsigned non-normalized integer formats */<br>
> -   {<br>
> -      MESA_FORMAT_A_UINT8,<br>
> -      "MESA_FORMAT_A_UINT8",<br>
> -      GL_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_UINT16,<br>
> -      "MESA_FORMAT_A_UINT16",<br>
> -      GL_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_UINT32,<br>
> -      "MESA_FORMAT_A_UINT32",<br>
> -      GL_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_SINT8,<br>
> -      "MESA_FORMAT_A_SINT8",<br>
> -      GL_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_SINT16,<br>
> -      "MESA_FORMAT_A_SINT16",<br>
> -      GL_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_A_SINT32,<br>
> -      "MESA_FORMAT_A_SINT32",<br>
> -      GL_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_UINT8,<br>
> -      "MESA_FORMAT_I_UINT8",<br>
> -      GL_INTENSITY,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 8, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_UINT16,<br>
> -      "MESA_FORMAT_I_UINT16",<br>
> -      GL_INTENSITY,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 16, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_UINT32,<br>
> -      "MESA_FORMAT_I_UINT32",<br>
> -      GL_INTENSITY,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 32, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_SINT8,<br>
> -      "MESA_FORMAT_I_SINT8",<br>
> -      GL_INTENSITY,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 8, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_SINT16,<br>
> -      "MESA_FORMAT_I_SINT16",<br>
> -      GL_INTENSITY,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 16, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_I_SINT32,<br>
> -      "MESA_FORMAT_I_SINT32",<br>
> -      GL_INTENSITY,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      0, 32, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_UINT8,<br>
> -      "MESA_FORMAT_L_UINT8",<br>
> -      GL_LUMINANCE,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_UINT16,<br>
> -      "MESA_FORMAT_L_UINT16",<br>
> -      GL_LUMINANCE,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_UINT32,<br>
> -      "MESA_FORMAT_L_UINT32",<br>
> -      GL_LUMINANCE,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 0,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_SINT8,<br>
> -      "MESA_FORMAT_L_SINT8",<br>
> -      GL_LUMINANCE,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_SINT16,<br>
> -      "MESA_FORMAT_L_SINT16",<br>
> -      GL_LUMINANCE,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_L_SINT32,<br>
> -      "MESA_FORMAT_L_SINT32",<br>
> -      GL_LUMINANCE,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 0,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_UINT8,<br>
> -      "MESA_FORMAT_LA_UINT8",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 8,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_UINT16,<br>
> -      "MESA_FORMAT_LA_UINT16",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 16,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_UINT32,<br>
> -      "MESA_FORMAT_LA_UINT32",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      0, 0, 0, 32,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_SINT8,<br>
> -      "MESA_FORMAT_LA_SINT8",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 8,<br>
> -      8, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_SINT16,<br>
> -      "MESA_FORMAT_LA_SINT16",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 16,<br>
> -      16, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_LA_SINT32,<br>
> -      "MESA_FORMAT_LA_SINT32",<br>
> -      GL_LUMINANCE_ALPHA,<br>
> -      GL_INT,<br>
> -      0, 0, 0, 32,<br>
> -      32, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_UINT8,<br>
> -      "MESA_FORMAT_R_UINT8",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_INT,<br>
> -      8, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_UINT16,<br>
> -      "MESA_FORMAT_R_UINT16",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_INT,<br>
> -      16, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_UINT32,<br>
> -      "MESA_FORMAT_R_UINT32",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_INT,<br>
> -      32, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_SINT8,<br>
> -      "MESA_FORMAT_R_SINT8",<br>
> -      GL_RED,<br>
> -      GL_INT,<br>
> -      8, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 1<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_SINT16,<br>
> -      "MESA_FORMAT_R_SINT16",<br>
> -      GL_RED,<br>
> -      GL_INT,<br>
> -      16, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_R_SINT32,<br>
> -      "MESA_FORMAT_R_SINT32",<br>
> -      GL_RED,<br>
> -      GL_INT,<br>
> -      32, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_UINT8,<br>
> -      "MESA_FORMAT_RG_UINT8",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_INT,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_UINT16,<br>
> -      "MESA_FORMAT_RG_UINT16",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_INT,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_UINT32,<br>
> -      "MESA_FORMAT_RG_UINT32",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_INT,<br>
> -      32, 32, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_SINT8,<br>
> -      "MESA_FORMAT_RG_SINT8",<br>
> -      GL_RG,<br>
> -      GL_INT,<br>
> -      8, 8, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 2<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_SINT16,<br>
> -      "MESA_FORMAT_RG_SINT16",<br>
> -      GL_RG,<br>
> -      GL_INT,<br>
> -      16, 16, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RG_SINT32,<br>
> -      "MESA_FORMAT_RG_SINT32",<br>
> -      GL_RG,<br>
> -      GL_INT,<br>
> -      32, 32, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_UINT8,<br>
> -      "MESA_FORMAT_RGB_UINT8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 3<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_UINT16,<br>
> -      "MESA_FORMAT_RGB_UINT16",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 6<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_UINT32,<br>
> -      "MESA_FORMAT_RGB_UINT32",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 12<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_SINT8,<br>
> -      "MESA_FORMAT_RGB_SINT8",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 3<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_SINT16,<br>
> -      "MESA_FORMAT_RGB_SINT16",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 6<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGB_SINT32,<br>
> -      "MESA_FORMAT_RGB_SINT32",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 12<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_UINT8,<br>
> -      "MESA_FORMAT_RGBA_UINT8",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_UINT16,<br>
> -      "MESA_FORMAT_RGBA_UINT16",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      16, 16, 16, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_UINT32,<br>
> -      "MESA_FORMAT_RGBA_UINT32",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_INT,<br>
> -      32, 32, 32, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_SINT8,<br>
> -      "MESA_FORMAT_RGBA_SINT8",<br>
> -      GL_RGBA,<br>
> -      GL_INT,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_SINT16,<br>
> -      "MESA_FORMAT_RGBA_SINT16",<br>
> -      GL_RGBA,<br>
> -      GL_INT,<br>
> -      16, 16, 16, 16,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_SINT32,<br>
> -      "MESA_FORMAT_RGBA_SINT32",<br>
> -      GL_RGBA,<br>
> -      GL_INT,<br>
> -      32, 32, 32, 32,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_UINT8,<br>
> -      "MESA_FORMAT_RGBX_UINT8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_UINT16,<br>
> -      "MESA_FORMAT_RGBX_UINT16",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_UINT32,<br>
> -      "MESA_FORMAT_RGBX_UINT32",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_INT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_SINT8,<br>
> -      "MESA_FORMAT_RGBX_SINT8",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 4<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_SINT16,<br>
> -      "MESA_FORMAT_RGBX_SINT16",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      16, 16, 16, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 8<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBX_SINT32,<br>
> -      "MESA_FORMAT_RGBX_SINT32",<br>
> -      GL_RGB,<br>
> -      GL_INT,<br>
> -      32, 32, 32, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      1, 1, 16<br>
> -   },<br>
> -<br>
> -   /* DXT compressed formats */<br>
> -   {<br>
> -      MESA_FORMAT_RGB_DXT1,        /* Name */<br>
> -      "MESA_FORMAT_RGB_DXT1",      /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      4, 4, 8                      /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_DXT1,<br>
> -      "MESA_FORMAT_RGBA_DXT1",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                      /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_DXT3,<br>
> -      "MESA_FORMAT_RGBA_DXT3",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_DXT5,<br>
> -      "MESA_FORMAT_RGBA_DXT5",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -<br>
> -   /* DXT sRGB compressed formats */<br>
> -   {<br>
> -      MESA_FORMAT_SRGB_DXT1,       /* Name */<br>
> -      "MESA_FORMAT_SRGB_DXT1",     /* StrName */<br>
> -      GL_RGB,                      /* BaseFormat */<br>
> -      GL_UNSIGNED_NORMALIZED,      /* DataType */<br>
> -      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */<br>
> -      4, 4, 8                      /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_SRGBA_DXT1,<br>
> -      "MESA_FORMAT_SRGBA_DXT1",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                      /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_SRGBA_DXT3,<br>
> -      "MESA_FORMAT_SRGBA_DXT3",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_SRGBA_DXT5,<br>
> -      "MESA_FORMAT_SRGBA_DXT5",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 4,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -<br>
> -   /* FXT1 compressed formats */<br>
> -   {<br>
> -      MESA_FORMAT_RGB_FXT1,<br>
> -      "MESA_FORMAT_RGB_FXT1",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 0,                  /* approx Red/Green/BlueBits */<br>
> -      0, 0, 0, 0, 0,<br>
> -      8, 4, 16                     /* 16 bytes per 8x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_RGBA_FXT1,<br>
> -      "MESA_FORMAT_RGBA_FXT1",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      4, 4, 4, 1,                  /* approx Red/Green/Blue/AlphaBits */<br>
> -      0, 0, 0, 0, 0,<br>
> -      8, 4, 16                     /* 16 bytes per 8x4 block */<br>
> -   },<br>
> -<br>
> -   /* RGTC compressed formats */<br>
> -   {<br>
> -     MESA_FORMAT_R_RGTC1_UNORM,<br>
> -     "MESA_FORMAT_R_RGTC1_UNORM",<br>
> -     GL_RED,<br>
> -     GL_UNSIGNED_NORMALIZED,<br>
> -     8, 0, 0, 0,<br>
> -     0, 0, 0, 0, 0,<br>
> -     4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_R_RGTC1_SNORM,<br>
> -     "MESA_FORMAT_R_RGTC1_SNORM",<br>
> -     GL_RED,<br>
> -     GL_SIGNED_NORMALIZED,<br>
> -     8, 0, 0, 0,<br>
> -     0, 0, 0, 0, 0,<br>
> -     4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_RG_RGTC2_UNORM,<br>
> -     "MESA_FORMAT_RG_RGTC2_UNORM",<br>
> -     GL_RG,<br>
> -     GL_UNSIGNED_NORMALIZED,<br>
> -     8, 8, 0, 0,<br>
> -     0, 0, 0, 0, 0,<br>
> -     4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_RG_RGTC2_SNORM,<br>
> -     "MESA_FORMAT_RG_RGTC2_SNORM",<br>
> -     GL_RG,<br>
> -     GL_SIGNED_NORMALIZED,<br>
> -     8, 8, 0, 0,<br>
> -     0, 0, 0, 0, 0,<br>
> -     4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -<br>
> -   /* LATC1/2 compressed formats */<br>
> -   {<br>
> -     MESA_FORMAT_L_LATC1_UNORM,<br>
> -     "MESA_FORMAT_L_LATC1_UNORM",<br>
> -     GL_LUMINANCE,<br>
> -     GL_UNSIGNED_NORMALIZED,<br>
> -     0, 0, 0, 0,<br>
> -     4, 0, 0, 0, 0,<br>
> -     4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_L_LATC1_SNORM,<br>
> -     "MESA_FORMAT_L_LATC1_SNORM",<br>
> -     GL_LUMINANCE,<br>
> -     GL_SIGNED_NORMALIZED,<br>
> -     0, 0, 0, 0,<br>
> -     4, 0, 0, 0, 0,<br>
> -     4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_LA_LATC2_UNORM,<br>
> -     "MESA_FORMAT_LA_LATC2_UNORM",<br>
> -     GL_LUMINANCE_ALPHA,<br>
> -     GL_UNSIGNED_NORMALIZED,<br>
> -     0, 0, 0, 4,<br>
> -     4, 0, 0, 0, 0,<br>
> -     4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -     MESA_FORMAT_LA_LATC2_SNORM,<br>
> -     "MESA_FORMAT_LA_LATC2_SNORM",<br>
> -     GL_LUMINANCE_ALPHA,<br>
> -     GL_SIGNED_NORMALIZED,<br>
> -     0, 0, 0, 4,<br>
> -     4, 0, 0, 0, 0,<br>
> -     4, 4, 16                     /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -<br>
> -   /* ETC1/2 compressed formats */<br>
> -   {<br>
> -      MESA_FORMAT_ETC1_RGB8,<br>
> -      "MESA_FORMAT_ETC1_RGB8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_RGB8,<br>
> -      "MESA_FORMAT_ETC2_RGB8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_SRGB8,<br>
> -      "MESA_FORMAT_ETC2_SRGB8",<br>
> -      GL_RGB,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_RGBA8_EAC,<br>
> -      "MESA_FORMAT_ETC2_RGBA8_EAC",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                    /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,<br>
> -      "MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 8,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                    /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_R11_EAC,<br>
> -      "MESA_FORMAT_ETC2_R11_EAC",<br>
> -      GL_RED,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      11, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                    /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_RG11_EAC,<br>
> -      "MESA_FORMAT_ETC2_RG11_EAC",<br>
> -      GL_RG,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      11, 11, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                    /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_SIGNED_R11_EAC,<br>
> -      "MESA_FORMAT_ETC2_SIGNED_R11_EAC",<br>
> -      GL_RED,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      11, 0, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                    /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_SIGNED_RG11_EAC,<br>
> -      "MESA_FORMAT_ETC2_SIGNED_RG11_EAC",<br>
> -      GL_RG,<br>
> -      GL_SIGNED_NORMALIZED,<br>
> -      11, 11, 0, 0,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 16                    /* 16 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,<br>
> -      "MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 1,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -   {<br>
> -      MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,<br>
> -      "MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1",<br>
> -      GL_RGBA,<br>
> -      GL_UNSIGNED_NORMALIZED,<br>
> -      8, 8, 8, 1,<br>
> -      0, 0, 0, 0, 0,<br>
> -      4, 4, 8                     /* 8 bytes per 4x4 block */<br>
> -   },<br>
> -};<br>
> -<br>
> -<br>
> +#include "format_info.c"<br>
><br>
>  static const struct gl_format_info *<br>
>  _mesa_get_format_info(mesa_format format)<br>
> @@ -2331,7 +595,6 @@ check_format_to_type_and_comps(void)<br>
>     }<br>
>  }<br>
><br>
> -<br>
>  /**<br>
>   * Do sanity checking of the format info table.<br>
>   */<br>
</div></div></blockquote></div><br></div></div></div></div>