diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2021-11-16 17:57:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-11-16 17:57:19 +0000 |
commit | 2731fe5378813950162c69d91ae865d8e54f1cdb (patch) | |
tree | 6e2cd38b33e5b7e8b136c6816a6ef14dfd48af4d | |
parent | 4b26b7fb4604ded2ec4e2bb3e4f40a76c48c6fcf (diff) | |
parent | 11663406f0e40d26e71d90f6a31ff75ed17a6638 (diff) | |
download | native-2731fe5378813950162c69d91ae865d8e54f1cdb.tar.gz |
Merge "SF: reset idle state when RefreshRateConfigs changes" into sc-v2-dev
-rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateConfigs.h | 20 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.h | 37 |
3 files changed, 42 insertions, 16 deletions
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp index ee1d7301c1..0ee9fb353d 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp @@ -701,7 +701,6 @@ void RefreshRateConfigs::initializeIdleTimer() { [getCallback] { if (const auto callback = getCallback()) callback->onExpired(); }); - mIdleTimer->start(); } } diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h index 2addc83225..21867ccac9 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h @@ -362,10 +362,22 @@ public: std::function<void()> kernelTimerExpired) { std::scoped_lock lock(mIdleTimerCallbacksMutex); mIdleTimerCallbacks.emplace(); - mIdleTimerCallbacks->platform.onReset = platformTimerReset; - mIdleTimerCallbacks->platform.onExpired = platformTimerExpired; - mIdleTimerCallbacks->kernel.onReset = kernelTimerReset; - mIdleTimerCallbacks->kernel.onExpired = kernelTimerExpired; + mIdleTimerCallbacks->platform.onReset = std::move(platformTimerReset); + mIdleTimerCallbacks->platform.onExpired = std::move(platformTimerExpired); + mIdleTimerCallbacks->kernel.onReset = std::move(kernelTimerReset); + mIdleTimerCallbacks->kernel.onExpired = std::move(kernelTimerExpired); + } + + void startIdleTimer() { + if (mIdleTimer) { + mIdleTimer->start(); + } + } + + void stopIdleTimer() { + if (mIdleTimer) { + mIdleTimer->stop(); + } } void resetIdleTimer(bool kernelOnly) { diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h index ee519f33a3..bbbbca5b2f 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.h +++ b/services/surfaceflinger/Scheduler/Scheduler.h @@ -181,17 +181,32 @@ public: void setRefreshRateConfigs(std::shared_ptr<scheduler::RefreshRateConfigs> refreshRateConfigs) EXCLUDES(mRefreshRateConfigsLock) { - std::scoped_lock lock(mRefreshRateConfigsLock); - mRefreshRateConfigs = std::move(refreshRateConfigs); - mRefreshRateConfigs->setIdleTimerCallbacks( - [this] { std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Reset); }, - [this] { std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Expired); }, - [this] { - std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Reset); - }, - [this] { - std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Expired); - }); + // We need to stop the idle timer on the previous RefreshRateConfigs instance + // and cleanup the scheduler's state before we switch to the other RefreshRateConfigs. + { + std::scoped_lock lock(mRefreshRateConfigsLock); + if (mRefreshRateConfigs) mRefreshRateConfigs->stopIdleTimer(); + } + { + std::scoped_lock lock(mFeatureStateLock); + mFeatures = {}; + } + { + std::scoped_lock lock(mRefreshRateConfigsLock); + mRefreshRateConfigs = std::move(refreshRateConfigs); + mRefreshRateConfigs->setIdleTimerCallbacks( + [this] { std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Reset); }, + [this] { + std::invoke(&Scheduler::idleTimerCallback, this, TimerState::Expired); + }, + [this] { + std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Reset); + }, + [this] { + std::invoke(&Scheduler::kernelIdleTimerCallback, this, TimerState::Expired); + }); + mRefreshRateConfigs->startIdleTimer(); + } } nsecs_t getVsyncPeriodFromRefreshRateConfigs() const EXCLUDES(mRefreshRateConfigsLock) { |