scripts: Automate intercepts for parameter validation
authorMark Lobodzinski <mark@lunarg.com>
Wed, 8 Feb 2017 21:37:15 +0000 (14:37 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Thu, 9 Feb 2017 15:01:35 +0000 (08:01 -0700)
Change-Id: Idcacab581775ce95cf11965b417b625df8e12176

scripts/parameter_validation_generator.py

index 3a5c87a..48f4e2e 100644 (file)
@@ -124,6 +124,8 @@ class ParamCheckerOutputGenerator(OutputGenerator):
                  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 @@ class ParamCheckerOutputGenerator(OutputGenerator):
     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 @@ class ParamCheckerOutputGenerator(OutputGenerator):
     # 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