From fc1f225c688036b58f19f5ba1447d02e61ab55f1 Mon Sep 17 00:00:00 2001 From: Christopher Cameron Date: Fri, 21 Jul 2023 13:02:06 +0000 Subject: [PATCH] DelayBasedBeginFrameSourceMac: Handle VSync parameter skew The VSync parameters on macOS change over time. In compensation for this, we re-compute them every 10 seconds (see the initial implementation in crrev.com/343739). This function to trigger to update update code wasn't copied when creating DelayBasedBeginFrameSourceMac, re-introducing the the VSync skew bug. Re-add the function (note that all of the supporting variables, like DelayBasedBeginFrameSourceMac::time_source_next_update_time_ were correctly copied). Bug: 1450617 Change-Id: Id383b64e9c9d87c1c105aa260a1f3434ced85b80 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4705225 Reviewed-by: Vasiliy Telezhnikov Commit-Queue: Prudhvikumar Bommana Cr-Commit-Position: refs/branch-heads/5790@{#1790} Cr-Branched-From: 1d71a337b1f6e707a13ae074dca1e2c34905eb9f-refs/heads/main@{#1148114} --- .../frame_sinks/external_begin_frame_source_mac.cc | 10 ++++++++++ .../frame_sinks/external_begin_frame_source_mac.h | 1 + 2 files changed, 11 insertions(+) diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mac.cc b/components/viz/service/frame_sinks/external_begin_frame_source_mac.cc index 818a46df8059fe..1070c95dcf1d93 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_mac.cc +++ b/components/viz/service/frame_sinks/external_begin_frame_source_mac.cc @@ -135,4 +135,14 @@ void DelayBasedBeginFrameSourceMac::OnTimeSourceParamsUpdate( OnUpdateVSyncParameters(params.display_timebase, params.display_interval); } +void DelayBasedBeginFrameSourceMac::OnTimerTick() { + // The VSync parameters skew over time (astonishingly quickly -- 0.1 msec per + // second). If too much time has elapsed since the last time the vsync + // parameters were calculated, re-calculate them. + if (base::TimeTicks::Now() >= time_source_next_update_time_) { + RequestTimeSourceParamsUpdate(); + } + DelayBasedBeginFrameSource::OnTimerTick(); +} + } // namespace viz diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mac.h b/components/viz/service/frame_sinks/external_begin_frame_source_mac.h index 8148fd996402f9..15290954940a8c 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_mac.h +++ b/components/viz/service/frame_sinks/external_begin_frame_source_mac.h @@ -86,6 +86,7 @@ class VIZ_COMMON_EXPORT DelayBasedBeginFrameSourceMac // BeginFrameSource implementation. void SetVSyncDisplayID(int64_t display_id) override; + void OnTimerTick() override; private: // Request a callback from DisplayLinkMac, and the callback function.