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)