[vulkan] Don't expose function pointers that were not enabled
bug: 111137294
Change-Id: Ic77f7cd4f32cd8c6ad9303d896cd932605ddb70f
diff --git a/registry/vulkan/xml/cereal/encoder.py b/registry/vulkan/xml/cereal/encoder.py
index beef8ae..1d05a88 100644
--- a/registry/vulkan/xml/cereal/encoder.py
+++ b/registry/vulkan/xml/cereal/encoder.py
@@ -89,6 +89,7 @@
]
ENCODER_CUSTOM_RESOURCE_POSTPROCESS = [
+ "vkCreateInstance",
"vkCreateDevice",
"vkMapMemoryIntoAddressSpaceGOOGLE",
"vkGetPhysicalDeviceMemoryProperties",
diff --git a/registry/vulkan/xml/cereal/functable.py b/registry/vulkan/xml/cereal/functable.py
index cfed620..635234d 100644
--- a/registry/vulkan/xml/cereal/functable.py
+++ b/registry/vulkan/xml/cereal/functable.py
@@ -88,6 +88,10 @@
self.cgen.beginIf("!strcmp(name, \"%s\")" % e.name)
if e.name in EXCLUDED_APIS:
self.cgen.stmt("return nullptr")
+ elif f == "VK_VERSION_1_1":
+ self.cgen.stmt("return nullptr")
+ elif f != "VK_VERSION_1_0":
+ self.cgen.stmt("return nullptr")
else:
self.cgen.stmt("return (void*)%s" % ("entry_" + e.name))
self.cgen.endIf()
@@ -97,4 +101,99 @@
self.cgen.stmt("return nullptr")
self.cgen.endBlock()
- self.module.appendImpl(self.cgen.swapCode())
\ No newline at end of file
+ self.module.appendImpl(self.cgen.swapCode())
+
+ getInstanceProcAddressDecl = "void* goldfish_vulkan_get_instance_proc_address(VkInstance instance, const char* name)"
+ self.module.appendHeader(getInstanceProcAddressDecl + ";\n")
+ self.module.appendImpl(getInstanceProcAddressDecl)
+ self.cgen.beginBlock()
+
+ self.cgen.stmt(
+ "auto resources = ResourceTracker::get()")
+ self.cgen.stmt(
+ "bool has1_1OrHigher = resources->getApiVersionFromInstance(instance) >= VK_API_VERSION_1_1")
+
+ prevFeature = None
+ for e, f in zip(self.entries, self.entryFeatures):
+ featureEndif = prevFeature is not None and (f != prevFeature)
+ featureif = not featureEndif and (f != prevFeature)
+
+ if featureEndif:
+ self.cgen.leftline("#endif")
+ self.cgen.leftline("#ifdef %s" % f)
+
+ if featureif:
+ self.cgen.leftline("#ifdef %s" % f)
+
+ self.cgen.beginIf("!strcmp(name, \"%s\")" % e.name)
+
+ entryPointExpr = "(void*)%s" % ("entry_" + e.name)
+
+ if e.name in EXCLUDED_APIS:
+ self.cgen.stmt("return nullptr")
+ elif f == "VK_VERSION_1_1":
+ self.cgen.stmt( \
+ "return has1_1OrHigher ? %s : nullptr" % \
+ entryPointExpr)
+ elif f != "VK_VERSION_1_0":
+ self.cgen.stmt( \
+ "bool hasExt = resources->hasInstanceExtension(instance, \"%s\")" % f)
+ self.cgen.stmt("return hasExt ? %s : nullptr" % entryPointExpr)
+ else:
+ self.cgen.stmt("return %s" % entryPointExpr)
+ self.cgen.endIf()
+ prevFeature = f
+
+ self.cgen.leftline("#endif")
+
+ self.cgen.stmt("return nullptr")
+ self.cgen.endBlock()
+ self.module.appendImpl(self.cgen.swapCode())
+
+ getDeviceProcAddressDecl = "void* goldfish_vulkan_get_device_proc_address(VkDevice device, const char* name)"
+ self.module.appendHeader(getDeviceProcAddressDecl + ";\n")
+ self.module.appendImpl(getDeviceProcAddressDecl)
+ self.cgen.beginBlock()
+
+ self.cgen.stmt(
+ "auto resources = ResourceTracker::get()")
+ self.cgen.stmt(
+ "bool has1_1OrHigher = resources->getApiVersionFromDevice(device) >= VK_API_VERSION_1_1")
+
+ prevFeature = None
+ for e, f in zip(self.entries, self.entryFeatures):
+ featureEndif = prevFeature is not None and (f != prevFeature)
+ featureif = not featureEndif and (f != prevFeature)
+
+ if featureEndif:
+ self.cgen.leftline("#endif")
+ self.cgen.leftline("#ifdef %s" % f)
+
+ if featureif:
+ self.cgen.leftline("#ifdef %s" % f)
+
+ self.cgen.beginIf("!strcmp(name, \"%s\")" % e.name)
+
+ entryPointExpr = "(void*)%s" % ("entry_" + e.name)
+
+ if e.name in EXCLUDED_APIS:
+ self.cgen.stmt("return nullptr")
+ elif f == "VK_VERSION_1_1":
+ self.cgen.stmt( \
+ "return has1_1OrHigher ? %s : nullptr" % \
+ entryPointExpr)
+ elif f != "VK_VERSION_1_0":
+ self.cgen.stmt( \
+ "bool hasExt = resources->hasDeviceExtension(device, \"%s\")" % f)
+ self.cgen.stmt("return hasExt ? %s : nullptr" % entryPointExpr)
+ else:
+ self.cgen.stmt("return %s" % entryPointExpr)
+ self.cgen.endIf()
+ prevFeature = f
+
+ self.cgen.leftline("#endif")
+
+ self.cgen.stmt("return nullptr")
+ self.cgen.endBlock()
+
+ self.module.appendImpl(self.cgen.swapCode())