summaryrefslogtreecommitdiffstats
path: root/gfx/gl/GLParseRegistryXML.py
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/gl/GLParseRegistryXML.py')
-rwxr-xr-xgfx/gl/GLParseRegistryXML.py216
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')