diff options
Diffstat (limited to 'gfx/gl/GLParseRegistryXML.py')
-rwxr-xr-x | gfx/gl/GLParseRegistryXML.py | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/gfx/gl/GLParseRegistryXML.py b/gfx/gl/GLParseRegistryXML.py new file mode 100755 index 000000000..60daca6e5 --- /dev/null +++ b/gfx/gl/GLParseRegistryXML.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python +# coding=utf8 + + +################################################################################ +# TUTORIAL +# This script will generate GLConsts.h +# +# Step 1: +# Download the last gl.xml, egl.xml, glx.xml and wgl.xml from +# http://www.opengl.org/registry/#specfiles into a directory of your choice +# +# Step 2: +# Execute this script ./GLParseRegistryXML.py [your dir containing XML files] +# +# Step 3: +# Do not add the downloaded XML in the patch +# +# Step 4: +# Enjoy =) +# +################################################################################ + +# includes +import os +import sys +import xml.etree.ElementTree + + +################################################################################ +# export management + +class GLConstHeader: + def __init__(self, f): + self.f = f + + + def write(self, arg): + if isinstance(arg, list): + self.f.write('\n'.join(arg) + '\n') + elif isinstance(arg, (int, long)): + self.f.write('\n' * arg) + else: + self.f.write(str(arg) + '\n') + + + def formatFileBegin(self): + self.write([ + '/* This Source Code Form is subject to the terms of the Mozilla Public', + ' * License, v. 2.0. If a copy of the MPL was not distributed with this', + ' * file, You can obtain one at http://mozilla.org/MPL/2.0/. */', + '', + '#ifndef GLCONSTS_H_', + '#define GLCONSTS_H_', + '', + '/**', + ' * GENERATED FILE, DO NOT MODIFY DIRECTLY.', + ' * This is a file generated directly from the official OpenGL registry', + ' * xml available http://www.opengl.org/registry/#specfiles.', + ' *', + ' * To generate this file, see tutorial in \'GLParseRegistryXML.py\'.', + ' */', + '' + ]) + + + def formatLibBegin(self, lib): + # lib would be 'GL', 'EGL', 'GLX' or 'WGL' + self.write('// ' + lib) + + + def formatLibConstant(self, lib, name, value): + # lib would be 'GL', 'EGL', 'GLX' or 'WGL' + # name is the name of the const (example: MAX_TEXTURE_SIZE) + # value is the value of the const (example: 0xABCD) + + define = '#define LOCAL_' + lib + '_' + name + whitespace = 60 - len(define) + + if whitespace < 0: + whitespace = whitespace % 8 + + self.write(define + ' ' * whitespace + ' ' + value) + + + def formatLibEnd(self, lib): + # lib would be 'GL', 'EGL', 'GLX' or 'WGL' + self.write(2) + + + def formatFileEnd(self): + self.write([ + '', + '#endif // GLCONSTS_H_' + ]) + + +################################################################################ +# underground code + +def getScriptDir(): + return os.path.dirname(__file__) + '/' + + +def getXMLDir(): + if len(sys.argv) == 1: + return './' + + dirPath = sys.argv[1] + if dirPath[-1] != '/': + dirPath += '/' + + return dirPath + + +class GLConst: + def __init__(self, lib, name, value, type): + self.lib = lib + self.name = name + self.value = value + self.type = type + + +class GLDatabase: + + LIBS = ['GL', 'EGL', 'GLX', 'WGL'] + + def __init__(self): + self.consts = {} + self.libs = set(GLDatabase.LIBS) + self.vendors = set(['EXT', 'ATI']) + # there is no vendor="EXT" and vendor="ATI" in gl.xml, + # so we manualy declare them + + + def loadXML(self, path): + xmlPath = getXMLDir() + path + + if not os.path.isfile(xmlPath): + print 'missing file "' + xmlPath + '"' + return False + + tree = xml.etree.ElementTree.parse(xmlPath) + root = tree.getroot() + + for enums in root.iter('enums'): + vendor = enums.get('vendor') + if not vendor: + # there some standart enums that do have the vendor attribute, + # so we fake them as ARB's enums + vendor = 'ARB' + + if vendor not in self.vendors: + # we map this new vendor in the vendors set. + self.vendors.add(vendor) + + namespaceType = enums.get('type') + + for enum in enums: + if enum.tag != 'enum': + # this is not an enum => we skip it + continue + + lib = enum.get('name').split('_')[0] + + if lib not in self.libs: + # unknown library => we skip it + continue + + name = enum.get('name')[len(lib) + 1:] + value = enum.get('value') + type = enum.get('type') + + if not type: + # if no type specified, we get the namespace's default type + type = namespaceType + + self.consts[lib + '_' + name] = GLConst(lib, name, value, type) + + return True + + + def exportConsts(self, path): + with open(getScriptDir() + path,'w') as f: + + headerFile = GLConstHeader(f) + headerFile.formatFileBegin() + + constNames = self.consts.keys() + constNames.sort() + + for lib in GLDatabase.LIBS: + headerFile.formatLibBegin(lib) + + for constName in constNames: + const = self.consts[constName] + + if const.lib != lib: + continue + + headerFile.formatLibConstant(lib, const.name, const.value) + + headerFile.formatLibEnd(lib) + + headerFile.formatFileEnd() + + +glDatabase = GLDatabase() + +success = glDatabase.loadXML('gl.xml') +success = success and glDatabase.loadXML('egl.xml') +success = success and glDatabase.loadXML('glx.xml') +success = success and glDatabase.loadXML('wgl.xml') + +if success: + glDatabase.exportConsts('GLConsts.h') |