Support self-resolving vkGetInstanceProcAddr
The spec states that "Starting with Vulkan 1.2, vkGetInstanceProcAddr
can resolve itself with a NULL instance pointer."
Bug: b/200679975
Change-Id: Icd53a0b916e7930a4efacea81244dfb9975f3087
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/57289
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Sean Risser <srisser@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index 38b9f8c..3a778cb 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -27,11 +27,13 @@
namespace vk {
+// Functions that can be obtained through GetInstanceProcAddr without an instance
#define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = {
+ MAKE_VULKAN_GLOBAL_ENTRY(vkGetInstanceProcAddr),
MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
@@ -39,11 +41,13 @@
};
#undef MAKE_VULKAN_GLOBAL_ENTRY
+// Functions that can be obtained through GetInstanceProcAddr with an instance object
#define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers = {
+
MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
@@ -151,12 +155,12 @@
};
#undef MAKE_VULKAN_INSTANCE_ENTRY
+// Functions that can be obtained through GetDeviceProcAddr with a device object
#define MAKE_VULKAN_DEVICE_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
- MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),