@@ -43,16 +43,6 @@ nsecs_t getExpectedCallbackTime(nsecs_t nextVsyncTime,
4343 return nextVsyncTime - timing.readyDuration - timing.workDuration ;
4444}
4545
46- nsecs_t getExpectedCallbackTime (VSyncTracker& tracker, nsecs_t now,
47- const VSyncDispatch::ScheduleTiming& timing) {
48- const auto nextVsyncTime =
49- tracker.nextAnticipatedVSyncTimeFrom (std::max (timing.lastVsync ,
50- now + timing.workDuration +
51- timing.readyDuration ),
52- timing.lastVsync );
53- return getExpectedCallbackTime (nextVsyncTime, timing);
54- }
55-
5646} // namespace
5747
5848VSyncDispatch::~VSyncDispatch () = default ;
@@ -128,8 +118,11 @@ ScheduleResult VSyncDispatchTimerQueueEntry::schedule(VSyncDispatch::ScheduleTim
128118 return nextWakeupTime;
129119}
130120
131- void VSyncDispatchTimerQueueEntry::addPendingWorkloadUpdate (VSyncDispatch::ScheduleTiming timing) {
121+ nsecs_t VSyncDispatchTimerQueueEntry::addPendingWorkloadUpdate (
122+ VSyncTracker& tracker, nsecs_t now, VSyncDispatch::ScheduleTiming timing) {
132123 mWorkloadUpdateInfo = timing;
124+ const auto armedInfo = update (tracker, now, timing, mArmedInfo );
125+ return armedInfo.mActualWakeupTime ;
133126}
134127
135128bool VSyncDispatchTimerQueueEntry::hasPendingWorkloadUpdate () const {
@@ -157,6 +150,31 @@ nsecs_t VSyncDispatchTimerQueueEntry::adjustVsyncIfNeeded(VSyncTracker& tracker,
157150 return nextVsyncTime;
158151}
159152
153+ auto VSyncDispatchTimerQueueEntry::update (VSyncTracker& tracker, nsecs_t now,
154+ VSyncDispatch::ScheduleTiming timing,
155+ std::optional<ArmingInfo> armedInfo) const -> ArmingInfo {
156+ const auto earliestReadyBy = now + timing.workDuration + timing.readyDuration ;
157+ const auto earliestVsync = std::max (earliestReadyBy, timing.lastVsync );
158+
159+ const auto nextVsyncTime =
160+ adjustVsyncIfNeeded (tracker, /* nextVsyncTime*/
161+ tracker.nextAnticipatedVSyncTimeFrom (earliestVsync,
162+ timing.lastVsync ));
163+ const auto nextReadyTime = nextVsyncTime - timing.readyDuration ;
164+ const auto nextWakeupTime = nextReadyTime - timing.workDuration ;
165+
166+ bool const wouldSkipAVsyncTarget =
167+ armedInfo && (nextVsyncTime > (armedInfo->mActualVsyncTime + mMinVsyncDistance ));
168+ bool const wouldSkipAWakeup =
169+ armedInfo && (nextWakeupTime > (armedInfo->mActualWakeupTime + mMinVsyncDistance ));
170+ if (FlagManager::getInstance ().dont_skip_on_early_ro () &&
171+ (wouldSkipAVsyncTarget || wouldSkipAWakeup)) {
172+ return *armedInfo;
173+ }
174+
175+ return ArmingInfo{nextWakeupTime, nextVsyncTime, nextReadyTime};
176+ }
177+
160178void VSyncDispatchTimerQueueEntry::update (VSyncTracker& tracker, nsecs_t now) {
161179 if (!mArmedInfo && !mWorkloadUpdateInfo ) {
162180 return ;
@@ -167,17 +185,7 @@ void VSyncDispatchTimerQueueEntry::update(VSyncTracker& tracker, nsecs_t now) {
167185 mWorkloadUpdateInfo .reset ();
168186 }
169187
170- const auto earliestReadyBy = now + mScheduleTiming .workDuration + mScheduleTiming .readyDuration ;
171- const auto earliestVsync = std::max (earliestReadyBy, mScheduleTiming .lastVsync );
172-
173- const auto nextVsyncTime =
174- adjustVsyncIfNeeded (tracker, /* nextVsyncTime*/
175- tracker.nextAnticipatedVSyncTimeFrom (earliestVsync,
176- mScheduleTiming .lastVsync ));
177- const auto nextReadyTime = nextVsyncTime - mScheduleTiming .readyDuration ;
178- const auto nextWakeupTime = nextReadyTime - mScheduleTiming .workDuration ;
179-
180- mArmedInfo = {nextWakeupTime, nextVsyncTime, nextReadyTime};
188+ mArmedInfo = update (tracker, now, mScheduleTiming , mArmedInfo );
181189}
182190
183191void VSyncDispatchTimerQueueEntry::disarm () {
@@ -394,8 +402,7 @@ ScheduleResult VSyncDispatchTimerQueue::scheduleLocked(CallbackToken token,
394402 * timer recalculation to avoid cancelling a callback that is about to fire. */
395403 auto const rearmImminent = now > mIntendedWakeupTime ;
396404 if (CC_UNLIKELY (rearmImminent)) {
397- callback->addPendingWorkloadUpdate (scheduleTiming);
398- return getExpectedCallbackTime (*mTracker , now, scheduleTiming);
405+ return callback->addPendingWorkloadUpdate (*mTracker , now, scheduleTiming);
399406 }
400407
401408 const ScheduleResult result = callback->schedule (scheduleTiming, *mTracker , now);
0 commit comments