Snap for 8554636 from 88f0ca5746c2406a7f19979f031df8374304fab7 to sdk-release

Change-Id: Ic51ef166d20b47910c62e1a8edbd7135b6b79b69
diff --git a/registry/vulkan/scripts/cereal/common/codegen.py b/registry/vulkan/scripts/cereal/common/codegen.py
index 4838328..e1ee23d 100644
--- a/registry/vulkan/scripts/cereal/common/codegen.py
+++ b/registry/vulkan/scripts/cereal/common/codegen.py
@@ -854,7 +854,10 @@
     def onEnd(self):
         pass
 
-    def onBeginFeature(self, featureName):
+    def onBeginFeature(self, featureName, featureType):
+        pass
+
+    def onFeatureNewCmd(self, cmdName):
         pass
 
     def onEndFeature(self):
diff --git a/registry/vulkan/scripts/cereal/common/vulkantypes.py b/registry/vulkan/scripts/cereal/common/vulkantypes.py
index 6e2c51a..bbab92f 100644
--- a/registry/vulkan/scripts/cereal/common/vulkantypes.py
+++ b/registry/vulkan/scripts/cereal/common/vulkantypes.py
@@ -864,7 +864,7 @@
         category = self.typeCategories[typeName]
         return category in NON_ABI_PORTABLE_TYPE_CATEGORIES
 
-    def onBeginFeature(self, featureName):
+    def onBeginFeature(self, featureName, featureType):
         self.feature = featureName
 
     def onEndFeature(self):
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py
index 21c92ec..30277b7 100644
--- a/registry/vulkan/scripts/cereal/decoder.py
+++ b/registry/vulkan/scripts/cereal/decoder.py
@@ -701,6 +701,7 @@
     "vkQueueWaitIdleAsyncGOOGLE" : emit_global_state_wrapped_decoding,
     "vkQueueBindSparseAsyncGOOGLE" : emit_global_state_wrapped_decoding,
     "vkGetLinearImageLayoutGOOGLE" : emit_global_state_wrapped_decoding,
+    "vkGetLinearImageLayout2GOOGLE" : emit_global_state_wrapped_decoding,
     "vkQueueFlushCommandsGOOGLE" : emit_global_state_wrapped_decoding,
     "vkQueueCommitDescriptorSetUpdatesGOOGLE" : emit_global_state_wrapped_decoding,
     "vkCollectDescriptorPoolIdsGOOGLE" : emit_global_state_wrapped_decoding,
diff --git a/registry/vulkan/scripts/cereal/decodersnapshot.py b/registry/vulkan/scripts/cereal/decodersnapshot.py
index fa38e57..668efb8 100644
--- a/registry/vulkan/scripts/cereal/decodersnapshot.py
+++ b/registry/vulkan/scripts/cereal/decodersnapshot.py
@@ -207,8 +207,8 @@
         self.module.appendHeader(decoder_snapshot_decl_preamble)
         self.module.appendImpl(decoder_snapshot_impl_preamble)
 
-    def onBeginFeature(self, featureName):
-        VulkanWrapperGenerator.onBeginFeature(self, featureName)
+    def onBeginFeature(self, featureName, featureType):
+        VulkanWrapperGenerator.onBeginFeature(self, featureName, featureType)
         self.currentFeature = featureName
 
     def onGenCmd(self, cmdinfo, name, alias):
diff --git a/registry/vulkan/scripts/cereal/dispatch.py b/registry/vulkan/scripts/cereal/dispatch.py
index 1f65834..42cba8c 100644
--- a/registry/vulkan/scripts/cereal/dispatch.py
+++ b/registry/vulkan/scripts/cereal/dispatch.py
@@ -355,7 +355,7 @@
 
         self.module.appendImpl(self.cgenImpl.swapCode())
 
-    def onBeginFeature(self, featureName):
+    def onBeginFeature(self, featureName, featureType):
         self.currentFeature = featureName
 
     def onGenType(self, typeXml, name, alias):
@@ -489,8 +489,8 @@
 
         self.module.appendImpl(self.cgenImpl.swapCode())
 
-    def onBeginFeature(self, featureName):
-        VulkanDispatch.onBeginFeature(self, featureName);
+    def onBeginFeature(self, featureName, featureType):
+        VulkanDispatch.onBeginFeature(self, featureName, featureType);
 
     def onGenType(self, typeXml, name, alias):
         VulkanDispatch.onGenType(self, typeXml, name, alias);
