From d8cc42e154b3aaf57aa932dd8a8e5db1be81ce61 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 6 Oct 2016 13:01:17 +1300 Subject: layers: Track current and prev swapchains for each surface in CV Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 21 ++++++++++++++++++++- layers/core_validation.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 84c8182c..49956f75 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11160,13 +11160,23 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc 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); + VkResult result = dev_data->dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); - dev_data->device_extensions.swapchainMap[*pSwapchain] = unique_ptr(new SWAPCHAIN_NODE(pCreateInfo, *pSwapchain)); + auto swapchain_state = unique_ptr(new SWAPCHAIN_NODE(pCreateInfo, *pSwapchain)); + surface_state->swapchain = swapchain_state.get(); + dev_data->device_extensions.swapchainMap[*pSwapchain] = std::move(swapchain_state); + } else { + surface_state->swapchain = nullptr; } + // Spec requires that even if CreateSwapchainKHR fails, oldSwapchain behaves as replaced. + surface_state->old_swapchain = old_swapchain_state; + return result; } @@ -11195,6 +11205,15 @@ DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocatio dev_data->imageMap.erase(swapchain_image); } } + + auto surface_state = getSurfaceState(dev_data->instance_data, swapchain_data->createInfo.surface); + if (surface_state) { + if (surface_state->swapchain == swapchain_data) + surface_state->swapchain = nullptr; + if (surface_state->old_swapchain == swapchain_data) + surface_state->old_swapchain = nullptr; + } + dev_data->device_extensions.swapchainMap.erase(swapchain); } lock.unlock(); diff --git a/layers/core_validation.h b/layers/core_validation.h index b7eae5b6..72459587 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -218,6 +218,8 @@ struct PHYSICAL_DEVICE_STATE { struct SURFACE_STATE { VkSurfaceKHR surface = VK_NULL_HANDLE; + SWAPCHAIN_NODE *swapchain = nullptr; + SWAPCHAIN_NODE *old_swapchain = nullptr; SURFACE_STATE() {} SURFACE_STATE(VkSurfaceKHR surface) -- cgit v1.2.3