From ae01bd8bd40cd8dbcc35dfedbabe9624d31fa72e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 4 Jan 2020 11:18:51 +0100 Subject: [PATCH] [dxgi] Ignore sync interval if PRESENT_TEST is used Otherwise, the following sequence leads to the Vulkan swap chain being recreated once per frame: swapchain->Present(0, DXGI_PRESENT_TEST); swapchain->Present(1, 0); Found while investigating #1314. --- src/d3d11/d3d11_swapchain.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index 6577331c9..eaedcf372 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -199,11 +199,13 @@ namespace dxvk { if (options->syncInterval >= 0) SyncInterval = options->syncInterval; - - bool vsync = SyncInterval != 0; - m_dirty |= vsync != m_vsync; - m_vsync = vsync; + if (!(PresentFlags & DXGI_PRESENT_TEST)) { + bool vsync = SyncInterval != 0; + + m_dirty |= vsync != m_vsync; + m_vsync = vsync; + } if (m_presenter == nullptr) CreatePresenter(); @@ -211,7 +213,7 @@ namespace dxvk { HRESULT hr = S_OK; if (!m_presenter->hasSwapChain()) { - RecreateSwapChain(vsync); + RecreateSwapChain(m_vsync); m_dirty = false; } @@ -225,7 +227,7 @@ namespace dxvk { return hr; if (std::exchange(m_dirty, false)) - RecreateSwapChain(vsync); + RecreateSwapChain(m_vsync); try { PresentImage(SyncInterval);