Do not handle VSync event during resolution switch
When there is a resolution switch, SurfaceFlinger will handle as display
changes. If the VSync comes before the display is ready, the access to
the display will bring exception.
Solution: Add mutex lock between onComposerHalVsync() and
setActiveModeInternal().
Bug: 210378166
Test: run cts-on-gsi -m CtsDisplayTestCases
Change-Id: Ide53b0e5cff3b569593a2ed388d0ea66e0002e9d
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8db974e..20b1f52 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2035,7 +2035,10 @@
// We received the present fence from the HWC, so we assume it successfully updated
// the mode, hence we update SF.
mSetActiveModePending = false;
- ON_MAIN_THREAD(updateInternalStateWithChangedMode());
+ {
+ Mutex::Autolock lock(mStateLock);
+ updateInternalStateWithChangedMode();
+ }
}
if (framePending) {
@@ -2100,10 +2103,9 @@
{
Mutex::Autolock _l(mStateLock);
mScheduler->chooseRefreshRateForContent();
+ setActiveModeInHwcIfNeeded();
}
- ON_MAIN_THREAD(setActiveModeInHwcIfNeeded());
-
updateCursorAsync();
updateInputFlinger();