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