diff options
| author | Chris Forbes <chrisforbes@google.com> | 2016-10-06 13:01:17 +1300 |
|---|---|---|
| committer | Chris Forbes <chrisforbes@google.com> | 2016-10-06 17:43:18 +1300 |
| commit | d8cc42e154b3aaf57aa932dd8a8e5db1be81ce61 (patch) | |
| tree | c8377a5e6ed3c368853076329367b4d44c605ec5 /layers/core_validation.cpp | |
| parent | b5bf061fe5b0c3c56fd658008d494eed07fb3cb1 (diff) | |
| download | usermoji-d8cc42e154b3aaf57aa932dd8a8e5db1be81ce61.tar.xz | |
layers: Track current and prev swapchains for each surface in CV
Signed-off-by: Chris Forbes <chrisforbes@google.com>
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
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<std::mutex> lock(global_lock); - dev_data->device_extensions.swapchainMap[*pSwapchain] = unique_ptr<SWAPCHAIN_NODE>(new SWAPCHAIN_NODE(pCreateInfo, *pSwapchain)); + auto swapchain_state = unique_ptr<SWAPCHAIN_NODE>(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(); |
