SurfaceFlinger: DispSync: negative offsets when model is unlocked
When getting a HWVsync timestamp in DispSync, we correct the last event
time to reflect the actual HWVsync time by setting it based on HWVsync.
This logic needs to account for both positive and negative offsets.
Bug: 135631964
Test: sanity
Change-Id: I77a1e13d739e558d6cdf43c298e6fcee49d517b5
(cherry picked from commit 81ca00ff8cd05913fe0e97e0f97b3a9ae7ed3299)
diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp
index 81be372..83fd42b 100644
--- a/services/surfaceflinger/Scheduler/DispSync.cpp
+++ b/services/surfaceflinger/Scheduler/DispSync.cpp
@@ -92,8 +92,12 @@
mPeriod = period;
if (!mModelLocked && referenceTimeChanged) {
for (auto& eventListener : mEventListeners) {
- eventListener.mLastEventTime =
- mReferenceTime - mPeriod + mPhase + eventListener.mPhase;
+ eventListener.mLastEventTime = mReferenceTime + mPhase + eventListener.mPhase;
+ // If mLastEventTime is after mReferenceTime (can happen when positive phase offsets
+ // are used) we treat it as like it happened in previous period.
+ if (eventListener.mLastEventTime > mReferenceTime) {
+ eventListener.mLastEventTime -= mPeriod;
+ }
}
}
if (mTraceDetailedInfo) {