diff options
author | 2023-05-17 12:46:21 -0400 | |
---|---|---|
committer | 2023-12-15 13:59:54 -0500 | |
commit | aaab4c3b4f012f48bca428b9db1cd954a6fbc8e9 (patch) | |
tree | 6a187a290826434b9ec97ab163798f87c28a6458 /services/surfaceflinger/DisplayDevice.cpp | |
parent | b067fdcf505f65137ecfb4ee5bb6d337cfbcd477 (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.cpp | 32 |
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) { |