From c10072173e9f534e419a080cba9b0b0a2513e700 Mon Sep 17 00:00:00 2001 From: Fedor Date: Sun, 12 Apr 2020 12:57:35 +0300 Subject: [PATCH] Remove nsRefreshDriver's use of high res system timers. --- layout/base/nsRefreshDriver.cpp | 98 --------------------------------- layout/base/nsRefreshDriver.h | 5 -- 2 files changed, 103 deletions(-) diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index 5ea7a0188..c0d09d2a0 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -851,12 +851,6 @@ NS_IMPL_ISUPPORTS(VsyncChildCreateCallback, nsIIPCBackgroundChildCreateCallback) static StaticRefPtr sRegularRateTimer; static StaticRefPtr sThrottledRateTimer; -#ifdef XP_WIN -static int32_t sHighPrecisionTimerRequests = 0; -// a bare pointer to avoid introducing a static constructor -static nsITimer *sDisableHighPrecisionTimersTimer = nullptr; -#endif - static void CreateContentVsyncRefreshTimer(void*) { @@ -934,16 +928,6 @@ nsRefreshDriver::Shutdown() sRegularRateTimer = nullptr; sThrottledRateTimer = nullptr; - -#ifdef XP_WIN - if (sDisableHighPrecisionTimersTimer) { - sDisableHighPrecisionTimersTimer->Cancel(); - NS_RELEASE(sDisableHighPrecisionTimersTimer); - timeEndPeriod(1); - } else if (sHighPrecisionTimerRequests) { - timeEndPeriod(1); - } -#endif } /* static */ int32_t @@ -1062,7 +1046,6 @@ nsRefreshDriver::nsRefreshDriver(nsPresContext* aPresContext) mNeedToRecomputeVisibility(false), mTestControllingRefreshes(false), mViewManagerFlushIsPending(false), - mRequestedHighPrecision(false), mInRefresh(false), mWaitingForTransaction(false), mSkippedPaints(false), @@ -1300,83 +1283,6 @@ nsRefreshDriver::StopTimer() mActiveTimer->RemoveRefreshDriver(this); mActiveTimer = nullptr; - - if (mRequestedHighPrecision) { - SetHighPrecisionTimersEnabled(false); - } -} - -#ifdef XP_WIN -static void -DisableHighPrecisionTimersCallback(nsITimer *aTimer, void *aClosure) -{ - timeEndPeriod(1); - NS_RELEASE(sDisableHighPrecisionTimersTimer); -} -#endif - -void -nsRefreshDriver::ConfigureHighPrecision() -{ - bool haveUnthrottledFrameRequestCallbacks = - mFrameRequestCallbackDocs.Length() > 0; - - // if the only change that's needed is that we need high precision, - // then just set that - if (!mThrottled && !mRequestedHighPrecision && - haveUnthrottledFrameRequestCallbacks) { - SetHighPrecisionTimersEnabled(true); - } else if (mRequestedHighPrecision && !haveUnthrottledFrameRequestCallbacks) { - SetHighPrecisionTimersEnabled(false); - } -} - -void -nsRefreshDriver::SetHighPrecisionTimersEnabled(bool aEnable) -{ - LOG("[%p] SetHighPrecisionTimersEnabled (%s)", this, aEnable ? "true" : "false"); - - if (aEnable) { - NS_ASSERTION(!mRequestedHighPrecision, "SetHighPrecisionTimersEnabled(true) called when already requested!"); -#ifdef XP_WIN - if (++sHighPrecisionTimerRequests == 1) { - // If we had a timer scheduled to disable it, that means that it's already - // enabled; just cancel the timer. Otherwise, really enable it. - if (sDisableHighPrecisionTimersTimer) { - sDisableHighPrecisionTimersTimer->Cancel(); - NS_RELEASE(sDisableHighPrecisionTimersTimer); - } else { - timeBeginPeriod(1); - } - } -#endif - mRequestedHighPrecision = true; - } else { - NS_ASSERTION(mRequestedHighPrecision, "SetHighPrecisionTimersEnabled(false) called when not requested!"); -#ifdef XP_WIN - if (--sHighPrecisionTimerRequests == 0) { - // Don't jerk us around between high precision and low precision - // timers; instead, only allow leaving high precision timers - // after 90 seconds. This is arbitrary, but hopefully good - // enough. - NS_ASSERTION(!sDisableHighPrecisionTimersTimer, "We shouldn't have an outstanding disable-high-precision timer !"); - - nsCOMPtr timer = do_CreateInstance(NS_TIMER_CONTRACTID); - if (timer) { - timer.forget(&sDisableHighPrecisionTimersTimer); - sDisableHighPrecisionTimersTimer->InitWithFuncCallback(DisableHighPrecisionTimersCallback, - nullptr, - 90 * 1000, - nsITimer::TYPE_ONE_SHOT); - } else { - // might happen if we're shutting down XPCOM; just drop the time period down - // immediately - timeEndPeriod(1); - } - } -#endif - mRequestedHighPrecision = false; - } } uint32_t @@ -1993,8 +1899,6 @@ nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime) observer->DidRefresh(); } - ConfigureHighPrecision(); - NS_ASSERTION(mInRefresh, "Still in refresh"); if (mPresContext->IsRoot() && XRE_IsContentProcess() && gfxPrefs::AlwaysPaint()) { @@ -2247,7 +2151,6 @@ nsRefreshDriver::ScheduleFrameRequestCallbacks(nsIDocument* aDocument) } // make sure that the timer is running - ConfigureHighPrecision(); EnsureTimerStarted(); } @@ -2256,7 +2159,6 @@ nsRefreshDriver::RevokeFrameRequestCallbacks(nsIDocument* aDocument) { mFrameRequestCallbackDocs.RemoveElement(aDocument); mThrottledFrameRequestCallbackDocs.RemoveElement(aDocument); - ConfigureHighPrecision(); // No need to worry about restarting our timer in slack mode if it's already // running; that will happen automatically when it fires. } diff --git a/layout/base/nsRefreshDriver.h b/layout/base/nsRefreshDriver.h index b2dd9be4b..4e839e764 100644 --- a/layout/base/nsRefreshDriver.h +++ b/layout/base/nsRefreshDriver.h @@ -450,7 +450,6 @@ private: bool mNeedToRecomputeVisibility; bool mTestControllingRefreshes; bool mViewManagerFlushIsPending; - bool mRequestedHighPrecision; bool mInRefresh; // True if the refresh driver is suspended waiting for transaction @@ -502,10 +501,6 @@ private: friend class mozilla::RefreshDriverTimer; - // turn on or turn off high precision based on various factors - void ConfigureHighPrecision(); - void SetHighPrecisionTimersEnabled(bool aEnable); - static void Shutdown(); // `true` if we are currently in jank-critical mode.