From 018282bc339913fd15daabb991d52ddb6d75f65b Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Wed, 16 Apr 2025 22:31:31 +0300 Subject: [PATCH] Fix occluded or hidden windows causing the engine to freeze on Wayland --- .../GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp index 786df9aa6..01c0fce79 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp @@ -349,13 +349,22 @@ bool GPUSwapChainVulkan::CreateSwapChain(int32 width, int32 height) LOG(Error, "Vulkan swapchain dimensions are invalid {}x{} (minImageExtent={}x{}, maxImageExtent={}x{})", width, height, surfProperties.minImageExtent.width, surfProperties.minImageExtent.height, surfProperties.maxImageExtent.width, surfProperties.maxImageExtent.height); return true; } + + uint32_t backbuffersCount = VULKAN_BACK_BUFFERS_COUNT; +#if PLATFORM_SDL && PLATFORM_LINUX && USE_EDITOR + // Wayland compositor might block one of the backbuffers while the window is minimized or fully occluded, + // make sure we have at least 3 backbuffers available so double-buffering can be used while we are blocked. + if (Platform::UsesWayland()) + backbuffersCount = Math::Max(backbuffersCount, 3); +#endif + ASSERT(surfProperties.minImageCount <= VULKAN_BACK_BUFFERS_COUNT_MAX); VkSwapchainCreateInfoKHR swapChainInfo; RenderToolsVulkan::ZeroStruct(swapChainInfo, VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR); swapChainInfo.surface = _surface; swapChainInfo.minImageCount = surfProperties.maxImageCount > 0 // A value of 0 means that there is no limit on the number of image - ? Math::Min(VULKAN_BACK_BUFFERS_COUNT, surfProperties.maxImageCount) - : VULKAN_BACK_BUFFERS_COUNT; + ? Math::Min(backbuffersCount, surfProperties.maxImageCount) + : backbuffersCount; swapChainInfo.minImageCount = Math::Max(swapChainInfo.minImageCount, surfProperties.minImageCount); swapChainInfo.minImageCount = Math::Min(swapChainInfo.minImageCount, VULKAN_BACK_BUFFERS_COUNT_MAX); swapChainInfo.imageFormat = result.format;