SF: Moving Vsync modulator away from threads.
Modulator should not know about threads, just make a request to scheduler
whenever it's ready to update the offsets.
Bug: 113612090
Test: SF tests pass. Ran systrace -- offsetting works as expected.
Change-Id: Iaff11208ab8d1aa8a7c35a28e6802c1ca04e5243
diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.h b/services/surfaceflinger/Scheduler/VSyncModulator.h
index 7dfad43..ea8ca4c 100644
--- a/services/surfaceflinger/Scheduler/VSyncModulator.h
+++ b/services/surfaceflinger/Scheduler/VSyncModulator.h
@@ -67,6 +67,14 @@
mAppEventThread = appEventThread;
}
+ void setSchedulerAndHandles(Scheduler* scheduler,
+ Scheduler::ConnectionHandle* appConnectionHandle,
+ Scheduler::ConnectionHandle* sfConnectionHandle) {
+ mScheduler = scheduler;
+ mAppConnectionHandle = appConnectionHandle;
+ mSfConnectionHandle = sfConnectionHandle;
+ }
+
void setTransactionStart(TransactionStart transactionStart) {
if (transactionStart == TransactionStart::EARLY) {
mRemainingEarlyFrameCount = MIN_EARLY_FRAME_COUNT;
@@ -108,11 +116,19 @@
bool changed = false;
if (desired.sf != current.sf) {
- mSfEventThread->setPhaseOffset(desired.sf);
+ if (mSfConnectionHandle != nullptr) {
+ mScheduler->setPhaseOffset(mSfConnectionHandle, desired.sf);
+ } else {
+ mSfEventThread->setPhaseOffset(desired.sf);
+ }
changed = true;
}
if (desired.app != current.app) {
- mAppEventThread->setPhaseOffset(desired.app);
+ if (mSfConnectionHandle != nullptr) {
+ mScheduler->setPhaseOffset(mAppConnectionHandle, desired.app);
+ } else {
+ mAppEventThread->setPhaseOffset(desired.app);
+ }
changed = true;
}
@@ -138,6 +154,10 @@
EventThread* mSfEventThread = nullptr;
EventThread* mAppEventThread = nullptr;
+ Scheduler* mScheduler = nullptr;
+ Scheduler::ConnectionHandle* mAppConnectionHandle = nullptr;
+ Scheduler::ConnectionHandle* mSfConnectionHandle = nullptr;
+
std::atomic<Offsets> mOffsets;
std::atomic<TransactionStart> mTransactionStart = TransactionStart::NORMAL;