aboutsummaryrefslogtreecommitdiff
path: root/layers/swapchain.cpp
diff options
context:
space:
mode:
authorChia-I Wu <olv@google.com>2016-04-28 14:38:57 +0800
committerChia-I Wu <olv@google.com>2016-05-13 10:35:37 +0800
commit26e0c08344ae07f3690893229f53e08f98abb8a4 (patch)
tree28acbe2db76e346da214746d315712c35fee3f4f /layers/swapchain.cpp
parent247abbbb9487e72c10f6b61bc100316b5c6e0e0f (diff)
downloadusermoji-26e0c08344ae07f3690893229f53e08f98abb8a4.tar.xz
swapchain: refactor GetInstanceProcAddr
Split command intercepting out to intercept_core_instance_command and intercept_khr_surface_command.
Diffstat (limited to 'layers/swapchain.cpp')
-rw-r--r--layers/swapchain.cpp130
1 files changed, 75 insertions, 55 deletions
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 0f49cac3..b7dfad14 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -2134,6 +2134,12 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi
}
static PFN_vkVoidFunction
+intercept_core_instance_command(const char *name);
+
+static PFN_vkVoidFunction
+intercept_khr_surface_command(const char *name, VkInstance instance);
+
+static PFN_vkVoidFunction
intercept_core_device_command(const char *name);
static PFN_vkVoidFunction
@@ -2161,26 +2167,9 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, cons
}
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) {
- if (!strcmp("vkGetInstanceProcAddr", funcName))
- return (PFN_vkVoidFunction)GetInstanceProcAddr;
- if (!strcmp(funcName, "vkCreateInstance"))
- return (PFN_vkVoidFunction)CreateInstance;
- if (!strcmp(funcName, "vkDestroyInstance"))
- return (PFN_vkVoidFunction)DestroyInstance;
- if (!strcmp(funcName, "vkCreateDevice"))
- return (PFN_vkVoidFunction)CreateDevice;
- if (!strcmp(funcName, "vkEnumeratePhysicalDevices"))
- return (PFN_vkVoidFunction)EnumeratePhysicalDevices;
- if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))
- return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
- if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))
- return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
- if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))
- return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
- if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties"))
- return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties;
- if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties"))
- return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties;
+ PFN_vkVoidFunction proc = intercept_core_instance_command(funcName);
+ if (proc)
+ return proc;
if (instance == VK_NULL_HANDLE) {
return NULL;
@@ -2196,54 +2185,85 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance
return addr;
}
+ proc = intercept_khr_surface_command(funcName, instance);
+ if (proc)
+ return proc;
+
+ if (pTable->GetInstanceProcAddr == NULL)
+ return NULL;
+ return pTable->GetInstanceProcAddr(instance, funcName);
+}
+
+static PFN_vkVoidFunction
+intercept_core_instance_command(const char *name) {
+ static const struct {
+ const char *name;
+ PFN_vkVoidFunction proc;
+ } core_instance_commands[] = {
+ { "vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr) },
+ { "vkCreateInstance", reinterpret_cast<PFN_vkVoidFunction>(CreateInstance) },
+ { "vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance) },
+ { "vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice) },
+ { "vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices) },
+ { "vkEnumerateInstanceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(vkEnumerateInstanceLayerProperties) },
+ { "vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(vkEnumerateDeviceLayerProperties) },
+ { "vkEnumerateInstanceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(vkEnumerateInstanceExtensionProperties) },
+ { "vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties) },
+ { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties) },
+ };
+
+ for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) {
+ if (!strcmp(core_instance_commands[i].name, name))
+ return core_instance_commands[i].proc;
+ }
+
+ return nullptr;
+}
+
+static PFN_vkVoidFunction
+intercept_khr_surface_command(const char *name, VkInstance instance) {
+ static const struct {
+ const char *name;
+ PFN_vkVoidFunction proc;
+ } khr_surface_commands[] = {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
- if (!strcmp("vkCreateAndroidSurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR);
+ { "vkCreateAndroidSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateAndroidSurfaceKHR) },
#endif // VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_USE_PLATFORM_MIR_KHR
- if (!strcmp("vkCreateMirSurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR);
+ { "vkCreateMirSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateMirSurfaceKHR) },
+ { "vkGetPhysicalDeviceMirPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMirPresentationSupportKHR) },
#endif // VK_USE_PLATFORM_MIR_KHR
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
- if (!strcmp("vkCreateWaylandSurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR);
+ { "vkCreateWaylandSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWaylandSurfaceKHR) },
+ { "vkGetPhysicalDeviceWaylandPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWaylandPresentationSupportKHR) },
#endif // VK_USE_PLATFORM_WAYLAND_KHR
#ifdef VK_USE_PLATFORM_WIN32_KHR
- if (!strcmp("vkCreateWin32SurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR);
+ { "vkCreateWin32SurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateWin32SurfaceKHR) },
+ { "vkGetPhysicalDeviceWin32PresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceWin32PresentationSupportKHR) },
#endif // VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_USE_PLATFORM_XCB_KHR
- if (!strcmp("vkCreateXcbSurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR);
+ { "vkCreateXcbSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXcbSurfaceKHR) },
+ { "vkGetPhysicalDeviceXcbPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXcbPresentationSupportKHR) },
#endif // VK_USE_PLATFORM_XCB_KHR
#ifdef VK_USE_PLATFORM_XLIB_KHR
- if (!strcmp("vkCreateXlibSurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR);
+ { "vkCreateXlibSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateXlibSurfaceKHR) },
+ { "vkGetPhysicalDeviceXlibPresentationSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceXlibPresentationSupportKHR) },
#endif // VK_USE_PLATFORM_XLIB_KHR
- if (!strcmp("vkDestroySurfaceKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR);
- if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR);
- if (!strcmp("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR);
- if (!strcmp("vkGetPhysicalDeviceSurfaceFormatsKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR);
- if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", funcName))
- return reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR);
+ { "vkDestroySurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySurfaceKHR) },
+ { "vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR) },
+ { "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR) },
+ { "vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR) },
+ { "vkGetPhysicalDeviceSurfacePresentModesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR) },
+ };
- if (pTable->GetInstanceProcAddr == NULL)
- return NULL;
- return pTable->GetInstanceProcAddr(instance, funcName);
+ // do not check if VK_KHR_*_surface is enabled (why?)
+
+ for (size_t i = 0; i < ARRAY_SIZE(khr_surface_commands); i++) {
+ if (!strcmp(khr_surface_commands[i].name, name))
+ return khr_surface_commands[i].proc;
+ }
+
+ return nullptr;
}
static PFN_vkVoidFunction