From b2928e4ce6d2fbc5410a7f0ec12b3266b7eadbf8 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Thu, 25 Dec 2025 20:23:22 +0100 Subject: [PATCH] fix: layer: clean up layer info emplacing a value into an unordered map does not override, so if the swapchain handles were identical (which they are commonly), then it would try to continue with the swapchain images from the old swapchain. ironically, the swapchain images are also mostly identical. in fact, when using validation layers they are intentionally-unintentionally identical.. so I never caught this bug. either way, this fixes a bunch of weird behavior: - swapchain creation failing - the application hanging on a present - the infamous "assertion failed!" wine warning - segmentation faults in the NVIDIA driver --- lsfg-vk-layer/src/entrypoint.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lsfg-vk-layer/src/entrypoint.cpp b/lsfg-vk-layer/src/entrypoint.cpp index 266afde..6833423 100644 --- a/lsfg-vk-layer/src/entrypoint.cpp +++ b/lsfg-vk-layer/src/entrypoint.cpp @@ -285,6 +285,10 @@ namespace { try { // retire old swapchain if (info->oldSwapchain) { + const auto& info_mapping = instance_info->swapchainInfos.find(info->oldSwapchain); + if (info_mapping != instance_info->swapchainInfos.end()) + instance_info->swapchainInfos.erase(info_mapping); + const auto& mapping = instance_info->swapchains.find(info->oldSwapchain); if (mapping != instance_info->swapchains.end()) instance_info->swapchains.erase(mapping); @@ -425,6 +429,10 @@ namespace { if (it == instance_info->devices.end()) return; + const auto& info_mapping = instance_info->swapchainInfos.find(swapchain); + if (info_mapping != instance_info->swapchainInfos.end()) + instance_info->swapchainInfos.erase(info_mapping); + const auto& mapping = instance_info->swapchains.find(swapchain); if (mapping != instance_info->swapchains.end()) instance_info->swapchains.erase(mapping);