SF: flush setRenderRate when changing mode
There is no point to try to syncronize changing the render rate
if the display mode changes. This would just cause more latency
to getting the next vsync.
Bug: 328140524
Test: presubmit
Change-Id: I78a82bee01ba793890d459564ab701d257851b49
diff --git a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
index 156cf99..58457d8 100644
--- a/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncPredictor.cpp
@@ -296,6 +296,10 @@
const auto now = TimePoint::fromNs(mClock->now());
purgeTimelines(now);
+ if (lastVsyncOpt && *lastVsyncOpt > timePoint) {
+ timePoint = *lastVsyncOpt;
+ }
+
const auto model = getVSyncPredictionModelLocked();
const auto threshold = model.slope / 2;
std::optional<TimePoint> vsyncOpt;
@@ -352,7 +356,7 @@
return mTimelines.back().isVSyncInPhase(model, vsync, frameRate);
}
-void VSyncPredictor::setRenderRate(Fps renderRate) {
+void VSyncPredictor::setRenderRate(Fps renderRate, bool applyImmediately) {
ATRACE_FORMAT("%s %s", __func__, to_string(renderRate).c_str());
ALOGV("%s %s: RenderRate %s ", __func__, to_string(mId).c_str(), to_string(renderRate).c_str());
std::lock_guard lock(mMutex);
@@ -360,8 +364,9 @@
mRenderRateOpt = renderRate;
const auto renderPeriodDelta =
prevRenderRate ? prevRenderRate->getPeriodNsecs() - renderRate.getPeriodNsecs() : 0;
- if (renderPeriodDelta > renderRate.getPeriodNsecs() &&
- mLastCommittedVsync.ns() - mClock->now() > 2 * renderRate.getPeriodNsecs()) {
+ const bool newRenderRateIsHigher = renderPeriodDelta > renderRate.getPeriodNsecs() &&
+ mLastCommittedVsync.ns() - mClock->now() > 2 * renderRate.getPeriodNsecs();
+ if (applyImmediately || newRenderRateIsHigher) {
mTimelines.clear();
mLastCommittedVsync = TimePoint::fromNs(0);
} else {