From 63e88debee03a9cdcf203a615431bcb404de8bec Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 12 Jan 2025 19:07:11 +0100 Subject: [PATCH] [dxvk] Move deferSurfaceCreation handling to backend --- src/d3d11/d3d11_swapchain.cpp | 4 +--- src/d3d9/d3d9_swapchain.cpp | 7 ++----- src/dxvk/dxvk_presenter.cpp | 6 ++++++ src/dxvk/dxvk_presenter.h | 9 +++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index 6a8a1ed99..7e489f147 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -69,9 +69,6 @@ namespace dxvk { CreateBackBuffers(); CreateBlitter(); CreateHud(); - - if (!pDevice->GetOptions()->deferSurfaceCreation) - RecreateSwapChain(); } @@ -531,6 +528,7 @@ namespace dxvk { presenterDesc.imageExtent = { m_desc.Width, m_desc.Height }; presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1); presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats); + presenterDesc.deferSurfaceCreation = m_parent->GetOptions()->deferSurfaceCreation; m_presenter = new Presenter(m_device, m_frameLatencySignal, presenterDesc, [ cAdapter = m_device->adapter(), diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index 8a08497d9..c302c493e 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -36,13 +36,9 @@ namespace dxvk { UpdatePresentRegion(nullptr, nullptr); - if (m_window) { + if (m_window) CreatePresenter(); - if (!pDevice->GetOptions()->deferSurfaceCreation) - RecreateSwapChain(); - } - if (FAILED(CreateBackBuffers(m_presentParams.BackBufferCount, m_presentParams.Flags))) throw DxvkError("D3D9: Failed to create swapchain backbuffers"); @@ -972,6 +968,7 @@ namespace dxvk { presenterDesc.imageExtent = GetPresentExtent(); presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1); presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats); + presenterDesc.deferSurfaceCreation = m_parent->GetOptions()->deferSurfaceCreation; m_wctx->presenter = new Presenter(m_device, m_wctx->frameLatencySignal, presenterDesc, [ diff --git a/src/dxvk/dxvk_presenter.cpp b/src/dxvk/dxvk_presenter.cpp index a30f61dd6..224b8d97f 100644 --- a/src/dxvk/dxvk_presenter.cpp +++ b/src/dxvk/dxvk_presenter.cpp @@ -27,6 +27,12 @@ namespace dxvk { // with present operations and periodically signals the event if (m_device->features().khrPresentWait.presentWait && m_signal != nullptr) m_frameThread = dxvk::thread([this] { runFrameThread(); }); + + // Create Vulkan surface immediately if possible, but ignore + // failures since the app window may still be in use in some + // way at this point, e.g. by a different device. + if (!desc.deferSurfaceCreation) + createSurface(); } diff --git a/src/dxvk/dxvk_presenter.h b/src/dxvk/dxvk_presenter.h index 324a8066a..e10ca91af 100644 --- a/src/dxvk/dxvk_presenter.h +++ b/src/dxvk/dxvk_presenter.h @@ -32,10 +32,11 @@ namespace dxvk { * an input during swap chain creation. */ struct PresenterDesc { - VkExtent2D imageExtent; - uint32_t imageCount; - uint32_t numFormats; - VkSurfaceFormatKHR formats[4]; + VkExtent2D imageExtent = { }; + uint32_t imageCount = 0u; + uint32_t numFormats = 0u; + VkSurfaceFormatKHR formats[4] = { }; + bool deferSurfaceCreation = false; }; /**