#!/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 in ('rgtc', 'latc'):
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}, {3},'.format(fmat.block_width, fmat.block_height,
fmat.block_depth,
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 '};'