diff --git a/registry/vulkan/scripts/cereal/encoder.py b/registry/vulkan/scripts/cereal/encoder.py
index e56dbd1..8c95226 100644
--- a/registry/vulkan/scripts/cereal/encoder.py
+++ b/registry/vulkan/scripts/cereal/encoder.py
@@ -73,6 +73,8 @@
     "vkCreateInstance",
     "vkCreateDevice",
     "vkMapMemoryIntoAddressSpaceGOOGLE",
+    "vkGetPhysicalDeviceFeatures2",
+    "vkGetPhysicalDeviceFeatures2KHR",
     "vkGetPhysicalDeviceProperties",
     "vkGetPhysicalDeviceProperties2",
     "vkGetPhysicalDeviceProperties2KHR",
diff --git a/registry/vulkan/scripts/cereal/functable.py b/registry/vulkan/scripts/cereal/functable.py
index 58aa642..1558c2b 100644
--- a/registry/vulkan/scripts/cereal/functable.py
+++ b/registry/vulkan/scripts/cereal/functable.py
@@ -98,7 +98,9 @@
         self.cgen = CodeGen()
         self.entries = []
         self.entryFeatures = []
+        self.cmdToFeatureType = {}
         self.feature = None
+        self.featureType = None
 
     def onBegin(self,):
         cgen = self.cgen
@@ -110,8 +112,16 @@
         self.module.appendImpl(cgen.swapCode())
         pass
 
-    def onBeginFeature(self, featureName):
+    def onBeginFeature(self, featureName, featureType):
         self.feature = featureName
+        self.featureType = featureType
+
+    def onEndFeature(self):
+        self.feature = None
+        self.featureType = None
+
+    def onFeatureNewCmd(self, name):
+        self.cmdToFeatureType[name] = self.featureType
 
     def onGenCmd(self, cmdinfo, name, alias):
         typeInfo = self.typeInfo
@@ -167,11 +177,15 @@
             cgen.beginBlock()
             if self.feature == "VK_VERSION_1_1":
                 cgen.stmt("auto resources = ResourceTracker::get()")
+                if "VkCommandBuffer" == api.parameters[0].typeName:
+                    cgen.stmt("VkDevice device = resources->getDevice(commandBuffer)")
                 cgen.beginIf("resources->getApiVersionFromDevice(device) < VK_API_VERSION_1_1")
                 cgen.stmt("sOnInvalidDynamicallyCheckedCall(\"%s\", \"%s\")" % (api.name, self.feature))
                 cgen.endIf()
             elif self.feature != "VK_VERSION_1_0":
                 cgen.stmt("auto resources = ResourceTracker::get()")
+                if "VkCommandBuffer" == api.parameters[0].typeName:
+                    cgen.stmt("VkDevice device = resources->getDevice(commandBuffer);")
                 cgen.beginIf("!resources->hasDeviceExtension(device, \"%s\")" % self.feature)
                 cgen.stmt("sOnInvalidDynamicallyCheckedCall(\"%s\", \"%s\")" % (api.name, self.feature))
                 cgen.endIf()
@@ -321,4 +335,8 @@
         self.module.appendImpl(self.cgen.swapCode())
 
     def isDeviceDispatch(self, api):
-        return len(api.parameters) > 0 and "VkDevice" == api.parameters[0].typeName
+        # TODO(230793667): improve the heuristic and just use "cmdToFeatureType"
+        return (len(api.parameters) > 0 and
+            "VkDevice" == api.parameters[0].typeName) or (
+            "VkCommandBuffer" == api.parameters[0].typeName and
+            self.cmdToFeatureType.get(api.name, "") == "device")
diff --git a/registry/vulkan/scripts/cereal/marshaling.py b/registry/vulkan/scripts/cereal/marshaling.py
index 25a78d6..7aaa841 100644
--- a/registry/vulkan/scripts/cereal/marshaling.py
+++ b/registry/vulkan/scripts/cereal/marshaling.py
@@ -683,8 +683,8 @@
         self.module.appendImpl(self.cgenImpl.makeFuncDecl(self.extensionMarshalPrototype))
         self.module.appendImpl(self.cgenImpl.makeFuncDecl(self.extensionUnmarshalPrototype))
 
-    def onBeginFeature(self, featureName):
-        VulkanWrapperGenerator.onBeginFeature(self, featureName)
+    def onBeginFeature(self, featureName, featureType):
+        VulkanWrapperGenerator.onBeginFeature(self, featureName, featureType)
         self.currentFeature = featureName
 
     def onGenType(self, typeXml, name, alias):
diff --git a/registry/vulkan/scripts/cereal/reservedmarshaling.py b/registry/vulkan/scripts/cereal/reservedmarshaling.py
index a98aa73..82b30c2 100644
--- a/registry/vulkan/scripts/cereal/reservedmarshaling.py
+++ b/registry/vulkan/scripts/cereal/reservedmarshaling.py
@@ -779,8 +779,8 @@
         self.module.appendImpl(self.cgenImpl.makeFuncDecl(self.extensionMarshalPrototype))
         self.module.appendImpl(self.cgenImpl.makeFuncDecl(self.extensionUnmarshalPrototype))
 
