diff options
author | 2023-11-19 10:06:19 -0500 | |
---|---|---|
committer | 2023-11-20 14:39:28 -0500 | |
commit | 6165155e50e4a7d730236403fcf8f64c35d5984c (patch) | |
tree | 307708d5a818e5868780857bba7af8b0ea9d4457 | |
parent | 5974651f7d0b400276d49f970809ef2ecb77c79e (diff) |
SF: Check if mode exists in onKernelTimerChanged
mDisplayModes may no longer contain desiredModeId.
Bug: 255635711
Test: Refresh rate overlay still works
Change-Id: Ie4c90d95886a396757d92791639b910bd6365696
-rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateSelector.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp index bc0d448d45..0e3b771fc6 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp @@ -973,14 +973,18 @@ ftl::Optional<FrameRateMode> RefreshRateSelector::onKernelTimerChanged( ftl::Optional<DisplayModeId> desiredModeIdOpt, bool timerExpired) const { std::lock_guard lock(mLock); - const auto current = [&]() REQUIRES(mLock) -> FrameRateMode { - if (desiredModeIdOpt) { - const auto& modePtr = mDisplayModes.get(*desiredModeIdOpt)->get(); - return FrameRateMode{modePtr->getPeakFps(), ftl::as_non_null(modePtr)}; - } - - return getActiveModeLocked(); - }(); + const auto current = + desiredModeIdOpt + .and_then([this](DisplayModeId modeId) + REQUIRES(mLock) { return mDisplayModes.get(modeId); }) + .transform([](const DisplayModePtr& modePtr) { + return FrameRateMode{modePtr->getPeakFps(), ftl::as_non_null(modePtr)}; + }) + .or_else([this] { + ftl::FakeGuard guard(mLock); + return std::make_optional(getActiveModeLocked()); + }) + .value(); const DisplayModePtr& min = mMinRefreshRateModeIt->second; if (current.modePtr->getId() == min->getId()) { |