Remove nsRefreshDriver's use of high res system timers.
This commit is contained in:
parent
5f57d89899
commit
c10072173e
|
@ -851,12 +851,6 @@ NS_IMPL_ISUPPORTS(VsyncChildCreateCallback, nsIIPCBackgroundChildCreateCallback)
|
||||||
static StaticRefPtr<RefreshDriverTimer> sRegularRateTimer;
|
static StaticRefPtr<RefreshDriverTimer> sRegularRateTimer;
|
||||||
static StaticRefPtr<InactiveRefreshDriverTimer> sThrottledRateTimer;
|
static StaticRefPtr<InactiveRefreshDriverTimer> 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
|
static void
|
||||||
CreateContentVsyncRefreshTimer(void*)
|
CreateContentVsyncRefreshTimer(void*)
|
||||||
{
|
{
|
||||||
|
@ -934,16 +928,6 @@ nsRefreshDriver::Shutdown()
|
||||||
|
|
||||||
sRegularRateTimer = nullptr;
|
sRegularRateTimer = nullptr;
|
||||||
sThrottledRateTimer = nullptr;
|
sThrottledRateTimer = nullptr;
|
||||||
|
|
||||||
#ifdef XP_WIN
|
|
||||||
if (sDisableHighPrecisionTimersTimer) {
|
|
||||||
sDisableHighPrecisionTimersTimer->Cancel();
|
|
||||||
NS_RELEASE(sDisableHighPrecisionTimersTimer);
|
|
||||||
timeEndPeriod(1);
|
|
||||||
} else if (sHighPrecisionTimerRequests) {
|
|
||||||
timeEndPeriod(1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ int32_t
|
/* static */ int32_t
|
||||||
|
@ -1062,7 +1046,6 @@ nsRefreshDriver::nsRefreshDriver(nsPresContext* aPresContext)
|
||||||
mNeedToRecomputeVisibility(false),
|
mNeedToRecomputeVisibility(false),
|
||||||
mTestControllingRefreshes(false),
|
mTestControllingRefreshes(false),
|
||||||
mViewManagerFlushIsPending(false),
|
mViewManagerFlushIsPending(false),
|
||||||
mRequestedHighPrecision(false),
|
|
||||||
mInRefresh(false),
|
mInRefresh(false),
|
||||||
mWaitingForTransaction(false),
|
mWaitingForTransaction(false),
|
||||||
mSkippedPaints(false),
|
mSkippedPaints(false),
|
||||||
|
@ -1300,83 +1283,6 @@ nsRefreshDriver::StopTimer()
|
||||||
|
|
||||||
mActiveTimer->RemoveRefreshDriver(this);
|
mActiveTimer->RemoveRefreshDriver(this);
|
||||||
mActiveTimer = nullptr;
|
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<nsITimer> 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
|
uint32_t
|
||||||
|
@ -1993,8 +1899,6 @@ nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime)
|
||||||
observer->DidRefresh();
|
observer->DidRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigureHighPrecision();
|
|
||||||
|
|
||||||
NS_ASSERTION(mInRefresh, "Still in refresh");
|
NS_ASSERTION(mInRefresh, "Still in refresh");
|
||||||
|
|
||||||
if (mPresContext->IsRoot() && XRE_IsContentProcess() && gfxPrefs::AlwaysPaint()) {
|
if (mPresContext->IsRoot() && XRE_IsContentProcess() && gfxPrefs::AlwaysPaint()) {
|
||||||
|
@ -2247,7 +2151,6 @@ nsRefreshDriver::ScheduleFrameRequestCallbacks(nsIDocument* aDocument)
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure that the timer is running
|
// make sure that the timer is running
|
||||||
ConfigureHighPrecision();
|
|
||||||
EnsureTimerStarted();
|
EnsureTimerStarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2256,7 +2159,6 @@ nsRefreshDriver::RevokeFrameRequestCallbacks(nsIDocument* aDocument)
|
||||||
{
|
{
|
||||||
mFrameRequestCallbackDocs.RemoveElement(aDocument);
|
mFrameRequestCallbackDocs.RemoveElement(aDocument);
|
||||||
mThrottledFrameRequestCallbackDocs.RemoveElement(aDocument);
|
mThrottledFrameRequestCallbackDocs.RemoveElement(aDocument);
|
||||||
ConfigureHighPrecision();
|
|
||||||
// No need to worry about restarting our timer in slack mode if it's already
|
// No need to worry about restarting our timer in slack mode if it's already
|
||||||
// running; that will happen automatically when it fires.
|
// running; that will happen automatically when it fires.
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,7 +450,6 @@ private:
|
||||||
bool mNeedToRecomputeVisibility;
|
bool mNeedToRecomputeVisibility;
|
||||||
bool mTestControllingRefreshes;
|
bool mTestControllingRefreshes;
|
||||||
bool mViewManagerFlushIsPending;
|
bool mViewManagerFlushIsPending;
|
||||||
bool mRequestedHighPrecision;
|
|
||||||
bool mInRefresh;
|
bool mInRefresh;
|
||||||
|
|
||||||
// True if the refresh driver is suspended waiting for transaction
|
// True if the refresh driver is suspended waiting for transaction
|
||||||
|
@ -502,10 +501,6 @@ private:
|
||||||
|
|
||||||
friend class mozilla::RefreshDriverTimer;
|
friend class mozilla::RefreshDriverTimer;
|
||||||
|
|
||||||
// turn on or turn off high precision based on various factors
|
|
||||||
void ConfigureHighPrecision();
|
|
||||||
void SetHighPrecisionTimersEnabled(bool aEnable);
|
|
||||||
|
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
||||||
// `true` if we are currently in jank-critical mode.
|
// `true` if we are currently in jank-critical mode.
|
||||||
|
|
Loading…
Reference in New Issue