From 5674abe483b4350fe173317132438ea57a3b5bba Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 6 Jun 2024 10:44:20 +0200 Subject: [PATCH] [d3d9] Limit frame rate to display refresh as necessary --- src/d3d9/d3d9_swapchain.cpp | 13 ++++++++++++- src/d3d9/d3d9_swapchain.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index 577243306..1d1c7c382 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -191,6 +191,7 @@ namespace dxvk { if (!m_wctx->presenter->hasSwapChain()) return D3D_OK; + UpdateTargetFrameRate(presentInterval); PresentImage(presentInterval); return D3D_OK; } catch (const DxvkError& e) { @@ -927,7 +928,6 @@ namespace dxvk { presenterDesc.fullScreenExclusive = PickFullscreenMode(); m_wctx->presenter = new Presenter(m_device, m_wctx->frameLatencySignal, presenterDesc); - m_wctx->presenter->setFrameRateLimit(m_parent->GetOptions()->maxFrameRate); } @@ -1107,6 +1107,17 @@ namespace dxvk { } + void D3D9SwapChainEx::UpdateTargetFrameRate(uint32_t SyncInterval) { + double frameRateOption = double(m_parent->GetOptions()->maxFrameRate); + double frameRate = std::max(frameRateOption, 0.0); + + if (SyncInterval && frameRateOption == 0.0) + frameRate = -m_displayRefreshRate / double(SyncInterval); + + m_wctx->presenter->setFrameRateLimit(frameRate); + } + + void D3D9SwapChainEx::SyncFrameLatency() { // Wait for the sync event so that we respect the maximum frame latency m_wctx->frameLatencySignal->wait(m_wctx->frameId - GetActualFrameLatency()); diff --git a/src/d3d9/d3d9_swapchain.h b/src/d3d9/d3d9_swapchain.h index c6cfef27d..325ba18a1 100644 --- a/src/d3d9/d3d9_swapchain.h +++ b/src/d3d9/d3d9_swapchain.h @@ -213,6 +213,8 @@ namespace dxvk { void InitRamp(); + void UpdateTargetFrameRate(uint32_t SyncInterval); + uint32_t GetActualFrameLatency(); uint32_t PickFormats(