summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/DisplayDevice.cpp
diff options
context:
space:
mode:
author Dominik Laskowski <domlaskowski@google.com> 2022-09-29 14:26:53 -0400
committer Dominik Laskowski <domlaskowski@google.com> 2024-01-24 13:48:33 -0500
commita42d539940191c7c3ada290c52b3a4462cb0cac1 (patch)
treef24c9f3c418c508c01979102c5fe90d84f8a778e /services/surfaceflinger/DisplayDevice.cpp
parenta9c519873255af50508ba47d483b951b272c88e9 (diff)
SF: Initialize all displays on boot/restart
Generalize SF::initializeDisplays (called on boot and restart) to: - Apply the transaction that clears DisplayState to all displays. - Power on all displays. The first change removes a special case for the primary display, setting the stage for multi-display boot animation. Each display is assigned its own LayerStack, and set up with a projection to its active resolution. The second change fixes a bug where DisplayCapability::BRIGHTNESS was not detected for secondary displays present during boot. SF queries capabilities when a display is first powered on, but DM asks SF about brightness when the display is hotplugged, regardless of power mode. The general fix (covering external displays) is for DM to defer its query, but this stopgap covers internal displays. Revert I3a2eae4efc4a5c6113700a9ca9e9b261e364a878, which let the initial power mode be std::nullopt. This effectively forced DM's first request to setPowerMode(<rear display>, OFF), which would otherwise be ignored because OFF had been the default power mode on DisplayDevice creation. However, that special case confusingly took the same branch as the OFF to ON transition, and is no longer needed now that all displays are ON (from SF's perspective, not just HWC's) until the boot animation ends. Fixes: 267633741 Fixes: 150889228 Bug: 269510347 Test: Boot unfolded and folded. Test: Induce system_server crash. Test: InitializeDisplaysTest.initializesDisplays Change-Id: I5277a629f39b3b285452aa84d49ff84e3dc957ca
Diffstat (limited to 'services/surfaceflinger/DisplayDevice.cpp')
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp23
1 files changed, 8 insertions, 15 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index b96264b65e..ef9d1184da 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -68,6 +68,7 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args)
mActiveModeFpsTrace(concatId("ActiveModeFps")),
mRenderRateFpsTrace(concatId("RenderRateFps")),
mPhysicalOrientation(args.physicalOrientation),
+ mPowerMode(ftl::Concat("PowerMode ", getId().value).c_str(), args.initialPowerMode),
mIsPrimary(args.isPrimary),
mRequestedRefreshRate(args.requestedRefreshRate),
mRefreshRateSelector(std::move(args.refreshRateSelector)),
@@ -106,9 +107,7 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args)
mCompositionDisplay->getRenderSurface()->initialize();
- if (const auto powerModeOpt = args.initialPowerMode) {
- setPowerMode(*powerModeOpt);
- }
+ setPowerMode(args.initialPowerMode);
// initialize the display orientation transform.
setProjection(ui::ROTATION_0, Rect::INVALID_RECT, Rect::INVALID_RECT);
@@ -173,6 +172,7 @@ auto DisplayDevice::getFrontEndInfo() const -> frontend::DisplayInfo {
}
void DisplayDevice::setPowerMode(hal::PowerMode mode) {
+ // TODO(b/241285876): Skip this for virtual displays.
if (mode == hal::PowerMode::OFF || mode == hal::PowerMode::ON) {
if (mStagedBrightness && mBrightness != mStagedBrightness) {
getCompositionDisplay()->setNextBrightness(*mStagedBrightness);
@@ -182,33 +182,26 @@ void DisplayDevice::setPowerMode(hal::PowerMode mode) {
getCompositionDisplay()->applyDisplayBrightness(true);
}
- if (mPowerMode) {
- *mPowerMode = mode;
- } else {
- mPowerMode.emplace("PowerMode -" + to_string(getId()), mode);
- }
+ mPowerMode = mode;
getCompositionDisplay()->setCompositionEnabled(isPoweredOn());
}
void DisplayDevice::tracePowerMode() {
- // assign the same value for tracing
- if (mPowerMode) {
- const hal::PowerMode powerMode = *mPowerMode;
- *mPowerMode = powerMode;
- }
+ // Assign the same value for tracing.
+ mPowerMode = mPowerMode.get();
}
void DisplayDevice::enableLayerCaching(bool enable) {
getCompositionDisplay()->setLayerCachingEnabled(enable);
}
-std::optional<hal::PowerMode> DisplayDevice::getPowerMode() const {
+hal::PowerMode DisplayDevice::getPowerMode() const {
return mPowerMode;
}
bool DisplayDevice::isPoweredOn() const {
- return mPowerMode && *mPowerMode != hal::PowerMode::OFF;
+ return mPowerMode != hal::PowerMode::OFF;
}
void DisplayDevice::setActiveMode(DisplayModeId modeId, Fps vsyncRate, Fps renderFps) {