scripts: PV codegen handle multiple requires

Modify parameter validation codegen to handle multiple require blocks in
an extension, each with additional extension dependencies.

Change-Id: I336569ca19808f3dca342eb65fd076599c4fb329
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py
index a7d973f..23a54f6 100644
--- a/scripts/parameter_validation_generator.py
+++ b/scripts/parameter_validation_generator.py
@@ -175,7 +175,7 @@
         self.flags = set()                                # Map of flags typenames
         self.flagBits = dict()                            # Map of flag bits typename to list of values
         self.newFlags = set()                             # Map of flags typenames /defined in the current feature/
-        self.required_extensions = []                     # List of required extensions for the current extension
+        self.required_extensions = dict()                 # Dictionary of required extensions for each item in the current extension
         self.extension_type = ''                          # Type of active feature (extension), device or instance
         self.extension_names = dict()                     # Dictionary of extension names to extension name defines
         self.valid_vuids = set()                          # Set of all valid VUIDs
@@ -345,19 +345,34 @@
         self.commands = []
         self.structMembers = []
         self.newFlags = set()
-        # Save list of required extensions for this extension
-        self.required_extensions = []
+
+        # Get base list of extension dependencies for all items in this extension
+        base_required_extensions = []
         if self.featureName != "VK_VERSION_1_0":
             # Save Name Define to get correct enable name later
             nameElem = interface[0][1]
             name = nameElem.get('name')
             self.extension_names[self.featureName] = name
             # This extension is the first dependency for this command
-            self.required_extensions.append(self.featureName)
-        # Add any defined extension dependencies to the dependency list for this command
-        required_extensions = interface.get('requires')
-        if required_extensions is not None:
-            self.required_extensions.extend(required_extensions.split(','))
+            base_required_extensions.append(self.featureName)
+        # Add any defined extension dependencies to the base dependency list for this extension
+        requires = interface.get('requires')
+        if requires is not None:
+            base_required_extensions.extend(requires.split(','))
+
+        # Build dictionary of extension dependencies for each item in this extension
+        self.required_extensions = dict()
+        for require_element in interface.findall('require'):
+            # Copy base extension dependency list
+            required_extensions = list(base_required_extensions)
+            # Add any additional extension dependencies specified in this require block
+            additional_extensions = require_element.get('extension')
+            if additional_extensions:
+                required_extensions.extend(additional_extensions.split(','))
+            # Save full extension list for all named items
+            for element in require_element.findall('*[@name]'):
+                self.required_extensions[element.get('name')] = required_extensions
+
         # And note if this is an Instance or Device extension
         self.extension_type = interface.get('type')
     #
@@ -1143,9 +1158,9 @@
             startIndex = 0 if command.name == 'vkCreateInstance' else 1
             lines, unused = self.genFuncBody(command.name, command.params[startIndex:], '', '', None)
             # Cannot validate extension dependencies for device extension APIs having a physical device as their dispatchable object
-            if self.required_extensions and (self.extension_type != 'device' or command.params[0].type != 'VkPhysicalDevice'):
+            if (command.name in self.required_extensions) and (self.extension_type != 'device' or command.params[0].type != 'VkPhysicalDevice'):
                 ext_test = ''
-                for ext in self.required_extensions:
+                for ext in self.required_extensions[command.name]:
                     ext_name_define = ''
                     ext_enable_name = ''
                     for extension in self.registry.extensions: