From 81f6ccb1bec0b22fb871d09a63beeb1f37e65c09 Mon Sep 17 00:00:00 2001 From: Philip Rebohle <philip.rebohle@tu-dortmund.de> Date: Tue, 23 Apr 2019 16:51:50 +0200 Subject: [PATCH] [d3d11] Select sync event based on back buffer count May improve frame pacing in some games. --- src/d3d11/d3d11_device.cpp | 6 +++++- src/d3d11/d3d11_device.h | 3 ++- src/d3d11/d3d11_swapchain.cpp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 5bfffbde3..34dc50aa0 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -1985,8 +1985,12 @@ namespace dxvk { } - Rc<DxvkEvent> STDMETHODCALLTYPE D3D11DXGIDevice::GetFrameSyncEvent() { + Rc<DxvkEvent> STDMETHODCALLTYPE D3D11DXGIDevice::GetFrameSyncEvent(UINT BufferCount) { uint32_t frameLatency = m_frameLatency; + + if (BufferCount != 0 + && BufferCount <= frameLatency) + frameLatency = BufferCount; if (m_frameLatencyCap != 0 && m_frameLatencyCap <= frameLatency) diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index a8e2df400..62643f651 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -500,7 +500,8 @@ namespace dxvk { void STDMETHODCALLTYPE Trim() final; - Rc<DxvkEvent> STDMETHODCALLTYPE GetFrameSyncEvent(); + Rc<DxvkEvent> STDMETHODCALLTYPE GetFrameSyncEvent( + UINT BufferCount); Rc<DxvkDevice> STDMETHODCALLTYPE GetDXVKDevice(); diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index b74f30ce6..5b9177340 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -200,7 +200,7 @@ namespace dxvk { void D3D11SwapChain::PresentImage(UINT SyncInterval) { // Wait for the sync event so that we // respect the maximum frame latency - Rc<DxvkEvent> syncEvent = m_dxgiDevice->GetFrameSyncEvent(); + Rc<DxvkEvent> syncEvent = m_dxgiDevice->GetFrameSyncEvent(m_desc.BufferCount); syncEvent->wait(); if (m_hud != nullptr)