Re-enable default display when switching to VR mode.
Previously, in an attempt to minimize the number of changes that got
reset during VR mode transitions, the primary display was not turned back
on.
Bug: 62215749
Test: Switch device into VR mode, observe primary display invalidations.
Change-Id: Idd883e1522f519a0db06fdd88b071007487b6e70
(cherry picked from commit 933ed5ceb9d70829333ae438985a1bfeec8e79a8)
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 627bf77..a6b34c2 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1323,11 +1323,21 @@
// parts of this class rely on the primary display always being available.
createDefaultDisplayDevice();
- // Reset the timing values to account for the period of the swapped in HWC
- const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
- const nsecs_t period = activeConfig->getVsyncPeriod();
- mAnimFrameTracker.setDisplayRefreshPeriod(period);
- setCompositorTimingSnapped(0, period, 0);
+ // Re-enable default display.
+ sp<LambdaMessage> requestMessage = new LambdaMessage([&]() {
+ sp<DisplayDevice> hw(getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]));
+ setPowerModeInternal(hw, HWC_POWER_MODE_NORMAL);
+
+ // Reset the timing values to account for the period of the swapped in HWC
+ const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
+ const nsecs_t period = activeConfig->getVsyncPeriod();
+ mAnimFrameTracker.setDisplayRefreshPeriod(period);
+
+ // Use phase of 0 since phase is not known.
+ // Use latency of 0, which will snap to the ideal latency.
+ setCompositorTimingSnapped(0, period, 0);
+ });
+ postMessageAsync(requestMessage);
android_atomic_or(1, &mRepaintEverything);
setTransactionFlags(eDisplayTransactionNeeded);