Distinguish device vs instance features for vkCmd*

We build a dictionary to keep the feature type of each command and use
it to distinguish between device vs instance features for vkCmd*

Bug: 229120758
Test: dEQP-VK.api.version_check#entry_points
Change-Id: I8accd19478eb097825dc85b6fa6420073799346d
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/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/functable.py b/registry/vulkan/scripts/cereal/functable.py
index 0b45edc..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
@@ -325,5 +335,8 @@
         self.module.appendImpl(self.cgen.swapCode())
 
     def isDeviceDispatch(self, api):
-        return len(api.parameters) > 0 and (
-            "VkDevice" == api.parameters[0].typeName or "VkCommandBuffer" == 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):