diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index b0516435..5e8ee41d 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -778,10 +778,6 @@ namespace dxvk { auto swapImage = m_backBuffers[0]->GetCommonTexture()->GetImage(); auto swapImageView = m_backBuffers[0]->GetImageView(false); - // Wait for the sync event so that we respect the maximum frame latency - uint64_t frameId = ++m_frameId; - m_frameLatencySignal->wait(frameId - GetActualFrameLatency()); - for (uint32_t i = 0; i < SyncInterval || i < 1; i++) { SynchronizePresent(); @@ -819,11 +815,16 @@ namespace dxvk { m_hud->render(m_context, info.format, info.imageExtent); if (i + 1 >= SyncInterval) - m_context->signal(m_frameLatencySignal, frameId); + m_context->signal(m_frameLatencySignal, m_frameId); SubmitPresent(sync, i); } + // Bump our frame id. + ++m_frameId; + + SyncFrameLatency(); + // Rotate swap chain buffers so that the back // buffer at index 0 becomes the front buffer. for (uint32_t i = 1; i < m_backBuffers.size(); i++) @@ -1055,6 +1056,11 @@ namespace dxvk { } + void D3D9SwapChainEx::SyncFrameLatency() { + // Wait for the sync event so that we respect the maximum frame latency + m_frameLatencySignal->wait(m_frameId - GetActualFrameLatency()); + } + uint32_t D3D9SwapChainEx::GetActualFrameLatency() { uint32_t maxFrameLatency = m_parent->GetFrameLatency(); diff --git a/src/d3d9/d3d9_swapchain.h b/src/d3d9/d3d9_swapchain.h index 617c1de8..ca21f69f 100644 --- a/src/d3d9/d3d9_swapchain.h +++ b/src/d3d9/d3d9_swapchain.h @@ -76,6 +76,8 @@ namespace dxvk { const D3DPRESENT_PARAMETERS* GetPresentParams() const { return &m_presentParams; } + void SyncFrameLatency(); + private: enum BindingIds : uint32_t {