mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-11 01:57:00 +00:00
bug 900199 - Add OpenGL registry xml parser to generate constants - step 1 - r=bjacob,jgilbert,jrmuizel
This commit is contained in:
parent
f699a136d1
commit
1bba968bef
212
gfx/gl/GLParseRegistryXML.py
Executable file
212
gfx/gl/GLParseRegistryXML.py
Executable file
@ -0,0 +1,212 @@
|
||||
#!/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/. */',
|
||||
'',
|
||||
'#if !defined(GLCONSTS_H_)',
|
||||
'#define GLCONSTS_H_',
|
||||
'',
|
||||
'/**',
|
||||
' * GENERATED FILE, DO NOT MODIFY DIRECTLY.',
|
||||
' * THIS IS A GENERATED FILE DIRECTLY FROM THE OFFCIAL OPENGL REGISTRY',
|
||||
' * XML AVAILABLE AT http://www.opengl.org/registry/#specfiles.',
|
||||
' *',
|
||||
' * To generate this file, see tutorial in GLParseRegistry.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 = max(60 - len(define), 0)
|
||||
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')
|
Loading…
x
Reference in New Issue
Block a user