From c4bc6c96273daa07c323bf8b4e4963a2e3843067 Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Mon, 10 Nov 2025 00:06:52 +0100 Subject: [PATCH] Adds an option to destroy Vulkan old swapchain before Now it's possible to destroy the old swapchain before creating a new one. It might make the swapchain creation a bit slower but with a lower memory peak. --- binaries/data/config/default.cfg | 1 + source/renderer/backend/vulkan/Device.cpp | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index 01acedb7aa..3bcd2d0018 100644 --- a/binaries/data/config/default.cfg +++ b/binaries/data/config/default.cfg @@ -138,6 +138,7 @@ renderer.backend.gl.enableframebufferinvalidating = false renderer.backend.vulkan.disabledescriptorindexing = false renderer.backend.vulkan.deviceindexoverride = -1 +renderer.backend.vulkan.destroyoldswapchainbefore = false renderer.backend.vulkan.debugbarrierafterframebufferpass = false renderer.backend.vulkan.debugwaitidlebeforeacquire = false diff --git a/source/renderer/backend/vulkan/Device.cpp b/source/renderer/backend/vulkan/Device.cpp index 855233713c..e3fba3a6be 100644 --- a/source/renderer/backend/vulkan/Device.cpp +++ b/source/renderer/backend/vulkan/Device.cpp @@ -1039,6 +1039,13 @@ void CDevice::RecreateSwapChain() { vkDeviceWaitIdle(m_Device); + // It seems some drivers might not reuse the same swapchain memory. So + // to avoid higher memory peaks destroy the old swapchain before. + const bool destroyOldSwapchainBefore{ + g_ConfigDB.Get("renderer.backend.vulkan.destroyoldswapchainbefore", false)}; + if (destroyOldSwapchainBefore) + m_SwapChain.reset(); + m_BackbufferReadbackTexture.reset(); // Since we know there is no GPU work in progress we can free resources