From e73c7e31fdaab817d29c8546b541a45e287b90a9 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 11 Jan 2017 12:09:31 -0700 Subject: layers: Refactor CreateSwapChain for recording Added a PostCallRecord function for this API. Change-Id: I6f9e67ea5fbcf1ee4f54043c5269ad282339a9db --- layers/core_validation.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 69783093..e4f51595 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -12062,18 +12062,9 @@ static bool PreCallValidateCreateSwapchainKHR(layer_data *dev_data, VkSwapchainC return false; } -VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkSwapchainKHR *pSwapchain) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - auto surface_state = getSurfaceState(dev_data->instance_data, pCreateInfo->surface); - auto old_swapchain_state = getSwapchainNode(dev_data, pCreateInfo->oldSwapchain); - - if (PreCallValidateCreateSwapchainKHR(dev_data, pCreateInfo, surface_state, old_swapchain_state)) - return VK_ERROR_VALIDATION_FAILED_EXT; - - VkResult result = dev_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); - +static void PostCallRecordCreateSwapchainKHR(layer_data *dev_data, VkResult result, const VkSwapchainCreateInfoKHR *pCreateInfo, + VkSwapchainKHR *pSwapchain, SURFACE_STATE *surface_state, + SWAPCHAIN_NODE *old_swapchain_state) { if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); auto swapchain_state = unique_ptr(new SWAPCHAIN_NODE(pCreateInfo, *pSwapchain)); @@ -12082,12 +12073,27 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc } else { surface_state->swapchain = nullptr; } - // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain behaves as replaced. if (old_swapchain_state) { old_swapchain_state->replaced = true; } surface_state->old_swapchain = old_swapchain_state; + return; +} + +VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) { + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + auto surface_state = getSurfaceState(dev_data->instance_data, pCreateInfo->surface); + auto old_swapchain_state = getSwapchainNode(dev_data, pCreateInfo->oldSwapchain); + + if (PreCallValidateCreateSwapchainKHR(dev_data, pCreateInfo, surface_state, old_swapchain_state)) { + return VK_ERROR_VALIDATION_FAILED_EXT; + } + + VkResult result = dev_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); + + PostCallRecordCreateSwapchainKHR(dev_data, result, pCreateInfo, pSwapchain, surface_state, old_swapchain_state); return result; } -- cgit v1.2.3