1#
2# Copyright 2014 Intel Corporation
3#
4# Permission is hereby granted, free of charge, to any person obtaining a
5# copy of this software and associated documentation files (the
6# "Software"), to deal in the Software without restriction, including
7# without limitation the rights to use, copy, modify, merge, publish,
8# distribute, sub license, and/or sell copies of the Software, and to
9# permit persons to whom the Software is furnished to do so, subject to
10# the following conditions:
11#
12# The above copyright notice and this permission notice (including the
13# next paragraph) shall be included in all copies or substantial portions
14# of the Software.
15#
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19# IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
20# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
24import format_parser as parser
25import sys
26
27def get_gl_base_format(fmat):
28   if fmat.name == 'MESA_FORMAT_NONE':
29      return 'GL_NONE'
30   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']:
31      return 'GL_YCBCR_MESA'
32   elif fmat.has_channel('r'):
33      if fmat.has_channel('g'):
34         if fmat.has_channel('b'):
35            if fmat.has_channel('a'):
36               return 'GL_RGBA'
37            else:
38               return 'GL_RGB'
39         else:
40            return 'GL_RG'
41      else:
42         return 'GL_RED'
43   elif fmat.has_channel('l'):
44      if fmat.has_channel('a'):
45         return 'GL_LUMINANCE_ALPHA'
46      else:
47         return 'GL_LUMINANCE'
48   elif fmat.has_channel('a') and fmat.num_channels() == 1:
49      return 'GL_ALPHA'
50   elif fmat.has_channel('z'):
51      if fmat.has_channel('s'):
52         return 'GL_DEPTH_STENCIL'
53      else:
54         return 'GL_DEPTH_COMPONENT'
55   elif fmat.has_channel('s'):
56      return 'GL_STENCIL_INDEX'
57   elif fmat.has_channel('i') and fmat.num_channels() == 1:
58      return 'GL_INTENSITY'
59   else:
60      sys.exit("error, could not determine base format for {0}, check swizzle".format(fmat.name));
61
62def get_gl_data_type(fmat):
63   if fmat.is_compressed():
64      if 'FLOAT' in fmat.name:
65         return 'GL_FLOAT'
66      elif 'SIGNED' in fmat.name or 'SNORM' in fmat.name:
67         return 'GL_SIGNED_NORMALIZED'
68      else:
69         return 'GL_UNSIGNED_NORMALIZED'
70   elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV']:
71      return 'GL_UNSIGNED_NORMALIZED'
72
73   channel = None
74   for chan in fmat.channels:
75      if chan.type == 'x' and len(fmat.channels) > 1:
76         continue # We can do better
77      elif chan.name == 's' and fmat.has_channel('z'):
78         continue # We'll use the type from the depth instead
79
80      channel = chan
81      break;
82
83   if channel.type == parser.UNSIGNED:
84      if channel.norm:
85         return 'GL_UNSIGNED_NORMALIZED'
86      else:
87         return 'GL_UNSIGNED_INT'
88   elif channel.type == parser.SIGNED:
89      if channel.norm:
90         return 'GL_SIGNED_NORMALIZED'
91      else:
92         return 'GL_INT'
93   elif channel.type == parser.FLOAT:
94      return 'GL_FLOAT'
95   elif channel.type == parser.VOID:
96      return 'GL_NONE'
97   else:
98      assert False
99
100def get_channel_bits(fmat, chan_name):
101   if fmat.is_compressed():
102      # These values are pretty-much bogus, but OpenGL requires that we
103      # return an "approximate" number of bits.
104      if fmat.layout == 's3tc':
105         return 4 if fmat.has_channel(chan_name) else 0
106      elif fmat.layout == 'fxt1':
107         if chan_name in 'rgb':
108            return 4
109         elif chan_name == 'a':
110            return 1 if fmat.has_channel('a') else 0
111         else:
112            return 0
113      elif fmat.layout in ('rgtc', 'latc'):
114         return 8 if fmat.has_channel(chan_name) else 0
115      elif fmat.layout in ('etc1', 'etc2'):
116         if fmat.name.endswith('_ALPHA1') and chan_name == 'a':
117            return 1
118
119         bits = 11 if fmat.name.endswith('11_EAC') else 8
120         return bits if fmat.has_channel(chan_name) else 0
121      elif fmat.layout == 'bptc':
122         bits = 16 if fmat.name.endswith('_FLOAT') else 8
123         return bits if fmat.has_channel(chan_name) else 0
124      elif fmat.layout == 'astc':
125         bits = 16 if 'RGBA' in fmat.name else 8
126         return bits if fmat.has_channel(chan_name) else 0
127      elif fmat.layout == 'atc':
128         return 8 if fmat.has_channel(chan_name) else 0
129      elif fmat.layout == 'other' and ('RG_RB' in fmat.name or 'GR_BR' in fmat.name):
130         return 8 if fmat.has_channel(chan_name) else 0
131      else:
132         assert False
133   else:
134      # Uncompressed textures
135      for chan in fmat.channels:
136         if chan.name == chan_name:
137            return chan.size
138      return 0
139
140formats = parser.parse(sys.argv[1])
141
142print('''
143/*
144 * Mesa 3-D graphics library
145 *
146 * Copyright (c) 2014 Intel Corporation
147 *
148 * Permission is hereby granted, free of charge, to any person obtaining a
149 * copy of this software and associated documentation files (the "Software"),
150 * to deal in the Software without restriction, including without limitation
151 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
152 * and/or sell copies of the Software, and to permit persons to whom the
153 * Software is furnished to do so, subject to the following conditions:
154 *
155 * The above copyright notice and this permission notice shall be included
156 * in all copies or substantial portions of the Software.
157 *
158 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
159 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
160 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
161 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
162 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
163 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
164 * OTHER DEALINGS IN THE SOFTWARE.
165 */
166
167 /*
168  * This file is AUTOGENERATED by format_info.py.  Do not edit it
169  * manually or commit it into version control.
170  */
171
172static const struct mesa_format_info format_info[MESA_FORMAT_COUNT] =
173{
174''')
175
176def format_channel_bits(fmat, tuple_list):
177   return ['.%s = %s' % (field, str(get_channel_bits(fmat, name))) for (field, name) in tuple_list]
178
179bf_map = {
180   "GL_DEPTH_COMPONENT" : "MESA_ARRAY_FORMAT_BASE_FORMAT_DEPTH",
181   "GL_STENCIL_INDEX" : "MESA_ARRAY_FORMAT_BASE_FORMAT_STENCIL",
182}
183
184for fmat in formats:
185   print('   [{0}] = {{'.format(fmat.name))
186   print('      .Name = {0},'.format(fmat.name))
187   print('      .StrName = "{0}",'.format(fmat.name))
188   print('      .Layout = {0},'.format('MESA_FORMAT_LAYOUT_' + fmat.layout.upper()))
189   print('      .BaseFormat = {0},'.format(get_gl_base_format(fmat)))
190   print('      .DataType = {0},'.format(get_gl_data_type(fmat)))
191
192   bits = [('RedBits', 'r'), ('GreenBits', 'g'), ('BlueBits', 'b'), ('AlphaBits', 'a')]
193   print('      {0},'.format(', '.join(format_channel_bits(fmat, bits))))
194   bits = [('LuminanceBits', 'l'), ('IntensityBits', 'i'), ('DepthBits', 'z'), ('StencilBits', 's')]
195   print('      {0},'.format(', '.join(format_channel_bits(fmat, bits))))
196
197   print('      .IsSRGBFormat = {0:d},'.format(fmat.colorspace == 'srgb'))
198
199   print('      .BlockWidth = {0}, .BlockHeight = {1}, .BlockDepth = {2},'.format(fmat.block_width, fmat.block_height, fmat.block_depth))
200   print('      .BytesPerBlock = {0},'.format(int(fmat.block_size() / 8)))
201
202   print('      .Swizzle = {{ {0} }},'.format(', '.join(map(str, fmat.swizzle))))
203   if fmat.is_array():
204      chan = fmat.array_element()
205      norm = chan.norm or chan.type == parser.FLOAT
206      print('      .ArrayFormat = MESA_ARRAY_FORMAT({0}),'.format(', '.join([
207         bf_map.get(get_gl_base_format(fmat), "MESA_ARRAY_FORMAT_BASE_FORMAT_RGBA_VARIANTS"),
208         str(chan.size // 8),
209         str(int(chan.sign)),
210         str(int(chan.type == parser.FLOAT)),
211         str(int(norm)),
212         str(len(fmat.channels)),
213         str(fmat.swizzle[0]),
214         str(fmat.swizzle[1]),
215         str(fmat.swizzle[2]),
216         str(fmat.swizzle[3]),
217      ])))
218   else:
219      print('      .ArrayFormat = 0,')
220   print('   },')
221
222print('};')
223