When pushing a new branch only the last commit message email gets sent,
but there is one earlier patch submitted to the gallium-llvmpipe branch
which I'd like to draw your attention to.

The patch is attached -- it adds a new table describing pipe_formats in
detail, automatically generated from a compact text file (.CSV) by a
python script.

Although pipe_format enum already has much of this information
when I started drafting the LLVM IR code generation to unpack/pack a
pixel using the format query functions p_format.h I soon stumbled into
several problems:
- swizzles are inconsistently used -- sometimes the swizzle describes
which output vector channel goes in the source vector, sometimes it
describes the opposite  
- depth stencil information is coded in the swizzle, instead of being
coded as a new layout (which doesn't make any sense if o)
- padding in the source vector is not properly respected in some cases
- swizzles in integer format sometimes assume the source components
start from the least significant bit, other times from the most
significant bit

The odd thing is that if one looks to an individual format, it looks OK.
It is when you try to derive some rule that everything falls apart.

Although some of the inconsistencies are straight forward to fix, there
simply are not enough bits in an enum to store all this info
conveniently with bitmask -- we'd have to resort to arithmetic
operations instead. And even if we could, it would be a matter of time
until some new format comes along and we need to devise a new way to
encode it. It basically makes the goal of providing some sort of gallium
binary compatibility impossible.

A lookup table is way more flexible way to store this information, and
can be just as fast to lookup, especially if one has the formats
sequentially enumerated from 0, which I think we should do, once this
code is complete enough to fully replace p_format.h's auxiliary
functions.

Note that the CSV was derived from p_format.h and still as
inconsistencies for many of the formats. I hope to squash these soon by
writing a small test suite with (packed, unpacked) pixel data pairs.

I also hope to apply the same concept to automatically generate the
functions the functions in u_tile.c, so that we don't have unsupported
formats or bugs/typos lurking in that code, as often happens.

Let me know if you disagree or have a better suggestion.

Jose
commit 302d8cbd227be47d3eb1cecfbf0355f27dd715df
Author: José Fonseca <jfons...@vmware.com>
Date:   Sun Jul 26 23:50:00 2009 +0100

    util: Pixel format database.
    
    There are some inconsistencies in pipe_format, but above all, there
    simply aren't enough bits in an enum to conveniently store all
    information about a pixel format we need to be able to dynamically
    generate pixel packing/unpacking code.

diff --git a/src/gallium/auxiliary/util/Makefile b/src/gallium/auxiliary/util/Makefile
index 6a8eb73..003aa05 100644
--- a/src/gallium/auxiliary/util/Makefile
+++ b/src/gallium/auxiliary/util/Makefile
@@ -10,6 +10,8 @@ C_SOURCES = \
 	u_blit.c \
 	u_cache.c \
 	u_draw_quad.c \
+	u_format.c \
+	u_format_table.c \
 	u_gen_mipmap.c \
 	u_handle_table.c \
 	u_hash_table.c \
diff --git a/src/gallium/auxiliary/util/SConscript b/src/gallium/auxiliary/util/SConscript
index fb142ee..bd1af4e 100644
--- a/src/gallium/auxiliary/util/SConscript
+++ b/src/gallium/auxiliary/util/SConscript
@@ -12,6 +12,8 @@ util = env.ConvenienceLibrary(
 		'u_debug_stack.c',
 		'u_debug_symbol.c',
 		'u_draw_quad.c',
+		'u_format.c',
+		'u_format_table.c',
 		'u_gen_mipmap.c',
 		'u_handle_table.c',
 		'u_hash.c',
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c
new file mode 100644
index 0000000..98ea13b
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_format.c
@@ -0,0 +1,46 @@
+/**************************************************************************
+ *
+ * Copyright 2009 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 "u_format.h"
+
+
+const struct util_format_description *
+util_format_description(enum pipe_format format)
+{
+   const struct util_format_description *desc = util_format_description_table;
+
+   while(TRUE) {
+      if(desc->format == format)
+         return desc;
+
+      if(desc->format == PIPE_FORMAT_NONE)
+         return NULL;
+
+      ++desc;
+   };
+}
diff --git a/src/gallium/auxiliary/util/u_format.csv b/src/gallium/auxiliary/util/u_format.csv
new file mode 100644
index 0000000..bf8f6ad
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_format.csv
@@ -0,0 +1,99 @@
+PIPE_FORMAT_A8R8G8B8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , zyxw, 
+PIPE_FORMAT_X8R8G8B8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , zyx1, 
+PIPE_FORMAT_B8G8R8A8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , xyzw, 
+PIPE_FORMAT_B8G8R8X8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , xyz1, 
+PIPE_FORMAT_A1R5G5B5_UNORM        , rgba, 1, 1, un5 , un5 , un5 , un1 , wxyz, 
+PIPE_FORMAT_A4R4G4B4_UNORM        , rgba, 1, 1, un4 , un4 , un4 , un4 , wxyz, 
+PIPE_FORMAT_R5G6B5_UNORM          , rgba, 1, 1, un5 , un6 , un5 ,     , zyx1, 
+PIPE_FORMAT_A2B10G10R10_UNORM     , rgba, 1, 1, un10, un10, un10, un2 , wzyx, 
+PIPE_FORMAT_L8_UNORM              , rgba, 1, 1, un8 ,     ,     ,     , xxx1, 
+PIPE_FORMAT_A8_UNORM              , rgba, 1, 1, un8 ,     ,     ,     , 000x, 
+PIPE_FORMAT_I8_UNORM              , rgba, 1, 1, un8 ,     ,     ,     , xxxx, 
+PIPE_FORMAT_A8L8_UNORM            , rgba, 1, 1, un8 , un8 ,     ,     , xxxy, 
+PIPE_FORMAT_L16_UNORM             , rgba, 1, 1, un16,     ,     ,     , xxx1, 
+PIPE_FORMAT_Z16_UNORM             , zs  , 1, 1, un16,     ,     ,     , x0__, 
+PIPE_FORMAT_Z32_UNORM             , zs  , 1, 1, un32,     ,     ,     , x0__, 
+PIPE_FORMAT_Z32_FLOAT             , zs  , 1, 1, f32 ,     ,     ,     , x0__, 
+PIPE_FORMAT_S8Z24_UNORM           , zs  , 1, 1, un8 , un24,     ,     , yx__, 
+PIPE_FORMAT_Z24S8_UNORM           , zs  , 1, 1, un24, un8 ,     ,     , xy__, 
+PIPE_FORMAT_X8Z24_UNORM           , zs  , 1, 1, un8 , un24,     ,     , y0__, 
+PIPE_FORMAT_Z24X8_UNORM           , zs  , 1, 1, un24, un8 ,     ,     , x0__, 
+PIPE_FORMAT_S8_UNORM              , zs  , 1, 1, un8 ,     ,     ,     , 0x__, 
+PIPE_FORMAT_R64_FLOAT             , rgba, 1, 1, f64 ,     ,     ,     , x001, 
+PIPE_FORMAT_R64G64_FLOAT          , rgba, 1, 1, f64 , f64 ,     ,     , xy01, 
+PIPE_FORMAT_R64G64B64_FLOAT       , rgba, 1, 1, f64 , f64 , f64 ,     , xyz1, 
+PIPE_FORMAT_R64G64B64A64_FLOAT    , rgba, 1, 1, f64 , f64 , f64 , f64 , xyzw, 
+PIPE_FORMAT_R32_FLOAT             , rgba, 1, 1, f32 ,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_FLOAT          , rgba, 1, 1, f32 , f32 ,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_FLOAT       , rgba, 1, 1, f32 , f32 , f32 ,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_FLOAT    , rgba, 1, 1, f32 , f32 , f32 , f32 , xyzw, 
+PIPE_FORMAT_R32_UNORM             , rgba, 1, 1, un32,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_UNORM          , rgba, 1, 1, un32, un32,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_UNORM       , rgba, 1, 1, un32, un32, un32,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_UNORM    , rgba, 1, 1, un32, un32, un32, un32, xyzw, 
+PIPE_FORMAT_R32_USCALED           , rgba, 1, 1, u32 ,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_USCALED        , rgba, 1, 1, u32 , u32 ,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_USCALED     , rgba, 1, 1, u32 , u32 , u32 ,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_USCALED  , rgba, 1, 1, u32 , u32 , u32 , u32 , xyzw, 
+PIPE_FORMAT_R32_SNORM             , rgba, 1, 1, sn32,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_SNORM          , rgba, 1, 1, sn32, sn32,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_SNORM       , rgba, 1, 1, sn32, sn32, sn32,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_SNORM    , rgba, 1, 1, sn32, sn32, sn32, sn32, xyzw, 
+PIPE_FORMAT_R32_SSCALED           , rgba, 1, 1, s32 ,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_SSCALED        , rgba, 1, 1, s32 , s32 ,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_SSCALED     , rgba, 1, 1, s32 , s32 , s32 ,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_SSCALED  , rgba, 1, 1, s32 , s32 , s32 , s32 , xyzw, 
+PIPE_FORMAT_R16_UNORM             , rgba, 1, 1, un16,     ,     ,     , x001, 
+PIPE_FORMAT_R16G16_UNORM          , rgba, 1, 1, un16, un16,     ,     , xy01, 
+PIPE_FORMAT_R16G16B16_UNORM       , rgba, 1, 1, un16, un16, un16,     , xyz1, 
+PIPE_FORMAT_R16G16B16A16_UNORM    , rgba, 1, 1, un16, un16, un16, un16, xyzw, 
+PIPE_FORMAT_R16_USCALED           , rgba, 1, 1, u16 ,     ,     ,     , x001, 
+PIPE_FORMAT_R16G16_USCALED        , rgba, 1, 1, u16 , u16 ,     ,     , xy01, 
+PIPE_FORMAT_R16G16B16_USCALED     , rgba, 1, 1, u16 , u16 , u16 ,     , xyz1, 
+PIPE_FORMAT_R16G16B16A16_USCALED  , rgba, 1, 1, u16 , u16 , u16 , u16 , xyzw, 
+PIPE_FORMAT_R16_SNORM             , rgba, 1, 1, sn16,     ,     ,     , x001, 
+PIPE_FORMAT_R16G16_SNORM          , rgba, 1, 1, sn16, sn16,     ,     , xy01, 
+PIPE_FORMAT_R16G16B16_SNORM       , rgba, 1, 1, sn16, sn16, sn16,     , xyz1, 
+PIPE_FORMAT_R16G16B16A16_SNORM    , rgba, 1, 1, sn16, sn16, sn16, sn16, xyzw, 
+PIPE_FORMAT_R16_SSCALED           , rgba, 1, 1, s16 ,     ,     ,     , x001, 
+PIPE_FORMAT_R16G16_SSCALED        , rgba, 1, 1, s16 , s16 ,     ,     , xy01, 
+PIPE_FORMAT_R16G16B16_SSCALED     , rgba, 1, 1, s16 , s16 , s16 ,     , xyz1, 
+PIPE_FORMAT_R16G16B16A16_SSCALED  , rgba, 1, 1, s16 , s16 , s16 , s16 , xyzw, 
+PIPE_FORMAT_R8_UNORM              , rgba, 1, 1, un8 ,     ,     ,     , x001, 
+PIPE_FORMAT_R8G8_UNORM            , rgba, 1, 1, un8 , un8 ,     ,     , xy01, 
+PIPE_FORMAT_R8G8B8_UNORM          , rgba, 1, 1, un8 , un8 , un8 ,     , xyz1, 
+PIPE_FORMAT_R8G8B8A8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , xyzw, 
+PIPE_FORMAT_R8G8B8X8_UNORM        , rgba, 1, 1, un8 , un8 , un8 , un8 , xyz1, 
+PIPE_FORMAT_R8_USCALED            , rgba, 1, 1, u8  ,     ,     ,     , x001, 
+PIPE_FORMAT_R8G8_USCALED          , rgba, 1, 1, u8  , u8  ,     ,     , xy01, 
+PIPE_FORMAT_R8G8B8_USCALED        , rgba, 1, 1, u8  , u8  , u8  ,     , xyz1, 
+PIPE_FORMAT_R8G8B8A8_USCALED      , rgba, 1, 1, u8  , u8  , u8  , u8  , xyzw, 
+PIPE_FORMAT_R8G8B8X8_USCALED      , rgba, 1, 1, u8  , u8  , u8  , u8  , xyz1, 
+PIPE_FORMAT_R8_SNORM              , rgba, 1, 1, sn8 ,     ,     ,     , x001, 
+PIPE_FORMAT_R8G8_SNORM            , rgba, 1, 1, sn8 , sn8 ,     ,     , xy01, 
+PIPE_FORMAT_R8G8B8_SNORM          , rgba, 1, 1, sn8 , sn8 , sn8 ,     , xyz1, 
+PIPE_FORMAT_R8G8B8A8_SNORM        , rgba, 1, 1, sn8 , sn8 , sn8 , sn8 , xyzw, 
+PIPE_FORMAT_R8G8B8X8_SNORM        , rgba, 1, 1, sn8 , sn8 , sn8 , sn8 , xyz1, 
+PIPE_FORMAT_B6G5R5_SNORM          , rgba, 1, 1, sn5 , sn5 , sn6 ,     , zyx1, 
+PIPE_FORMAT_A8B8G8R8_SNORM        , rgba, 1, 1, sn8 , sn8 , sn8 , sn8 , zyxw, 
+PIPE_FORMAT_X8B8G8R8_SNORM        , rgba, 1, 1, sn8 , sn8 , sn8 , sn8 , zyx1, 
+PIPE_FORMAT_R8_SSCALED            , rgba, 1, 1, s8  ,     ,     ,     , x001, 
+PIPE_FORMAT_R8G8_SSCALED          , rgba, 1, 1, s8  , s8  ,     ,     , xy01, 
+PIPE_FORMAT_R8G8B8_SSCALED        , rgba, 1, 1, s8  , s8  , s8  ,     , xyz1, 
+PIPE_FORMAT_R8G8B8A8_SSCALED      , rgba, 1, 1, s8  , s8  , s8  , s8  , xyzw, 
+PIPE_FORMAT_R8G8B8X8_SSCALED      , rgba, 1, 1, s8  , s8  , s8  , s8  , xyz1, 
+PIPE_FORMAT_R32_FIXED             , rgba, 1, 1, h32 ,     ,     ,     , x001, 
+PIPE_FORMAT_R32G32_FIXED          , rgba, 1, 1, h32 , h32 ,     ,     , xy01, 
+PIPE_FORMAT_R32G32B32_FIXED       , rgba, 1, 1, h32 , h32 , h32 ,     , xyz1, 
+PIPE_FORMAT_R32G32B32A32_FIXED    , rgba, 1, 1, h32 , h32 , h32 , h32 , xyzw, 
+PIPE_FORMAT_L8_SRGB               , rgba, 1, 1, u8  ,     ,     ,     , xxx1, srgb 
+PIPE_FORMAT_A8L8_SRGB             , rgba, 1, 1, u8  , u8  ,     ,     , xxxy, srgb 
+PIPE_FORMAT_R8G8B8_SRGB           , rgba, 1, 1, u8  , u8  , u8  ,     , xyz1, srgb 
+PIPE_FORMAT_R8G8B8A8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , xyzw, srgb 
+PIPE_FORMAT_R8G8B8X8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , xyz1, srgb 
+PIPE_FORMAT_A8R8G8B8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , wxyz, srgb 
+PIPE_FORMAT_X8R8G8B8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , 1xyz, srgb 
+PIPE_FORMAT_B8G8R8A8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , zyxw, srgb 
+PIPE_FORMAT_B8G8R8X8_SRGB         , rgba, 1, 1, u8  , u8  , u8  , u8  , zyx1, srgb 
+PIPE_FORMAT_X8UB8UG8SR8S_NORM     , rgba, 1, 1, sn8 , sn8 , un8 , x8  , 1zyx,
+PIPE_FORMAT_B6UG5SR5S_NORM        , rgba, 1, 1, sn5 , sn5 , un6 ,     , xyz1, 
diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h
new file mode 100644
index 0000000..2d7730f
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_format.h
@@ -0,0 +1,111 @@
+/**************************************************************************
+ *
+ * Copyright 2009 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.
+ *
+ **************************************************************************/
+
+
+#ifndef U_FORMAT_H
+#define U_FORMAT_H
+
+
+#include "pipe/p_format.h"
+
+
+enum util_format_layout {
+   UTIL_FORMAT_LAYOUT_RGBA = 0,
+   UTIL_FORMAT_LAYOUT_ZS = 1,
+   UTIL_FORMAT_LAYOUT_YUV = 2,
+   UTIL_FORMAT_LAYOUT_DXT = 3
+};
+
+
+struct util_format_block
+{
+   /** Block width in pixels */
+   unsigned width;
+   
+   /** Block height in pixels */
+   unsigned height;
+
+   /** Block size in bytes */
+   unsigned bits;
+};
+
+
+enum util_format_type {
+   UTIL_FORMAT_TYPE_VOID = 0,
+   UTIL_FORMAT_TYPE_UNSIGNED = 1,
+   UTIL_FORMAT_TYPE_SIGNED = 2,
+   UTIL_FORMAT_TYPE_FIXED = 3,
+   UTIL_FORMAT_TYPE_FLOAT = 4
+};
+
+
+enum util_format_swizzle {
+   UTIL_FORMAT_SWIZZLE_X = 0,
+   UTIL_FORMAT_SWIZZLE_Y = 1,
+   UTIL_FORMAT_SWIZZLE_Z = 2,
+   UTIL_FORMAT_SWIZZLE_W = 3,
+   UTIL_FORMAT_SWIZZLE_0 = 4,
+   UTIL_FORMAT_SWIZZLE_1 = 5,
+   UTIL_FORMAT_SWIZZLE_NONE = 6
+};
+
+
+enum util_format_colorspace {
+   UTIL_FORMAT_COLORSPACE_RGB = 0,
+   UTIL_FORMAT_COLORSPACE_SRGB = 1
+};
+
+
+struct util_format_channel_description
+{
+   unsigned type:6;
+   unsigned normalized:1;
+   unsigned size:9;
+};
+
+
+struct util_format_description
+{
+   enum pipe_format format;
+   const char *name;
+   struct util_format_block block;
+   enum util_format_layout layout;
+   struct util_format_channel_description channel[4];
+   unsigned char swizzle[4];
+   enum util_format_colorspace colorspace;
+};
+
+
+extern const struct util_format_description 
+util_format_description_table[];
+
+
+const struct util_format_description *
+util_format_description(enum pipe_format format);
+
+
+#endif /* ! U_FORMAT_H */
diff --git a/src/gallium/auxiliary/util/u_format_table.py b/src/gallium/auxiliary/util/u_format_table.py
new file mode 100755
index 0000000..e94fbbe
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_format_table.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+
+'''
+/**************************************************************************
+ *
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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 TUNGSTEN GRAPHICS 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.
+ *
+ **************************************************************************/
+'''
+
+
+import sys
+
+
+UNSIGNED, SIGNED, FIXED, FLOAT = 'u', 's', 'h', 'f'
+
+
+class Type:
+    
+    def __init__(self, kind, norm, size):
+        self.kind = kind
+        self.norm = norm
+        self.size = size
+
+    def __str__(self):
+        s = str(self.kind)
+        if norm:
+            s += 'n'
+        s += str(self.size)
+        return s
+
+
+SCALED, NORM, SRGB = 'scaled', 'norm', 'srgb'
+
+
+class Format:
+
+    def __init__(self, name, layout, block_width, block_height, in_types, out_swizzle, colorspace):
+        self.name = name
+        self.layout = layout
+        self.block_width = block_width
+        self.block_height = block_height
+        self.in_types = in_types
+        self.out_swizzle = out_swizzle
+        self.name = name
+        self.colorspace = colorspace
+
+    def __str__(self):
+        return self.name
+
+    def block_size(self):
+        size = 0
+        for type in self.in_types:
+            size += type.size
+        return size
+
+
+def parse(filename):
+    stream = open(filename)
+    formats = []
+    for line in stream:
+        line = line.rstrip()
+        fields = [field.strip() for field in line.split(',')]
+        name = fields[0]
+        layout = fields[1]
+        block_width, block_height = map(int, fields[2:4])
+        in_types = []
+        for field in fields[4:8]:
+            if field:
+                kind = field[0]
+                if field[1] == 'n':
+                    norm = True
+                    size = int(field[2:])
+                else:
+                    norm = False
+                    size = int(field[1:])
+            else:
+                kind = ''
+                norm = False
+                size = 0
+            in_type = Type(kind, norm, size)
+            in_types.append(in_type)
+        out_swizzle = fields[8]
+        colorspace = fields[9]
+        formats.append(Format(name, layout, block_width, block_height, in_types, out_swizzle, colorspace))
+    return formats
+
+
+def layout_map(layout):
+    return 'UTIL_FORMAT_LAYOUT_' + str(layout).upper()
+
+
+layout_channels_map = {
+    'rgba': 'rgba',
+    'zs': 'zs',
+    'yuv': ['y1', 'y2', 'u', 'v'],
+    'dxt': []
+}
+
+
+kind_map = {
+    '': "UTIL_FORMAT_TYPE_VOID",
+    'x': "UTIL_FORMAT_TYPE_VOID",
+    UNSIGNED: "UTIL_FORMAT_TYPE_UNSIGNED",
+    SIGNED: "UTIL_FORMAT_TYPE_SIGNED",
+    FIXED: "UTIL_FORMAT_TYPE_FIXED",
+    FLOAT: "UTIL_FORMAT_TYPE_FLOAT",
+}
+
+
+def bool_map(value):
+    if value:
+        return "TRUE"
+    else:
+        return "FALSE"
+
+
+swizzle_map = {
+    'x': "UTIL_FORMAT_SWIZZLE_X",
+    'y': "UTIL_FORMAT_SWIZZLE_Y",
+    'z': "UTIL_FORMAT_SWIZZLE_Z",
+    'w': "UTIL_FORMAT_SWIZZLE_W",
+    '0': "UTIL_FORMAT_SWIZZLE_0",
+    '1': "UTIL_FORMAT_SWIZZLE_1",
+    '_': "UTIL_FORMAT_SWIZZLE_NONE",
+}
+
+
+def write_format_table(formats):
+    print '/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */'
+    print
+    # This will print the copyright message on the top of this file
+    print __doc__.strip()
+    print
+    print '#include "u_format.h"'
+    print
+    print 'const struct util_format_description'
+    print 'util_format_description_table[] = '
+    print "{"
+    for format in formats:
+        print "   {"
+        print "      %s," % (format.name,)
+        print "      \"%s\"," % (format.name,)
+        print "      {%u, %u, %u}, /* block */" % (format.block_width, format.block_height, format.block_size())
+        print "      %s," % (layout_map(format.layout),)
+        print "      {"
+        for i in range(4):
+            type = format.in_types[i]
+            if i < 3:
+                sep = ","
+            else:
+                sep = ""
+            print "         {%s, %s, %u}%s /* %s */" % (kind_map[type.kind], bool_map(type.norm), type.size, sep, "xyzw"[i])
+        print "      },"
+        print "      {"
+        for i in range(4):
+            swizzle = format.out_swizzle[i]
+            if i < 3:
+                sep = ","
+            else:
+                sep = ""
+            try:
+                comment = layout_channels_map[format.layout][i]
+            except:
+                comment = 'ignored'
+            print "         %s%s /* %s */" % (swizzle_map[swizzle], sep, comment)
+        print "      },"
+        print "      UTIL_FORMAT_COLORSPACE_RGB,"
+        print "   },"
+    print "   {"
+    print "      PIPE_FORMAT_NONE,"
+    print "      \"PIPE_FORMAT_NONE\","
+    print "      {0, 0, 0},"
+    print "      0,"
+    print "      {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},"
+    print "      {0, 0, 0, 0},"
+    print "      0"
+    print "   },"
+    print "};"
+
+
+def main():
+
+    formats = []
+    for arg in sys.argv[1:]:
+        formats.extend(parse(arg))
+    write_format_table(formats)
+
+
+if __name__ == '__main__':
+    main()
------------------------------------------------------------------------------
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to