regal/scripts/api/ApiWrite.py
Nigel Stewart 20b5c5379d Extend RegalPlugin to provide name based lookup.
Regal.h touch-ups for harmonizing with apitrace.
API database support for maps of per-platform types.
2013-07-06 00:17:05 -05:00

249 lines
8.3 KiB
Python

#!/usr/bin/python
from copy import deepcopy
def cmpCategory(a,b):
if a[0].category.startswith('GL_VERSION') and b[0].category.startswith('GL_VERSION'): return cmp(a[0].category,b[0].category)
if a[0].category.startswith('GL_VERSION'): return -1
if b[0].category.startswith('GL_VERSION'): return 1
return cmp(a[0].category,b[0].category)
# Write out header
def writeHeader(file,name):
print >>file, '''import Api
from Api import Api
from Api import Function, Typedef, Enum
from Api import Return, Parameter, Input, Output, InputOutput
from Api import Enumerant
from Api import Extension
from Api import StateType, State'''
print >>file, '''
%s = Api()
'''%(name)
# Write out typedef container
def writeTypedefs(file,name,typedefs):
for j in typedefs:
if isinstance(j.type, str) or isinstance(j.type, unicode):
print >>file, '%s = Typedef(\'%s\',\'%s\')'%(j.name,j.name,j.type)
else:
print >>file, '%s = Typedef(\'%s\',%s)'%(j.name,j.name,j.type)
if getattr(j,'category') != None and len(j.category):
print >>file, '%s.category = \'%s\''%(j.name,j.category)
if getattr(j,'default',None) != None:
print >>file, '%s.default = \'%s\''%(j.name,j.default)
if getattr(j,'regal',None) != None:
print >>file, '%s.regal = %s'%(j.name,j.regal)
print >>file, ''
for j in typedefs:
print >>file, '%s.add(%s)'%(name,j.name)
print >>file, ''
# Write out enumerants container
def writeEnums(file,name,enums):
for i in enums:
if not i.name=='defines':
print >>file, '''
%s = Enum('%s')
%s.add(%s)
'''%(i.name,i.name,name,i.name)
for j in i.enumerants:
print >>file, '%s = Enumerant(\'%s\','%(j.name,j.name),
value = j.value
try:
value = long(value,base=0)
except:
pass
if isinstance(value, str) or isinstance(value, unicode):
print >>file, '\'%s\','%(value),
else:
print >>file, '0x%04x,'%(value),
print >>file, ')'
for j in i.enumerants:
print >>file, '%s.add(%s)'%(i.name,j.name)
enumerants = {}
for i in enums:
if i.name=='defines':
for j in i.enumerants:
if not j.category in enumerants:
enumerants[j.category] = []
enumerants[j.category].append(j)
enumerants = sorted( [ sorted( enumerants[i], key = lambda k : k.name) for i in enumerants.keys() ], cmp=cmpCategory )
print >>file, '''
defines = Enum('defines')
%s.add(defines)
'''%(name)
for i in enumerants:
if len(i[0].category):
print >>file, '# %s'%i[0].category
else:
print >>file, '#'
print >>file, ''
for j in i:
print >>file, '%s = Enumerant(\'%s\','%(j.name,j.name),
value = j.value
try:
value = long(value,base=0)
except:
pass
if isinstance(value, str) or isinstance(value, unicode):
print >>file, '\'%s\','%(value),
else:
print >>file, '0x%04x,'%(value),
print >>file, '\'%s\')'%(j.category)
# if len(j.extension):
# print >>file, '%s.extension = \'%s\''%(j.name,j.extension)
if getattr(j,'esVersions',None) != None:
print >>file, '%s.esVersions = %s'%(j.name,j.esVersions)
if getattr(j,'enableCap',None) != None:
print >>file, '%s.enableCap = %s'%(j.name,j.enableCap)
if getattr(j,'bindTexture',None) != None:
print >>file, '%s.bindTexture = %s'%(j.name,j.bindTexture)
if getattr(j,'texImage',None) != None:
print >>file, '%s.texImage = %s'%(j.name,j.texImage)
if getattr(j,'internalformat',None) != None:
print >>file, '%s.internalformat = %s'%(j.name,j.internalformat)
if getattr(j,'gluErrorString',None) != None:
print >>file, '%s.gluErrorString = \'%s\''%(j.name,j.gluErrorString)
print >>file, ''
for j in i:
print >>file, 'defines.add(%s)'%(j.name)
print >>file, ''
# Write out functions container
def writeFunctions(file,name,functions):
f = {}
for i in functions:
if not i.category in f:
f[i.category] = []
f[i.category].append(i)
f = sorted( [ sorted( f[i], key = lambda k : k.name) for i in f.keys() ], cmp=cmpCategory )
for i in f:
if len(i[0].category):
print >>file, '# %s'%i[0].category
else:
print >>file, '#'
print >>file, ''
for j in i:
print >>file, '%s = Function(\'%s\')'%(j.name,j.name)
print >>file, '%s.ret = Return(\'%s\')'%(j.name,j.ret.type)
if getattr(j.ret,'cast',None) != None:
print >>file, '%s.ret.cast = \'%s\''%(j.name,j.ret.cast)
for k in j.parameters:
print >>file, '%s.add('%(j.name),
if k.input:
print >>file, 'Input(',
else:
print >>file, 'Output(',
print >>file, '\'%s\',\'%s\''%(k.name,k.type),
if getattr(k,'size') != None:
if isinstance(k.size, str) or isinstance(k.size, unicode):
print >>file, ',size = \'%s\''%(k.size),
else:
print >>file, ',size = %s'%(k.size),
if getattr(k,'maxSize') != None:
if isinstance(k.maxSize, str) or isinstance(k.maxSize, unicode):
print >>file, ',maxSize = \'%s\''%(k.maxSize),
else:
print >>file, ',maxSize = %s'%(k.maxSize),
if getattr(k,'cast',None) != None:
print >>file, ',cast = \'%s\''%(k.cast),
if getattr(k,'regalLog',None) != None:
print >>file, ',regalLog = \'%s\''%(k.regalLog),
print >>file, '))'
print >>file, '%s.version = \'%s\''%(j.name,j.version)
print >>file, '%s.category = \'%s\''%(j.name,j.category)
# if len(j.extension):
# print >>file, '%s.extension = \'%s\''%(j.name,j.extension)
# if getattr(j,'gles',None) != None:
# print >>file, '%s.gles = \'%s\''%(j.name,j.gles)
if getattr(j,'esVersions',None) != None:
print >>file, '%s.esVersions = %s'%(j.name,j.esVersions)
if getattr(j,'regal',None) != None:
print >>file, '%s.regal = %s'%(j.name,j.regal)
if getattr(j,'regalOnly',None) != None:
print >>file, '%s.regalOnly = %s'%(j.name,j.regalOnly)
if getattr(j,'regalRemap',None) != None:
if isinstance(j.regalRemap, str) or isinstance(j.regalRemap, unicode):
print >>file, '%s.regalRemap = \'%s\''%(j.name,j.regalRemap)
else:
print >>file, '%s.regalRemap = %s'%(j.name,j.regalRemap)
if getattr(j,'trace',None) != None:
print >>file, '%s.trace = %s'%(j.name,j.trace)
if getattr(j,'play',None) != None:
print >>file, '%s.play = %s'%(j.name,j.play)
print >>file, '%s.add(%s)'%(name,j.name)
print >>file, ''
# Write out extensions container
def writeExtensions(file,name,extensions):
f = deepcopy(extensions)
f = sorted(f,key = lambda k : k.name)
for i in f:
print >>file, '%s = Extension(\'%s\')'%(i.name,i.name)
if len(i.url):
print >>file, '%s.url = \'%s\''%(i.name,i.url)
if getattr(i,'category') != None and len(i.category):
print >>file, '%s.category = \'%s\''%(i.name,i.category)
if len(i.enumerants):
print >>file, '%s.enumerants = [\'%s\']'%(i.name,'\',\''.join(i.enumerants))
if len(i.functions):
print >>file, '%s.functions = [\'%s\']'%(i.name,'\',\''.join(i.functions))
if len(i.emulatedBy):
print >>file, '%s.emulatedBy = \'%s\''%(i.name,i.emulatedBy)
if len(i.emulatedIf):
print >>file, '%s.emulatedIf = \'%s\''%(i.name,i.emulatedIf)
print >>file, '%s.add(%s)'%(name,i.name)
print >>file, ''
# Write out state values
def writeStates(file, name, stateTypes, states):
if len(stateTypes):
print >>file, '# state types'
print >>file, ''
for s in stateTypes:
if len(s.name):
print >>file, '%s = StateType(\'%s\', \'%s\', \'%s\')'%(s.name,s.name,s.code,s.explanation)
print >>file, ''
for s in stateTypes:
if len(s.name):
print >>file, 'gl.add(%s)'%(s.name)
if len(states):
print >>file, ''
print >>file, '# states'
print >>file, ''
for s in states:
if len(s.getValue):
print >>file, '%s = State(\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\')'%( s.getValue, s.getValue, s.type, s.getCommand, s.initialValue, s.description, s.section, s.attribute)
print >>file, ''
for s in states:
if len(s.getValue):
print >>file, 'gl.add(%s)'%(s.getValue)