From d3b251bb99e6cb8fbaf19c351bfd41a9cc26534d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= Date: Sun, 21 Apr 2024 22:57:23 +0200 Subject: [PATCH] Revert "d3d11: calc vsync interval on real stats, not just last interval" The values provided since last disjoint event may include significant error in case there are periods of slower presentation. We should look at more localized/current values of presentation. For more accurate approximation of vsync rate I plan to add better algorithm to calculate it. Revert this commit alone as it is not neccessary and gives as separation from other changes for better regression testing. This reverts commit f27767f59e2dd459b909b00187b27f3c6fb72a20. --- video/out/d3d11/context.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/video/out/d3d11/context.c b/video/out/d3d11/context.c index f183ae8be5..8836af16e0 100644 --- a/video/out/d3d11/context.c +++ b/video/out/d3d11/context.c @@ -99,8 +99,8 @@ struct priv { struct pl_color_space swapchain_csp; int64_t perf_freq; - unsigned sync_refresh_count; - int64_t sync_qpc_time; + unsigned last_sync_refresh_count; + int64_t last_sync_qpc_time; int64_t vsync_duration_qpc; int64_t last_submit_qpc; }; @@ -273,33 +273,28 @@ static void d3d11_get_vsync(struct ra_swapchain *sw, struct vo_vsync_info *info) DXGI_FRAME_STATISTICS stats; hr = IDXGISwapChain_GetFrameStatistics(p->swapchain, &stats); if (hr == DXGI_ERROR_FRAME_STATISTICS_DISJOINT) { - p->sync_refresh_count = 0; - p->sync_qpc_time = 0; + p->last_sync_refresh_count = 0; + p->last_sync_qpc_time = 0; } if (FAILED(hr)) return; - info->last_queue_display_time = 0; - info->vsync_duration = 0; // Detecting skipped vsyncs is possible but not supported yet info->skipped_vsyncs = -1; - // Get the number of physical vsyncs that have passed since the start of the - // playback or disjoint event. + // Get the number of physical vsyncs that have passed since the last call. // Check for 0 here, since sometimes GetFrameStatistics returns S_OK but // with 0s in some (all?) members of DXGI_FRAME_STATISTICS. unsigned src_passed = 0; - if (stats.SyncRefreshCount && p->sync_refresh_count) - src_passed = stats.SyncRefreshCount - p->sync_refresh_count; - if (p->sync_refresh_count == 0) - p->sync_refresh_count = stats.SyncRefreshCount; + if (stats.SyncRefreshCount && p->last_sync_refresh_count) + src_passed = stats.SyncRefreshCount - p->last_sync_refresh_count; + p->last_sync_refresh_count = stats.SyncRefreshCount; // Get the elapsed time passed between the above vsyncs unsigned sqt_passed = 0; - if (stats.SyncQPCTime.QuadPart && p->sync_qpc_time) - sqt_passed = stats.SyncQPCTime.QuadPart - p->sync_qpc_time; - if (p->sync_qpc_time == 0) - p->sync_qpc_time = stats.SyncQPCTime.QuadPart; + if (stats.SyncQPCTime.QuadPart && p->last_sync_qpc_time) + sqt_passed = stats.SyncQPCTime.QuadPart - p->last_sync_qpc_time; + p->last_sync_qpc_time = stats.SyncQPCTime.QuadPart; // If any vsyncs have passed, estimate the physical frame rate if (src_passed && sqt_passed)