From 3cafa2023a16fd7157c79e46507925aba1182d40 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 11 Jan 2017 13:14:36 -0700 Subject: layers: Refactor CreateSharedwapChains for recording Added PreCallValidate and PostCallRecord functions for this API. Change-Id: Iebf8eb980dadbb29cceffd6a9fefb5340939eb0f --- layers/core_validation.cpp | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e4f51595..705db11b 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -12311,27 +12311,27 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf return result; } -VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount, - const VkSwapchainCreateInfoKHR *pCreateInfos, - const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - std::vector surface_state; - std::vector old_swapchain_state; - +static bool PreCallValidateCreateSharedSwapchainsKHR(layer_data *dev_data, uint32_t swapchainCount, + const VkSwapchainCreateInfoKHR *pCreateInfos, VkSwapchainKHR *pSwapchains, + std::vector &surface_state, + std::vector &old_swapchain_state) { if (pCreateInfos) { - std::unique_lock lock(global_lock); + std::lock_guard lock(global_lock); for (uint32_t i = 0; i < swapchainCount; i++) { surface_state.push_back(getSurfaceState(dev_data->instance_data, pCreateInfos[i].surface)); old_swapchain_state.push_back(getSwapchainNode(dev_data, pCreateInfos[i].oldSwapchain)); if (PreCallValidateCreateSwapchainKHR(dev_data, &pCreateInfos[i], surface_state[i], old_swapchain_state[i])) { - return VK_ERROR_VALIDATION_FAILED_EXT; + return true; } } } - VkResult result = - dev_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains); + return false; +} - std::lock_guard lock(global_lock); +static void PostCallRecordCreateSharedSwapchainsKHR(layer_data *dev_data, VkResult result, uint32_t swapchainCount, + const VkSwapchainCreateInfoKHR *pCreateInfos, VkSwapchainKHR *pSwapchains, + std::vector &surface_state, + std::vector &old_swapchain_state) { if (VK_SUCCESS == result) { for (uint32_t i = 0; i < swapchainCount; i++) { auto swapchain_state = unique_ptr(new SWAPCHAIN_NODE(&pCreateInfos[i], pSwapchains[i])); @@ -12343,7 +12343,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32 surface_state[i]->swapchain = nullptr; } } - // Spec requires that even if CreateSharedSwapchainKHR fails, oldSwapchain behaves as replaced. for (uint32_t i = 0; i < swapchainCount; i++) { if (old_swapchain_state[i]) { @@ -12351,6 +12350,26 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32 } surface_state[i]->old_swapchain = old_swapchain_state[i]; } + return; +} + +VKAPI_ATTR VkResult VKAPI_CALL CreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCount, + const VkSwapchainCreateInfoKHR *pCreateInfos, + const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchains) { + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + std::vector surface_state; + std::vector old_swapchain_state; + + if (PreCallValidateCreateSharedSwapchainsKHR(dev_data, swapchainCount, pCreateInfos, pSwapchains, surface_state, + old_swapchain_state)) { + return VK_ERROR_VALIDATION_FAILED_EXT; + } + + VkResult result = + dev_data->dispatch_table.CreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains); + + PostCallRecordCreateSharedSwapchainsKHR(dev_data, result, swapchainCount, pCreateInfos, pSwapchains, surface_state, + old_swapchain_state); return result; } -- cgit v1.2.3