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