summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dominik Laskowski <domlaskowski@google.com> 2023-11-19 10:06:19 -0500
committer Dominik Laskowski <domlaskowski@google.com> 2023-11-20 14:39:28 -0500
commit6165155e50e4a7d730236403fcf8f64c35d5984c (patch)
tree307708d5a818e5868780857bba7af8b0ea9d4457
parent5974651f7d0b400276d49f970809ef2ecb77c79e (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.cpp20
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()) {