-    def onBeginFeature(self, featureName):
-        VulkanWrapperGenerator.onBeginFeature(self, featureName)
+    def onBeginFeature(self, featureName, featureType):
+        VulkanWrapperGenerator.onBeginFeature(self, featureName, featureType)
         self.currentFeature = featureName
 
     def onGenType(self, typeXml, name, alias):
diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py
index 48fdc69..6f63b12 100644
--- a/registry/vulkan/scripts/cerealgenerator.py
+++ b/registry/vulkan/scripts/cerealgenerator.py
@@ -661,11 +661,15 @@
         # Start processing in superclass
         OutputGenerator.beginFeature(self, interface, emit)
 
-        self.typeInfo.onBeginFeature(self.featureName)
+        self.typeInfo.onBeginFeature(self.featureName, self.featureType)
 
         self.forEachModule(lambda m: m.appendHeader("#ifdef %s\n" % self.featureName))
         self.forEachModule(lambda m: m.appendImpl("#ifdef %s\n" % self.featureName))
-        self.forEachWrapper(lambda w: w.onBeginFeature(self.featureName))
+        self.forEachWrapper(lambda w: w.onBeginFeature(self.featureName, self.featureType))
+        # functable needs to understand the feature type (device vs instance) of each cmd
+        for features in interface.findall('require'):
+            for c in features.findall('command'):
+                self.forEachWrapper(lambda w: w.onFeatureNewCmd(c.get('name')))
 
     def endFeature(self):
         # Finish processing in superclass
diff --git a/registry/vulkan/scripts/generator.py b/registry/vulkan/scripts/generator.py
index 407a7cc..cb5f0f5 100644
--- a/registry/vulkan/scripts/generator.py
+++ b/registry/vulkan/scripts/generator.py
@@ -288,6 +288,7 @@
         self.diagFile = diagFile
         # Internal state
         self.featureName = None
+        self.featureType = None
         self.genOpts = None
         self.registry = None
         self.featureDictionary = {}
@@ -820,6 +821,7 @@
         - emit - actually write to the header only when True"""
         self.emit = emit
         self.featureName = interface.get('name')
+        self.featureType = interface.get('type')
         # If there's an additional 'protect' attribute in the feature, save it
         self.featureExtraProtect = interface.get('protect')
 
@@ -828,6 +830,7 @@
 
         Derived classes responsible for emitting feature"""
         self.featureName = None
+        self.featureType = None
         self.featureExtraProtect = None
 
     def genRequirements(self, name, mustBeFound = True):
diff --git a/registry/vulkan/xml/vk.xml b/registry/vulkan/xml/vk.xml
index a16e039..0732e51 100644
--- a/registry/vulkan/xml/vk.xml
+++ b/registry/vulkan/xml/vk.xml
@@ -10334,6 +10334,13 @@
             <param><type>VkDeviceSize</type>* <name>pRowPitchAlignment</name></param>
         </command>
         <command>
+            <proto><type>void</type> <name>vkGetLinearImageLayout2GOOGLE</name></proto>
+            <param><type>VkDevice</type> <name>device</name></param>
+            <param>const <type>VkImageCreateInfo</type>* <name>pCreateInfo</name></param>
+            <param><type>VkDeviceSize</type>* <name>pOffset</name></param>
+            <param><type>VkDeviceSize</type>* <name>pRowPitchAlignment</name></param>
+        </command>
+        <command>
             <proto><type>void</type> <name>vkQueueFlushCommandsGOOGLE</name></proto>
             <param externsync="true"><type>VkQueue</type> <name>queue</name></param>
             <param externsync="true"><type>VkCommandBuffer</type> <name>commandBuffer</name></param>
@@ -17661,6 +17668,7 @@
                 <command name="vkQueueWaitIdleAsyncGOOGLE"/>
                 <command name="vkQueueBindSparseAsyncGOOGLE"/>
                 <command name="vkGetLinearImageLayoutGOOGLE"/>
+                <command name="vkGetLinearImageLayout2GOOGLE"/>
                 <command name="vkQueueFlushCommandsGOOGLE"/>
                 <command name="vkQueueCommitDescriptorSetUpdatesGOOGLE"/>
                 <command name="vkCollectDescriptorPoolIdsGOOGLE"/>
@@ -18286,3 +18294,4 @@
         </spirvcapability>
     </spirvcapabilities>
 </registry>
+