Summary
On Linux with an NVIDIA GPU, in a Wayland session (editor running through XWayland), the editor crashes repeatedly with a SIGSEGV inside libnvidia-glcore.so. The crash is in the vkWaitForFences call that FVulkanSwapChain::AcquireImageIndex makes on the swapchain acquire fence (VulkanSwapChain.cpp:773, the GShouldCpuWaitForFence path). Every crash comes within ~2 seconds after “LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain”, which is triggered by closing a secondary editor window, stopping PIE, or resizing a window.
Setting r.Vulkan.CpuWaitForFence=0 (the same default Epic already ships for Android) fixes it. Before the change there were 11 crashes in 10 days, some after only 4 out-of-date swapchain events. After the change there were 13 editor sessions with 161 out-of-date swapchain events and 0 crashes.
Reproduced on UE 5.8.2 and 5.8.3, NVIDIA drivers 595.84 and 595.104.02, with and without DLSS, and also in the Project Browser with no project loaded.
What Type of Bug are you experiencing?
Rendering (Graphics / Niagara)
Steps to Reproduce
-
On Linux with an NVIDIA GPU (tested: RTX 4060, driver 595.104.02 / 595.84), log into a Wayland session (tested: COSMIC on Pop!_OS 24.04). The editor runs through XWayland; the log shows “Using SDL video driver ‘x11’”.
-
Launch the Unreal Editor 5.8 (binary Linux release) with the default Vulkan RHI settings, so r.Vulkan.CpuWaitForFence=1 and r.Vulkan.KeepSwapChain=1. Any project works, and the Project Browser alone is enough.
-
Repeatedly do things that invalidate the swapchain: open and close Project Settings or Message Log, start and stop Play In Editor in a New Editor Window, resize or move editor windows.
-
Watch the log for “LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.”
-
Within ~2 seconds of one of those messages, the editor crashes. It is intermittent: sometimes after 4 events, sometimes after dozens. In normal use it happened several times a day.
Expected Result
The swapchain is recreated after VK_ERROR_OUT_OF_DATE_KHR, and the editor keeps running normally.
Observed Result
The RHI thread crashes with SIGSEGV inside libnvidia-glcore.so, called from FVulkanFenceManager::WaitForFence ← FVulkanSwapChain::AcquireImageIndex (VulkanSwapChain.cpp:773) ← FVulkanViewport::Present. The editor closes.
The fault address is usually 0x0 (“SIGSEGV: unaligned memory access at address 0x0000000000000000”), and once it was a wild pointer (“invalid attempt to read memory at address 0x0000002800000076”). In 100% of the 11 crash logs, the crash is preceded by “AcquireNextImage() failed due to the outdated swapchain” within ~2 seconds. The events just before it are things like “LogSlate: Window ‘Project Settings’ being destroyed”, “Window ‘Message Log’ being destroyed”, the PIE window being destroyed with UWorld::CleanupWorld, and “Shutting down PIE online subsystems”.
Affects Versions
5.8
Platform(s)
Linux
For crash reports, include your callstack
[2026.10.10-23.05.30:772][ 58]LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.
[2026.10.10-23.05.30:906][ 59]LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.
[2026.10.10-23.05.34:610][250]LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.
[2026.10.10-23.05.34:934][254]LogCore: === Critical error: ===
Unhandled Exception: SIGSEGV: unaligned memory access at address 0x0000000000000000 (SIMD vectors?)
[2026.10.10-23.05.34:934][254]LogCore: Fatal error!
0x000073762d627645 libnvidia-glcore.so.595.104.02!UnknownFunction(0xe27645)
0x000073762d62bb87 libnvidia-glcore.so.595.104.02!UnknownFunction(0xe2bb86)
0x000073762d53b4fe libnvidia-glcore.so.595.104.02!UnknownFunction(0xd3b4fd)
0x0000737659eeb0a4 libUnrealEditor-VulkanRHI.so!FVulkanFenceManager::WaitForFence(FVulkanFence*, unsigned long long) [Engine/Source/./Runtime/VulkanRHI/Private/VulkanSynchronization.cpp:127]
0x0000737659eead05 libUnrealEditor-VulkanRHI.so!FVulkanSwapChain::AcquireImageIndex(TRefCountPtr) [Engine/Source/./Runtime/VulkanRHI/Private/VulkanSwapChain.cpp:773]
0x0000737659f30d0c libUnrealEditor-VulkanRHI.so!FVulkanViewport::TryAcquireImageIndex(FVulkanCommandListContext&) [Engine/Source/./Runtime/VulkanRHI/Private/VulkanViewport.cpp:241]
0x0000737659f3498d libUnrealEditor-VulkanRHI.so!FVulkanViewport::Present(FVulkanCommandListContext&, FRHIPresentArgs const&) [Engine/Source/./Runtime/VulkanRHI/Private/VulkanViewport.cpp:748]
0x0000737659f027fe libUnrealEditor-VulkanRHI.so!FVulkanDynamicRHI::RHIEndDrawingViewport(FRHICommandListImmediate&, FRHIViewport, FRHIPresentArgs const&)::$_0::operator()(FRHICommandListImmediate&) const [Engine/Source/./Runtime/VulkanRHI/Private/VulkanRHI.cpp:1320]
0x0000737659f0294d libUnrealEditor-VulkanRHI.so!TRHILambdaCommand<FRHICommandListImmediate, FVulkanDynamicRHI::RHIEndDrawingViewport(…)::$_0>::ExecuteAndDestruct(FRHICommandListBase&)
0x0000737751441539 libUnrealEditor-RHI.so!FRHICommandListBase::Execute() [Engine/Source/./Runtime/RHI/Private/RHICommandList.cpp:546]
0x0000737751444197 libUnrealEditor-RHI.so!FRHICommandListExecutor::FTranslateState::Translate_ExecuteCommandList(FRHICommandListBase*) [Engine/Source/./Runtime/RHI/Private/RHICommandList.cpp:1231]
0x0000737751441c9e libUnrealEditor-RHI.so!FRHICommandListExecutor::FTaskPipe::Execute(…) const
0x0000737759264fcd libUnrealEditor-Core.so!TGraphTask<TFunctionGraphTaskImpl<void (ENamedThreads::Type, TRefCountPtr const&), (ESubsequentsMode::Type)0> >::ExecuteTask()
0x0000737758a242f6 libUnrealEditor-Core.so!UE::Tasks::Private::FTaskBase::TryExecuteTask() [Engine/Source/Runtime/Core/Public/Tasks/TaskPrivate.h:524]
0x0000737758a236bd libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksNamedThread(int, bool)
0x0000737758a2278f libUnrealEditor-Core.so!FNamedTaskThread::ProcessTasksUntilQuit(int) [Engine/Source/./Runtime/Core/Private/Async/TaskGraph.cpp:695]
0x000073775117b2a9 libUnrealEditor-RenderCore.so!FRHIThread::Run() [Engine/Source/./Runtime/RenderCore/Private/RenderingThread.cpp:213]
0x0000737758cdfd66 libUnrealEditor-Core.so!FRunnableThreadPThread::Run() [Engine/Source/./Runtime/Core/Private/HAL/PThreadRunnableThread.cpp:25]
0x0000737758c29413 libUnrealEditor-Core.so!FRunnableThreadPThread::_ThreadProc(void*)
0x000073774c09cb84 libc.so.6!UnknownFunction(0x9cb83)
0x000073774c129ecc libc.so.6!UnknownFunction(0x129ecb)
[2026.10.10-23.05.34:948][254]LogExit: Executing StaticShutdownAfterError
[2026.10.10-23.05.34:959][254]LogRHI: Error: Breadcrumbs ‘RHIThread’
- EndDrawingViewport
- Frame 253
Same crash in the Project Browser (no project loaded, no DLSS; UE 5.8.2, driver 595.84):
[2026.10.02-00.04.26:458][943]LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.
[2026.10.02-00.04.29:709][304]LogVulkanRHI: AcquireNextImage() failed due to the outdated swapchain, not even attempting to present.
[2026.10.02-00.04.30:025][312]LogCore: === Critical error: ===
Unhandled Exception: SIGSEGV: invalid attempt to read memory at address 0x0000002800000076
libnvidia-glcore.so.595.84!UnknownFunction(0xe26ea4)
libnvidia-glcore.so.595.84!UnknownFunction(0xe2b386)
libnvidia-glcore.so.595.84!UnknownFunction(0xd3ad1d)
libUnrealEditor-VulkanRHI.so!FVulkanFenceManager::WaitForFence(FVulkanFence*, unsigned long long) […/VulkanSynchronization.cpp:127]
libUnrealEditor-VulkanRHI.so!FVulkanSwapChain::AcquireImageIndex(TRefCountPtr*) […/VulkanSwapChain.cpp:773]
…
Additional Notes
Environment
- Engine: 5.8.3-58210709+++UE5+Release-5.8 (also 5.8.2-56702186), binary Linux release, Development Editor
- OS: Pop!_OS 24.04 LTS, kernel 7.1.5-76070105-generic
- Desktop: COSMIC (cosmic-comp), Wayland session; editor runs through XWayland 24.1.13 (“Using SDL video driver ‘x11’”)
- CPU: AMD Ryzen 5 5600 (6C/12T); RAM: 32 GB
- GPU: NVIDIA GeForce RTX 4060 8 GB (AD107), VBIOS 95.07.31.40.1B
- Driver: NVIDIA open kernel module 595.104.02 (also 595.84)
- Vulkan: driver API 1.4.329, engine uses API 1.3, loader 1.3.280
- Swapchain: VK_PRESENT_MODE_IMMEDIATE_KHR, VK_FORMAT_B8G8R8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, 3 images
Crash statistics (Oct 1–10, 2026), all with the stack above
- UE 5.8.2 + driver 595.84: 2 crashes (one of them in the Project Browser, no project loaded)
- UE 5.8.3 + driver 595.84: 5 crashes
- UE 5.8.3 + driver 595.104.02: 4 crashes
These happened with and without NVIDIA DLSS active. The Streamline plugins are stubbed out on Linux (“Streamline is not supported on this platform at build time”), so nothing hooks the swapchain.
Analysis
FVulkanSwapChain::AcquireImageIndex, with the default r.Vulkan.CpuWaitForFence=1:
const VkFence AcquiredFence = GShouldCpuWaitForFence ? ImageAcquiredFences[SyncIndex]->GetHandle() : VK_NULL_HANDLE;
const VkSemaphore AcquiredSemaphore = GShouldCpuWaitForFence ? VK_NULL_HANDLE : ImageAcquiredSemaphore[SyncIndex]->GetHandle();
Result = VulkanRHI::vkAcquireNextImageKHR(Device.GetHandle(), SwapChain, UINT64_MAX, AcquiredSemaphore, AcquiredFence, &ImageIndex);
…
if (GShouldCpuWaitForFence)
{
FVulkanFenceManager& FenceMgr = Device.GetFenceManager();
const bool bResult = FenceMgr.WaitForFence(ImageAcquiredFences[SyncIndex], UINT64_MAX); // line 773 → crashes inside the driver
ensure(bResult);
FenceMgr.ResetFence(ImageAcquiredFences[SyncIndex]);
}
The crash happens on the first acquires after the swapchain is recreated following VK_ERROR_OUT_OF_DATE_KHR. With the default r.Vulkan.KeepSwapChain=1, the old swapchain is passed as oldSwapchain during that recreation. vkAcquireNextImageKHR itself returns success, so the checkf does not fire. The following vkWaitForFences on the acquire fence then segfaults inside libnvidia-glcore.
This looks like an NVIDIA driver bug in how acquire fences are signaled for a recreated or retired swapchain on the XWayland/X11 WSI path. However, UE is the one choosing the CPU-fence acquire path by default on desktop Linux. The semaphore path never calls vkWaitForFences on the acquire fence and avoids the crash completely.
Workaround that fixed it
We added this to Engine/Config/Linux/LinuxEngine.ini, in the existing [ConsoleVariables] section, so it covers the editor and packaged Linux games. We also added it to the project’s Config/Linux/LinuxEngine.ini so it ships with the project.
[ConsoleVariables]
; Use semaphores instead of fences for swapchain image wait (avoids NVIDIA driver crash in vkWaitForFences after an out-of-date swapchain)
r.Vulkan.CpuWaitForFence=0
The CVar is ECVF_ReadOnly, so it has to be set from an ini at startup. ConsoleVariables.ini is not enough for Shipping/Test builds, because it is skipped under DISABLE_CHEAT_CVARS. The log confirms the value is applied:
LogConfig: Set CVar [[r.Vulkan.CpuWaitForFence:0]]
LogConfig: CVar [[r.Vulkan.CpuWaitForFence:0]] deferred - dummy variable created
Result after the change: 13 editor sessions (two different projects and the Project Browser) produced 161 “outdated swapchain” events, including a single session with 57, and 0 crashes. Before the change, the crash happened after as few as 4 such events. r.Vulkan.KeepSwapChain=0 was not needed. We saw no visible side effects, no stutter, and no presentation problems.
Other notes
- This also affects packaged games, not just the editor: the same VulkanRHI code runs at runtime. In a game, the swapchain goes out of date on window resize, fullscreen toggle, alt-tab, minimize, or resolution change.
- We did not test whether forcing FIFO (VSync) instead of IMMEDIATE also avoids the crash.
Can potentially be related with this SteamOS problem, but I don’t really know: SteamOS Unreal Engine 5.8 - #8 by JN_Morissette