summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jesse Hall <jessehall@google.com> 2020-05-21 16:28:48 -0700
committer Jesse Hall <jessehall@google.com> 2020-05-21 16:28:48 -0700
commit7559c76d12cbc3380d4927f28703198124556350 (patch)
tree4dc56f54bc36e6c4cf02425e95b3d1c197558625
parent76ad0655bbf35a88362d6f9aaa31585bd83b886c (diff)
libvulkan: support vkGIPA self-query
vkGetInstanceProcAddr(nullptr, ...) is valid and is effectively a globally dispatched function, so it's consistent to support querying vkGetInstanceProcAddr from itself without an instance. This is required in Vulkan 1.2 and is supported for all Vulkan versions by the loader on other platforms. To maximize app compatibility and minimize surprises, this makes it work on Android also, even for pre-1.2 versions where the result is undefined by the spec. Bug: 157173922 Test: dEQP-VK.api.version_check.entry_points with https://gerrit.khronos.org/#/c/5490/ applied and modified to check even on pre-1.2 implementations. Change-Id: I820dd1239df54a415b7ff5db47cf2c2b349f6155
-rw-r--r--vulkan/libvulkan/api_gen.cpp1
-rw-r--r--vulkan/scripts/api_generator.py4
2 files changed, 4 insertions, 1 deletions
diff --git a/vulkan/libvulkan/api_gen.cpp b/vulkan/libvulkan/api_gen.cpp
index 37b5368452..d9a94274a4 100644
--- a/vulkan/libvulkan/api_gen.cpp
+++ b/vulkan/libvulkan/api_gen.cpp
@@ -621,6 +621,7 @@ VKAPI_ATTR PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const cha
// global functions
if (instance == VK_NULL_HANDLE) {
if (strcmp(pName, "vkCreateInstance") == 0) return reinterpret_cast<PFN_vkVoidFunction>(CreateInstance);
+ if (strcmp(pName, "vkGetInstanceProcAddr") == 0) return reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr);
if (strcmp(pName, "vkEnumerateInstanceVersion") == 0) return reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceVersion);
if (strcmp(pName, "vkEnumerateInstanceLayerProperties") == 0) return reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceLayerProperties);
if (strcmp(pName, "vkEnumerateInstanceExtensionProperties") == 0) return reinterpret_cast<PFN_vkVoidFunction>(EnumerateInstanceExtensionProperties);
diff --git a/vulkan/scripts/api_generator.py b/vulkan/scripts/api_generator.py
index 7c390755e1..be24172eed 100644
--- a/vulkan/scripts/api_generator.py
+++ b/vulkan/scripts/api_generator.py
@@ -152,7 +152,9 @@ def _intercept_instance_proc_addr(f):
if (instance == VK_NULL_HANDLE) {\n""")
for cmd in gencom.command_list:
- if gencom.is_globally_dispatched(cmd):
+ # vkGetInstanceProcAddr(nullptr, "vkGetInstanceProcAddr") is effectively
+ # globally dispatched
+ if gencom.is_globally_dispatched(cmd) or cmd == 'vkGetInstanceProcAddr':
f.write(gencom.indent(2) +
'if (strcmp(pName, \"' + cmd +
'\") == 0) return reinterpret_cast<PFN_vkVoidFunction>(' +