From 57af9e8760bd45c2c4f14212a929be71d46c1ca5 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 15 Sep 2022 14:58:31 +0200 Subject: [PATCH] [dxgi] Estimate vblank count for frame statistics --- src/dxgi/dxgi_output.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/dxgi/dxgi_output.cpp b/src/dxgi/dxgi_output.cpp index 6f2cc98c6..23ef7369c 100644 --- a/src/dxgi/dxgi_output.cpp +++ b/src/dxgi/dxgi_output.cpp @@ -370,9 +370,26 @@ namespace dxvk { static bool s_errorShown = false; if (!std::exchange(s_errorShown, true)) - Logger::warn("DxgiOutput::GetFrameStatistics: Stub"); + Logger::warn("DxgiOutput::GetFrameStatistics: Frame statistics may be inaccurate"); + + // Estimate vblank count based on last known display mode. Querying + // the display mode on every call would be prohibitively expensive. + auto refreshPeriod = computeRefreshPeriod( + monitorInfo->LastMode.RefreshRate.Numerator, + monitorInfo->LastMode.RefreshRate.Denominator); + + // We don't really have a way to query time since boot + auto t1Counter = dxvk::high_resolution_clock::get_counter(); + + auto t0 = dxvk::high_resolution_clock::get_time_from_counter(monitorInfo->FrameStats.SyncQPCTime.QuadPart); + auto t1 = dxvk::high_resolution_clock::get_time_from_counter(t1Counter); + + pStats->PresentCount = monitorInfo->FrameStats.PresentCount; + pStats->PresentRefreshCount = monitorInfo->FrameStats.PresentRefreshCount; + pStats->SyncRefreshCount = monitorInfo->FrameStats.SyncRefreshCount + computeRefreshCount(t0, t1, refreshPeriod); + pStats->SyncQPCTime.QuadPart = t1Counter; + pStats->SyncGPUTime.QuadPart = 0; - *pStats = monitorInfo->FrameStats; m_monitorInfo->ReleaseMonitorData(); return S_OK; }