SurfaceFlinger: no app vsyncs during config switch
Do not dipatch vsync callbacks to applications during a config
switch as applications will get choreographer callbacks at uneven
times and will stuff the queue to surface flinger.
Test: test google/perf/jank/UIBench/UIBench-Trace:com.android.uibench.janktests.UiBenchJankTests#testClippedListView -v
Change-Id: I0537933c27af83a9186bcff54c3596d612c748ea
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index b1f0992..220e664 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -511,16 +511,14 @@
void onInitializeDisplays() REQUIRES(mStateLock);
// Sets the desired active config bit. It obtains the lock, and sets mDesiredActiveConfig.
void setDesiredActiveConfig(const sp<IBinder>& displayToken, int mode) REQUIRES(mStateLock);
- // Calls setActiveConfig in HWC.
- void setActiveConfigInHWC();
// Once HWC has returned the present fence, this sets the active config and a new refresh
// rate in SF. It also triggers HWC vsync.
void setActiveConfigInternal() REQUIRES(mStateLock);
// Active config is updated on INVALIDATE call in a state machine-like manner. When the
- // desired config was set, HWC needs to update the pannel on the next refresh, and when
+ // desired config was set, HWC needs to update the panel on the next refresh, and when
// we receive the fence back, we know that the process was complete. It returns whether
- // the invalidate process should continue.
- bool updateSetActiveConfigStateMachine();
+ // we need to wait for the next invalidate
+ bool performSetActiveConfig();
// called on the main thread in response to setPowerMode()
void setPowerModeInternal(const sp<DisplayDevice>& display, int mode) REQUIRES(mStateLock);
@@ -1082,15 +1080,6 @@
sp<Scheduler::ConnectionHandle> mSfConnectionHandle;
std::unique_ptr<scheduler::RefreshRateStats> mRefreshRateStats;
- // The following structs are used for configuring active config state at a desired time,
- // which is once per vsync at invalidate time.
- enum SetActiveConfigState {
- NONE, // not in progress
- NOTIFIED_HWC, // call to HWC has been made
- REFRESH_RECEIVED // onRefresh was received from HWC
- };
- std::atomic<SetActiveConfigState> mSetActiveConfigState = SetActiveConfigState::NONE;
-
struct ActiveConfigInfo {
int configId;
sp<IBinder> displayToken;
@@ -1110,6 +1099,11 @@
// This bit can be set at any point in time when the system wants the new config.
ActiveConfigInfo mDesiredActiveConfig GUARDED_BY(mActiveConfigLock);
+ // below flags are set by main thread only
+ bool mDesiredActiveConfigChanged GUARDED_BY(mActiveConfigLock) = false;
+ bool mWaitForNextInvalidate = false;
+ bool mCheckPendingFence = false;
+
/* ------------------------------------------------------------------------ */
sp<IInputFlinger> mInputFlinger;