summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/DisplayDevice.cpp
diff options
context:
space:
mode:
author Dominik Laskowski <domlaskowski@google.com> 2023-05-17 12:46:21 -0400
committer Dominik Laskowski <domlaskowski@google.com> 2023-12-15 13:59:54 -0500
commitaaab4c3b4f012f48bca428b9db1cd954a6fbc8e9 (patch)
tree6a187a290826434b9ec97ab163798f87c28a6458 /services/surfaceflinger/DisplayDevice.cpp
parentb067fdcf505f65137ecfb4ee5bb6d337cfbcd477 (diff)
SF: Flow DisplayModeRequest through mode set FSM
The motivation is to: - Avoid redundant state that can cause data races if stale. - Consolidate control flow for resolution and refresh rate changes. - Clarify the desired/pending/active states of the per-display FSM. The notable changes are: Consume the desired DisplayModeRequestOpt via either SF::dropModeRequest or DisplayDevice::initiateModeChange. Pull the details of SF::finalizeDisplayModeChange into DisplayDevice:: finalizeModeChange, which now returns whether there was NoModeChange, a ResolutionChange, or a RefreshRateChange. Consume the pending request. Now that DisplayDevice does not retain the desired DisplayModeRequest, applyActiveMode as soon as finalizeDisplayModeChange ends, rather than at a later point in the commit, when initiateDisplayModeChanges checks whether the active and desired modes are the same. Now that applyActiveMode happens in finalizeDisplayModeChange, remove the special case when there is a displayToUpdateImmediately. Bug: 305813445 Bug: 255635711 Bug: 241285876 Test: ALOGV of mode setting for inner/outer displays Test: InitiateModeChangeTest, DisplayModeSwitchingTest Change-Id: I688b0c922747a80e881965a1dc243d11ba2c7438
Diffstat (limited to 'services/surfaceflinger/DisplayDevice.cpp')
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index 950b05e1da..671382c98e 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -222,7 +222,6 @@ bool DisplayDevice::initiateModeChange(display::DisplayModeRequest&& desiredMode
const hal::VsyncPeriodChangeConstraints& constraints,
hal::VsyncPeriodChangeTimeline& outTimeline) {
mPendingModeOpt = std::move(desiredMode);
- mIsModeSetPending = true;
const auto& mode = *mPendingModeOpt->mode.modePtr;
@@ -235,9 +234,22 @@ bool DisplayDevice::initiateModeChange(display::DisplayModeRequest&& desiredMode
return true;
}
-void DisplayDevice::finalizeModeChange(DisplayModeId modeId, Fps vsyncRate, Fps renderFps) {
- setActiveMode(modeId, vsyncRate, renderFps);
- mIsModeSetPending = false;
+auto DisplayDevice::finalizeModeChange() -> ModeChange {
+ if (!mPendingModeOpt) return NoModeChange{"No pending mode"};
+
+ auto pendingMode = *std::exchange(mPendingModeOpt, std::nullopt);
+ auto& pendingModePtr = pendingMode.mode.modePtr;
+
+ if (!mRefreshRateSelector->displayModes().contains(pendingModePtr->getId())) {
+ return NoModeChange{"Unknown pending mode"};
+ }
+
+ if (getActiveMode().modePtr->getResolution() != pendingModePtr->getResolution()) {
+ return ResolutionChange{std::move(pendingMode)};
+ }
+
+ setActiveMode(pendingModePtr->getId(), pendingModePtr->getVsyncRate(), pendingMode.mode.fps);
+ return RefreshRateChange{std::move(pendingMode)};
}
nsecs_t DisplayDevice::getVsyncPeriodFromHWC() const {
@@ -571,10 +583,14 @@ auto DisplayDevice::getDesiredMode() const -> DisplayModeRequestOpt {
return mDesiredModeOpt;
}
-void DisplayDevice::clearDesiredMode() {
- std::scoped_lock lock(mDesiredModeLock);
- mDesiredModeOpt.reset();
- mHasDesiredModeTrace = false;
+auto DisplayDevice::takeDesiredMode() -> DisplayModeRequestOpt {
+ DisplayModeRequestOpt desiredModeOpt;
+ {
+ std::scoped_lock lock(mDesiredModeLock);
+ std::swap(mDesiredModeOpt, desiredModeOpt);
+ mHasDesiredModeTrace = false;
+ }
+ return desiredModeOpt;
}
void DisplayDevice::adjustRefreshRate(Fps pacesetterDisplayRefreshRate) {