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):