From 8a64182ca2d2ad957b965bed0dc5b31571b7d6dd Mon Sep 17 00:00:00 2001 From: Vladislav Belov Date: Mon, 10 Nov 2025 00:06:51 +0100 Subject: [PATCH] Waits Vulkan device idle also on window resize Fixes the case when a swapchain was recreated on resize rather than by VK_ERROR_OUT_OF_DATE_KHR. --- source/renderer/backend/vulkan/Device.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/source/renderer/backend/vulkan/Device.cpp b/source/renderer/backend/vulkan/Device.cpp index e09458bbea..855233713c 100644 --- a/source/renderer/backend/vulkan/Device.cpp +++ b/source/renderer/backend/vulkan/Device.cpp @@ -805,13 +805,6 @@ bool CDevice::AcquireNextBackbuffer() { if (!IsSwapChainValid()) { - vkDeviceWaitIdle(m_Device); - - // Since we know there is no GPU work in progress we can free resources - // queued for deletion. - ProcessDeviceObjectToDestroyQueue(true); - ProcessObjectToDestroyQueue(true); - RecreateSwapChain(); if (!IsSwapChainValid()) return false; @@ -1042,7 +1035,18 @@ std::unique_ptr CDevice::CreateRingCommandContext(const siz void CDevice::RecreateSwapChain() { - m_BackbufferReadbackTexture.reset(); + if (m_SwapChain) + { + vkDeviceWaitIdle(m_Device); + + m_BackbufferReadbackTexture.reset(); + + // Since we know there is no GPU work in progress we can free resources + // queued for deletion. + ProcessDeviceObjectToDestroyQueue(true); + ProcessObjectToDestroyQueue(true); + } + int surfaceDrawableWidth = 0, surfaceDrawableHeight = 0; SDL_Vulkan_GetDrawableSize(m_Window, &surfaceDrawableWidth, &surfaceDrawableHeight); m_SwapChain = CSwapChain::Create(