diff options
Diffstat (limited to 'xc/extras/Mesa/bin/gltable.py')
-rwxr-xr-x | xc/extras/Mesa/bin/gltable.py | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/xc/extras/Mesa/bin/gltable.py b/xc/extras/Mesa/bin/gltable.py new file mode 100755 index 000000000..7e52c765c --- /dev/null +++ b/xc/extras/Mesa/bin/gltable.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python + +# $Id: gltable.py,v 1.1 2000/12/05 16:38:39 dawes Exp $ + +# Mesa 3-D graphics library +# Version: 3.3 +# +# Copyright (C) 1999-2000 Brian Paul 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, 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 +# BRIAN PAUL 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. + + +# Generate the glapitable.h file. +# +# Usage: +# gltable.py >glapitable.h +# +# Dependencies: +# The gl.spec file from the SI must be in the current directory. +# +# Brian Paul 3 February 2000 + + +import string +import re + + +# +# This table maps types from the gl.spec file to the OpenGL C types. +# +TypeTable = { + 'AttribMask' : 'GLbitfield', + 'Boolean' : 'GLboolean', + 'CheckedFloat32' : 'GLfloat', + 'CheckedInt32' : 'GLint', + 'ClampedColorF' : 'GLclampf', + 'ClampedFloat32' : 'GLclampf', + 'ClampedFloat64' : 'GLclampd', + 'ClampedStencilValue' : 'GLint', + 'ClearBufferMask' : 'GLbitfield', + 'ClientAttribMask' : 'GLbitfield', + 'ColorB' : 'GLbyte', + 'ColorD' : 'GLdouble', + 'ColorF' : 'GLfloat', + 'ColorI' : 'GLint', + 'ColorIndexValueD' : 'GLdouble', + 'ColorIndexValueF' : 'GLfloat', + 'ColorIndexValueI' : 'GLint', + 'ColorIndexValueS' : 'GLshort', + 'ColorIndexValueUB' : 'GLubyte', + 'ColorS' : 'GLshort', + 'ColorUB' : 'GLubyte', + 'ColorUI' : 'GLuint', + 'ColorUS' : 'GLushort', + 'CoordF' : 'GLfloat', + 'CoordD' : 'GLdouble', + 'CoordI' : 'GLint', + 'CoordS' : 'GLshort', + 'FeedbackElement' : 'GLfloat', + 'Float32' : 'GLfloat', + 'Float64' : 'GLdouble', + 'Float32Pointer' : 'GLfloat', + 'Float64Pointer' : 'GLdouble', + 'Int8' : 'GLbyte', + 'Int16' : 'GLshort', + 'Int32' : 'GLint', + 'LineStipple' : 'GLushort', + 'List' : 'GLuint', + 'MaskedColorIndexValueF' : 'GLfloat', + 'MaskedColorIndexValueI' : 'GLuint', + 'MaskedStencilValue' : 'GLuint', + 'PixelInternalFormat' : 'GLenum', + 'SelectName' : 'GLuint', + 'SizeI' : 'GLsizei', + 'StencilValue' : 'GLint', + 'String' : 'const GLubyte *', + 'TexelInternalFormat' : 'GLint', + 'TextureComponentCount' : 'GLint', + 'WinCoord' : 'GLint', + 'UInt8' : 'GLubyte', + 'UInt16' : 'GLushort', + 'UInt32' : 'GLuint', + 'Void' : 'GLvoid', + 'VoidPointer' : 'GLvoid *', + 'void' : 'void', +} + + + +# +# Return C-style argument type string. +# Input: t = a type like ListMode, Int16, CoordF, etc. +# pointerQual = '' or '*' +# constQual = '' or 'const ' +# Return: a string like "const GLubyte *' +# +def ActualType(t, pointerQual, constQual): + if TypeTable.has_key(t): + type = TypeTable[t] + else: + type = 'GLenum' + if pointerQual == '': + s = constQual + type + else: + s = constQual + type + ' ' + pointerQual + return s +#enddef + + + +# +# Convert a Python list of arguments into a string. +# +def ArgListToString(argList): + result = '' + i = 1 + n = len(argList) + for pair in argList: + result = result + pair[0] + ' ' + pair[1] + if i < n: + result = result + ', ' + i = i + 1 + + if result == '': + result = 'void' + return result +#enddef + + +# +# Return a dispatch table entry, like "void (*Enable)(GLenum cap);" +# +def MakeTableEntry(retType, funcName, argList, offset): + s = ' ' + s = s + ActualType(retType, '', '') + s = s + ' (*' + s = s + funcName + s = s + ')(' + s = s + ArgListToString(argList) + s = s + '); /* ' + s = s + str(offset) + s = s + ' */' + return s +#enddef + + + +def GroupFromCategory(category): + baseCats = [ + 'display-list', + 'drawing', + 'drawing-control', + 'feedback', + 'framebuf', + 'misc', + 'modeling', + 'pixel-op', + 'pixel-rw', + 'state-req', + 'xform' + ] + + if baseCats.count(category) > 0: + return 'GL_1_0' + else: + return 'GL_' + category + #endif +#endif + + +def PrintGroup(group): + s = ' /* ' + s = s + group + s = s + ' */' + print s +#enddef + + + +# +# Parse gl.spec to generate all the function pointers in the dispatch struct. +# +def PrintTableEntries(): + functionPattern = re.compile('^[a-zA-Z0-9]+\(') + functionNamePattern = re.compile('^[a-zA-Z0-9]+') + + prevGroup = '' + funcName = '' + returnType = '' + argList = [ ] + maxOffset = 0 + table = { } + + f = open('gl.spec') + for line in f.readlines(): + + m = functionPattern.match(line) + if m: + # extract funcName + n = functionNamePattern.findall(line) + funcName = n[0] + argList = [ ] + #endif + + m = string.split(line) + if len(m) > 1: + # return datatype + if m[0] == 'return': + returnType = m[1] + #endif + + # function parameter + if m[0] == 'param': + constQual = '' + pointerQual = '' + if len(m) >= 5 and m[4] == 'array': + pointerQual = '*' + if m[3] == 'in': + constQual = 'const ' + paramName = m[1] + paramType = ActualType(m[2], pointerQual, constQual) + + argList.append( (paramType, paramName) ) + #endif + +# # category + if m[0] == 'category': + category = m[1] + group = GroupFromCategory(category) + if group != prevGroup: +# PrintGroup(group) + prevGroup = group + #endif + + # end of function spec + if m[0] == 'offset': + if m[1] == '?': + #print 'WARNING: skipping', funcName + noop = 0 + else: + funcOffset = int(m[1]) + if funcOffset > maxOffset: + maxOffset = funcOffset + #PrintProto(returnType, funcName, argList) + s = MakeTableEntry(returnType, funcName, argList, funcOffset) +# print s + table[funcOffset] = s; + #endif + #endif + #endif + #endfor + + # Now dump the table, this effectively does the sort by offset number + for i in range(0, maxOffset + 1): + if table.has_key(i): + print table[i] + +#enddef + + + +def PrintHead(): + print '/* DO NOT EDIT - This file generated automatically with gltable.py script */' + print '#ifndef _GLAPI_TABLE_H_' + print '#define _GLAPI_TABLE_H_' + print '' + print '#include <GL/gl.h>' + print '' + print 'struct _glapi_table' + print '{' + return +#endif + + +def PrintTail(): + print '};' + print '' + print '#endif' +#endif + + + +PrintHead() +PrintTableEntries() +PrintTail()
\ No newline at end of file |