1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 16:29:16 +01:00

[dxvk] Move deferSurfaceCreation handling to backend

This commit is contained in:
Philip Rebohle 2025-01-12 19:07:11 +01:00 committed by Philip Rebohle
parent ab9646551f
commit 63e88debee
4 changed files with 14 additions and 12 deletions

View File

@ -69,9 +69,6 @@ namespace dxvk {
CreateBackBuffers(); CreateBackBuffers();
CreateBlitter(); CreateBlitter();
CreateHud(); CreateHud();
if (!pDevice->GetOptions()->deferSurfaceCreation)
RecreateSwapChain();
} }
@ -531,6 +528,7 @@ namespace dxvk {
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height }; presenterDesc.imageExtent = { m_desc.Width, m_desc.Height };
presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1); presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1);
presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats); presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats);
presenterDesc.deferSurfaceCreation = m_parent->GetOptions()->deferSurfaceCreation;
m_presenter = new Presenter(m_device, m_frameLatencySignal, presenterDesc, [ m_presenter = new Presenter(m_device, m_frameLatencySignal, presenterDesc, [
cAdapter = m_device->adapter(), cAdapter = m_device->adapter(),

View File

@ -36,13 +36,9 @@ namespace dxvk {
UpdatePresentRegion(nullptr, nullptr); UpdatePresentRegion(nullptr, nullptr);
if (m_window) { if (m_window)
CreatePresenter(); CreatePresenter();
if (!pDevice->GetOptions()->deferSurfaceCreation)
RecreateSwapChain();
}
if (FAILED(CreateBackBuffers(m_presentParams.BackBufferCount, m_presentParams.Flags))) if (FAILED(CreateBackBuffers(m_presentParams.BackBufferCount, m_presentParams.Flags)))
throw DxvkError("D3D9: Failed to create swapchain backbuffers"); throw DxvkError("D3D9: Failed to create swapchain backbuffers");
@ -972,6 +968,7 @@ namespace dxvk {
presenterDesc.imageExtent = GetPresentExtent(); presenterDesc.imageExtent = GetPresentExtent();
presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1); presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1);
presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats); presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats);
presenterDesc.deferSurfaceCreation = m_parent->GetOptions()->deferSurfaceCreation;
m_wctx->presenter = new Presenter(m_device, m_wctx->presenter = new Presenter(m_device,
m_wctx->frameLatencySignal, presenterDesc, [ m_wctx->frameLatencySignal, presenterDesc, [

View File

@ -27,6 +27,12 @@ namespace dxvk {
// with present operations and periodically signals the event // with present operations and periodically signals the event
if (m_device->features().khrPresentWait.presentWait && m_signal != nullptr) if (m_device->features().khrPresentWait.presentWait && m_signal != nullptr)
m_frameThread = dxvk::thread([this] { runFrameThread(); }); 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();
} }

View File

@ -32,10 +32,11 @@ namespace dxvk {
* an input during swap chain creation. * an input during swap chain creation.
*/ */
struct PresenterDesc { struct PresenterDesc {
VkExtent2D imageExtent; VkExtent2D imageExtent = { };
uint32_t imageCount; uint32_t imageCount = 0u;
uint32_t numFormats; uint32_t numFormats = 0u;
VkSurfaceFormatKHR formats[4]; VkSurfaceFormatKHR formats[4] = { };
bool deferSurfaceCreation = false;
}; };
/** /**