From 247abbbb9487e72c10f6b61bc100316b5c6e0e0f Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 5 May 2016 16:13:19 +0800 Subject: [PATCH] swapchain: add intercept_khr_swapchain_command It returns the function pointers for all intercepted VK_KHR_swapchain commands. Call intercept_khr_swapchain_command from GetDeviceProcAddr. --- layers/swapchain.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index 6cad92e..0f49cac 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -2136,6 +2136,9 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi static PFN_vkVoidFunction intercept_core_device_command(const char *name); +static PFN_vkVoidFunction +intercept_khr_swapchain_command(const char *name, VkDevice dev); + VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { PFN_vkVoidFunction proc = intercept_core_device_command(funcName); if (proc) @@ -2147,16 +2150,10 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, cons my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); VkLayerDispatchTable *pDisp = my_data->device_dispatch_table; - if (!strcmp("vkCreateSwapchainKHR", funcName)) - return reinterpret_cast(CreateSwapchainKHR); - if (!strcmp("vkDestroySwapchainKHR", funcName)) - return reinterpret_cast(DestroySwapchainKHR); - if (!strcmp("vkGetSwapchainImagesKHR", funcName)) - return reinterpret_cast(GetSwapchainImagesKHR); - if (!strcmp("vkAcquireNextImageKHR", funcName)) - return reinterpret_cast(AcquireNextImageKHR); - if (!strcmp("vkQueuePresentKHR", funcName)) - return reinterpret_cast(QueuePresentKHR); + + proc = intercept_khr_swapchain_command(funcName, device); + if (proc) + return proc; if (pDisp->GetDeviceProcAddr == NULL) return NULL; @@ -2268,6 +2265,29 @@ intercept_core_device_command(const char *name) { return nullptr; } +static PFN_vkVoidFunction +intercept_khr_swapchain_command(const char *name, VkDevice dev) { + static const struct { + const char *name; + PFN_vkVoidFunction proc; + } khr_swapchain_commands[] = { + { "vkCreateSwapchainKHR", reinterpret_cast(CreateSwapchainKHR) }, + { "vkDestroySwapchainKHR", reinterpret_cast(DestroySwapchainKHR) }, + { "vkGetSwapchainImagesKHR", reinterpret_cast(GetSwapchainImagesKHR) }, + { "vkAcquireNextImageKHR", reinterpret_cast(AcquireNextImageKHR) }, + { "vkQueuePresentKHR", reinterpret_cast(QueuePresentKHR) }, + }; + + // do not check if VK_KHR_swapchain is enabled (why?) + + for (size_t i = 0; i < ARRAY_SIZE(khr_swapchain_commands); i++) { + if (!strcmp(khr_swapchain_commands[i].name, name)) + return khr_swapchain_commands[i].proc; + } + + return nullptr; +} + } // namespace swapchain // vk_layer_logging.h expects these to be defined -- 2.7.4