scripts: Automate intercepts for parameter validation
Change-Id: Idcacab581775ce95cf11965b417b625df8e12176
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py
index 3a5c87a..48f4e2e 100644
--- a/scripts/parameter_validation_generator.py
+++ b/scripts/parameter_validation_generator.py
@@ -124,6 +124,8 @@
diagFile = sys.stdout):
OutputGenerator.__init__(self, errFile, warnFile, diagFile)
self.INDENT_SPACES = 4
+ self.intercepts = []
+ self.declarations = []
# Commands to ignore
self.blacklist = [
'vkGetInstanceProcAddr',
@@ -205,6 +207,15 @@
def endFile(self):
# C-specific
self.newline()
+
+ # Output declarations and record intercepted procedures
+ write('// Declarations', file=self.outFile)
+ write('\n'.join(self.declarations), file=self.outFile)
+ write('// Intercepts', file=self.outFile)
+ write('struct { const char* name; PFN_vkVoidFunction pFunc;} procmap[] = {', file=self.outFile)
+ write('\n'.join(self.intercepts), file=self.outFile)
+ write('};\n', file=self.outFile)
+ self.newline()
# Namespace
write('} // namespace parameter_validation', file = self.outFile)
# Finish C++ wrapper and multiple inclusion protection
@@ -400,6 +411,31 @@
# check code generation.
def genCmd(self, cmdinfo, name):
OutputGenerator.genCmd(self, cmdinfo, name)
+ interface_functions = [
+ 'vkEnumerateInstanceLayerProperties',
+ 'vkEnumerateInstanceExtensionProperties',
+ 'vkEnumerateDeviceLayerProperties',
+ # These are unimplemented in the PV layer -- need to be added.
+ 'vkDisplayPowerControlEXT',
+ 'vkGetSwapchainCounterEXT',
+ 'vkRegisterDeviceEventEXT',
+ 'vkRegisterDisplayEventEXT',
+ 'vkCmdDebugMarkerEndEXT',
+ 'vkCmdDrawIndexedIndirectCountAMD',
+ 'vkCmdDrawIndirectCountAMD',
+ ]
+ # Record that the function will be intercepted
+ if name not in interface_functions:
+ if (self.featureExtraProtect != None):
+ self.declarations += [ '#ifdef %s' % self.featureExtraProtect ]
+ self.intercepts += [ '#ifdef %s' % self.featureExtraProtect ]
+ self.intercepts += [ ' {"%s", reinterpret_cast<PFN_vkVoidFunction>(%s)},' % (name,name[2:]) ]
+ decls = self.makeCDecls(cmdinfo.elem)
+ # Strip off 'vk' from API name
+ self.declarations += [ '%s' % decls[0].replace("VKAPI_CALL vk", "VKAPI_CALL ") ]
+ if (self.featureExtraProtect != None):
+ self.intercepts += [ '#endif' ]
+ self.declarations += [ '#endif' ]
if name not in self.blacklist:
params = cmdinfo.elem.findall('param')
# Get list of array lengths