#!/usr/bin/env python # # Copyright 2014 Intel Corporation # # 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. import format_parser as parser import sys def get_gl_base_format(fmat): if fmat.name == 'MESA_FORMAT_NONE': return 'GL_NONE' elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']: return 'GL_YCBCR_MESA' elif fmat.has_channel('r'): if fmat.has_channel('g'): if fmat.has_channel('b'): if fmat.has_channel('a'): return 'GL_RGBA' else: return 'GL_RGB' else: return 'GL_RG' else: return 'GL_RED' elif fmat.has_channel('l'): if fmat.has_channel('a'): return 'GL_LUMINANCE_ALPHA' else: return 'GL_LUMINANCE' elif fmat.has_channel('a') and fmat.num_channels() == 1: return 'GL_ALPHA' elif fmat.has_channel('z'): if fmat.has_channel('s'): return 'GL_DEPTH_STENCIL' else: return 'GL_DEPTH_COMPONENT' elif fmat.has_channel('s'): return 'GL_STENCIL_INDEX' elif fmat.has_channel('i') and fmat.num_channels() == 1: return 'GL_INTENSITY' else: sys.exit("error, could not determine base format for {0}, check swizzle".format(fmat.name)); def get_gl_data_type(fmat): if fmat.is_compressed(): if 'FLOAT' in fmat.name: return 'GL_FLOAT' elif 'SIGNED' in fmat.name or 'SNORM' in fmat.name: return 'GL_SIGNED_NORMALIZED' else: return 'GL_UNSIGNED_NORMALIZED' elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']: return 'GL_UNSIGNED_NORMALIZED' channel = None for chan in fmat.channels: if chan.type == 'x' and len(fmat.channels) > 1: continue # We can do better elif chan.name == 's' and fmat.has_channel('z'): continue # We'll use the type from the depth instead channel = chan break; if channel.type == parser.UNSIGNED: if channel.norm: return 'GL_UNSIGNED_NORMALIZED' else: return 'GL_UNSIGNED_INT' elif channel.type == parser.SIGNED: if channel.norm: return 'GL_SIGNED_NORMALIZED' else: return 'GL_INT' elif channel.type == parser.FLOAT: return 'GL_FLOAT' elif channel.type == parser.VOID: return 'GL_NONE' else: assert False def get_channel_bits(fmat, chan_name): if fmat.is_compressed(): # These values are pretty-much bogus, but OpenGL requires that we # return an "approximate" number of bits. if fmat.layout == 's3tc': return 4 if fmat.has_channel(chan_name) else 0 elif fmat.layout == 'fxt1': if chan_name in 'rgb': return 4 elif chan_name == 'a': return 1 if fmat.has_channel('a') else 0 else: return 0 elif fmat.layout == 'rgtc': return 8 if fmat.has_channel(chan_name) else 0 elif fmat.layout in ('etc1', 'etc2'): if fmat.name.endswith('_ALPHA1') and chan_name == 'a': return 1 bits = 11 if fmat.name.endswith('11_EAC') else 8 return bits if fmat.has_channel(chan_name) else 0 elif fmat.layout == 'bptc': bits = 16 if fmat.name.endswith('_FLOAT') else 8 return bits if fmat.has_channel(chan_name) else 0 elif fmat.layout == 'astc': bits = 16 if 'RGBA' in fmat.name else 8 return bits if fmat.has_channel(chan_name) else 0 else: assert False else: # Uncompressed textures for chan in fmat.channels: if chan.name == chan_name: return chan.size return 0 formats = parser.parse(sys.argv[1]) print ''' /* * Mesa 3-D graphics library * * Copyright (c) 2014 Intel Corporation * * 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, sublicense, * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS 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. */ /* * This file is AUTOGENERATED by format_info.py. Do not edit it * manually or commit it into version control. */ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = { ''' for fmat in formats: print ' {' print ' {0},'.format(fmat.name) print ' "{0}",'.format(fmat.name) print ' {0},'.format('MESA_FORMAT_LAYOUT_' + fmat.layout.upper()) print ' {0},'.format(get_gl_base_format(fmat)) print ' {0},'.format(get_gl_data_type(fmat)) bits = [ get_channel_bits(fmat, name) for name in ['r', 'g', 'b', 'a']] print ' {0},'.format(', '.join(map(str, bits))) bits = [ get_channel_bits(fmat, name) for name in ['l', 'i', 'z', 's']] print ' {0},'.format(', '.join(map(str, bits))) print ' {0:d},'.format(fmat.colorspace == 'srgb') print ' {0}, {1}, {2},'.format(fmat.block_width, fmat.block_height, int(fmat.block_size() / 8)) print ' {{ {0} }},'.format(', '.join(map(str, fmat.swizzle))) if fmat.is_array(): chan = fmat.array_element() norm = chan.norm or chan.type == parser.FLOAT print ' MESA_ARRAY_FORMAT({0}),'.format(', '.join([ str(chan.size / 8), str(int(chan.sign)), str(int(chan.type == parser.FLOAT)), str(int(norm)), str(len(fmat.channels)), str(fmat.swizzle[0]), str(fmat.swizzle[1]), str(fmat.swizzle[2]), str(fmat.swizzle[3]), ])) else: print ' 0,' print ' },' print '};'