From 1b39d163e4059ef963663244d308da0b6408aeab Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 5 Mar 2025 19:37:25 +0100 Subject: [PATCH] [dxvk] Do not use present fences from EXT_swapchain_maintenance1 --- src/dxvk/dxvk_presenter.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/dxvk/dxvk_presenter.cpp b/src/dxvk/dxvk_presenter.cpp index 0e3c87762..7afad5994 100644 --- a/src/dxvk/dxvk_presenter.cpp +++ b/src/dxvk/dxvk_presenter.cpp @@ -194,17 +194,27 @@ namespace dxvk { if (m_device->features().extSwapchainMaintenance1.swapchainMaintenance1) { modeInfo.pNext = const_cast(std::exchange(info.pNext, &modeInfo)); - fenceInfo.pNext = const_cast(std::exchange(info.pNext, &fenceInfo)); + + // It is not clear if present fences are supposed to get signaled if + // presentation itself fails, e.g. with OUT_OF_DATE_KHR. Until this + // is clarified, we cannot use the feature. + // fenceInfo.pNext = const_cast(std::exchange(info.pNext, &fenceInfo)); } VkResult status = m_vkd->vkQueuePresentKHR( m_device->queues().graphics.queueHandle, &info); + // Signal the present fence in a naive way + if (status != VK_ERROR_DEVICE_LOST) { + VkResult vr = m_vkd->vkQueueSubmit2(m_device->queues().graphics.queueHandle, 0, nullptr, currSync.fence); + currSync.fenceSignaled = vr == VK_SUCCESS; + + if (vr != VK_SUCCESS) + Logger::err(str::format("Failed to signal emulated present fence: ", vr)); + } + // Maintain valid state if presentation succeeded, even // if we want to recreate the swapchain. - if (m_device->features().extSwapchainMaintenance1.swapchainMaintenance1) - currSync.fenceSignaled = status >= 0; - if (status >= 0) { m_acquireStatus = VK_NOT_READY;