SurfaceFlinger: correct negative offset when refresh rate changes

VsyncModulator sets the phase offset on DispSync source only when it
changes. However, negative offsets depends on the vsync period so setting
the same negative offset might result in a different wake up time
i.e. -5ms on 60Hz is 11ms after the previous vsync where on 90Hz is
6ms after the previous vsync.

Test: UI-Bench
Bug: 135283780
Bug: 135297302
Change-Id: I6a05cd48d563a51d2ee38927c23d4946dd142f4b
diff --git a/services/surfaceflinger/Scheduler/DispSyncSource.cpp b/services/surfaceflinger/Scheduler/DispSyncSource.cpp
index 026b557..5faf46e 100644
--- a/services/surfaceflinger/Scheduler/DispSyncSource.cpp
+++ b/services/surfaceflinger/Scheduler/DispSyncSource.cpp
@@ -78,6 +78,10 @@
     // Normalize phaseOffset to [-period, period)
     const int numPeriods = phaseOffset / period;
     phaseOffset -= numPeriods * period;
+    if (mPhaseOffset == phaseOffset) {
+        return;
+    }
+
     mPhaseOffset = phaseOffset;
     tracePhaseOffset();
 
diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.cpp b/services/surfaceflinger/Scheduler/VSyncModulator.cpp
index d452c19..7a3bf8e 100644
--- a/services/surfaceflinger/Scheduler/VSyncModulator.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncModulator.cpp
@@ -129,29 +129,16 @@
 
 void VSyncModulator::updateOffsetsLocked() {
     const Offsets desired = getNextOffsets();
-    const Offsets current = mOffsets;
 
-    bool changed = false;
-    if (desired.sf != current.sf) {
-        if (mSfConnectionHandle != nullptr) {
-            mScheduler->setPhaseOffset(mSfConnectionHandle, desired.sf);
-        } else if (mSfEventThread != nullptr) {
-            mSfEventThread->setPhaseOffset(desired.sf);
-        }
-        changed = true;
-    }
-    if (desired.app != current.app) {
-        if (mAppConnectionHandle != nullptr) {
-            mScheduler->setPhaseOffset(mAppConnectionHandle, desired.app);
-        } else if (mAppEventThread != nullptr) {
-            mAppEventThread->setPhaseOffset(desired.app);
-        }
-        changed = true;
+    if (mSfConnectionHandle != nullptr) {
+        mScheduler->setPhaseOffset(mSfConnectionHandle, desired.sf);
     }
 
-    if (changed) {
-        flushOffsets();
+    if (mAppConnectionHandle != nullptr) {
+        mScheduler->setPhaseOffset(mAppConnectionHandle, desired.app);
     }
+
+    flushOffsets();
 }
 
 void VSyncModulator::flushOffsets() {
diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.h b/services/surfaceflinger/Scheduler/VSyncModulator.h
index 10cf8e6..ddbd221 100644
--- a/services/surfaceflinger/Scheduler/VSyncModulator.h
+++ b/services/surfaceflinger/Scheduler/VSyncModulator.h
@@ -68,12 +68,6 @@
     void setPhaseOffsets(Offsets early, Offsets earlyGl, Offsets late,
                          nsecs_t thresholdForNextVsync) EXCLUDES(mMutex);
 
-    // Sets handles to the SF and app event threads.
-    void setEventThreads(EventThread* sfEventThread, EventThread* appEventThread) {
-        mSfEventThread = sfEventThread;
-        mAppEventThread = appEventThread;
-    }
-
     // Sets the scheduler and vsync connection handlers.
     void setSchedulerAndHandles(Scheduler* scheduler,
                                 Scheduler::ConnectionHandle* appConnectionHandle,
@@ -121,9 +115,6 @@
     std::unordered_map<OffsetType, Offsets> mOffsetMap GUARDED_BY(mMutex);
     nsecs_t mThresholdForNextVsync;
 
-    EventThread* mSfEventThread = nullptr;
-    EventThread* mAppEventThread = nullptr;
-
     Scheduler* mScheduler = nullptr;
     Scheduler::ConnectionHandle* mAppConnectionHandle = nullptr;
     Scheduler::ConnectionHandle* mSfConnectionHandle = nullptr;