import os,re,sys
from generator import *
class ExtensionMetaDocGeneratorOptions(GeneratorOptions):
def __init__(self,
filename = None,
directory = '.',
apiname = None,
profile = None,
versions = '.*',
emitversions = '.*',
defaultExtensions = None,
addExtensions = None,
removeExtensions = None,
sortProcedure = regSortFeatures):
GeneratorOptions.__init__(self, filename, directory, apiname, profile,
versions, emitversions, defaultExtensions,
addExtensions, removeExtensions, sortProcedure)
class ExtensionMetaDocOutputGenerator(OutputGenerator):
def __init__(self,
errFile = sys.stderr,
warnFile = sys.stderr,
diagFile = sys.stdout):
OutputGenerator.__init__(self, errFile, warnFile, diagFile)
def beginFile(self, genOpts):
OutputGenerator.beginFile(self, genOpts)
def endFile(self):
OutputGenerator.endFile(self)
def beginFeature(self, interface, emit):
OutputGenerator.beginFeature(self, interface, emit)
name = interface.get('name')
if interface.tag != 'extension':
self.logMsg('diag',
'beginFeature: ignoring non-extension feature',
name)
return
number = self.getAttrib(interface, 'number', 'UNKNOWN')
type = self.getAttrib(interface, 'type', None)
requires = self.getAttrib(interface, 'requires', None)
contact = self.getAttrib(interface, 'contact', 'UNKNOWN')
revision = self.getSpecVersion(interface, name, 'UNKNOWN')
directory = self.genOpts.directory
self.makeDir(directory)
filename = directory + '/' + name + '.txt'
self.logMsg('diag', '# Generating include file:', filename)
fp = open(filename, 'w', encoding='utf-8')
write('// WARNING: DO NOT MODIFY! This file is automatically generated from the vk.xml registry', file=fp)
write('[[' + name + ']]', file=fp)
write('== ' + name, file=fp)
write('', file=fp)
write('*Name String*::', file=fp)
write(' `' + name + '`', file=fp)
write('*Extension Type*::', file=fp)
if type == 'instance':
write(' Instance extension', file=fp)
elif type == 'device':
write(' Device extension', file=fp)
elif type != None:
write(' UNRECOGNIZED extension type: ' + type, file=fp)
else:
self.logMsg('warn',
'ExtensionMetaInformation::beginFeature:',
'required type attribute missing for extension',
name)
write(' UNKNOWN extension type (*this should never happen*)', file=fp)
write('*Registered Extension Number*::', file=fp)
write(' ' + number, file=fp)
write('*Revision*::', file=fp)
write(' ' + revision, file=fp)
write('*Extension and Version Dependencies*::', file=fp)
write(' - Requires Vulkan 1.0', file=fp)
if requires != None:
for dep in requires.split(','):
write(' - Requires `<<' + dep + '>>`', file=fp)
write('*Contact*::', file=fp)
write(' - ' + contact, file=fp)
fp.close()
def endFeature(self):
OutputGenerator.endFeature(self)
def getAttrib(self, elem, attribute, default=None):
if attribute in elem.keys():
return elem.get(attribute)
else:
return default
def getSpecVersion(self, elem, extname, default=None):
enumName = extname.upper() + '_SPEC_VERSION'
specVersion = 'UNKNOWN'
for enum in elem.findall('.//enum'):
thisName = enum.get('name')
thisValue = self.getAttrib(enum, 'value', 'UNKNOWN')
if thisName == enumName:
specVersion = thisValue
break
elif thisName[-13:] == '_SPEC_VERSION':
self.logMsg('diag',
'Potential name mismatch between extension',
extname, 'and version token', thisName)
specVersion = thisValue
if specVersion == 'UNKNOWN':
print('UNKNOWN SPEC_VERSION for', extname)
return specVersion