From 28f42957655eef76706c2365440acb3e1af6d858 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 16 Jan 2025 10:27:36 +0100 Subject: [PATCH] [dxvk] Soften error reporting from the presenter --- src/dxvk/dxvk_presenter.cpp | 18 ++++++++++++++++-- src/dxvk/dxvk_presenter.h | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/dxvk/dxvk_presenter.cpp b/src/dxvk/dxvk_presenter.cpp index e5016ebcc..445e9e924 100644 --- a/src/dxvk/dxvk_presenter.cpp +++ b/src/dxvk/dxvk_presenter.cpp @@ -86,7 +86,7 @@ namespace dxvk { VkResult vr = recreateSwapChain(); if (vr != VK_SUCCESS) - return vr; + return softError(vr); PresenterSync sync = m_semaphores.at(m_frameIndex); @@ -95,7 +95,7 @@ namespace dxvk { sync.acquire, VK_NULL_HANDLE, &m_imageIndex); if (m_acquireStatus < 0) - return m_acquireStatus; + return softError(m_acquireStatus); } // Update HDR metadata after a successful acquire. We know @@ -951,4 +951,18 @@ namespace dxvk { } } + + VkResult Presenter::softError( + VkResult vr) { + // Don't return these as an error state to the caller. The app can't + // do much anyway, so just pretend that we don't have a valid swap + // chain and move on. An alternative would be to handle errors in a + // loop, however this may also not be desireable since it could stall + // the app indefinitely in case the surface is in a weird state. + if (vr == VK_ERROR_SURFACE_LOST_KHR || vr == VK_ERROR_OUT_OF_DATE_KHR) + return VK_NOT_READY; + + return vr; + } + } diff --git a/src/dxvk/dxvk_presenter.h b/src/dxvk/dxvk_presenter.h index 3222634ed..d840dea93 100644 --- a/src/dxvk/dxvk_presenter.h +++ b/src/dxvk/dxvk_presenter.h @@ -304,6 +304,9 @@ namespace dxvk { void runFrameThread(); + static VkResult softError( + VkResult vr); + }; }