diff options
Diffstat (limited to 'services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp')
-rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp index 43b536b9de..c66af84e03 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp @@ -22,6 +22,7 @@ #pragma clang diagnostic ignored "-Wextra" #include "RefreshRateConfigs.h" +#include <android-base/properties.h> #include <android-base/stringprintf.h> #include <utils/Trace.h> #include <chrono> @@ -113,7 +114,7 @@ bool RefreshRateConfigs::isVoteAllowed(const LayerRequirement& layer, case LayerVoteType::ExplicitExactOrMultiple: case LayerVoteType::Heuristic: if (mConfig.frameRateMultipleThreshold != 0 && - refreshRate.fps.greaterThanOrEqualWithMargin( + refreshRate.getFps().greaterThanOrEqualWithMargin( Fps(mConfig.frameRateMultipleThreshold)) && layer.desiredRefreshRate.lessThanWithMargin( Fps(mConfig.frameRateMultipleThreshold / 2))) { @@ -146,8 +147,8 @@ float RefreshRateConfigs::calculateLayerScoreLocked(const LayerRequirement& laye // If the layer wants Max, give higher score to the higher refresh rate if (layer.vote == LayerVoteType::Max) { - const auto ratio = - refreshRate.fps.getValue() / mAppRequestRefreshRates.back()->fps.getValue(); + const auto ratio = refreshRate.getFps().getValue() / + mAppRequestRefreshRates.back()->getFps().getValue(); // use ratio^2 to get a lower score the more we get further from peak return ratio * ratio; } @@ -463,7 +464,7 @@ RefreshRate RefreshRateConfigs::getBestRefreshRateLocked( } }(); if (globalSignals.touch && explicitDefaultVoteLayers == 0 && touchBoostForExplicitExact && - bestRefreshRate->fps.lessThanWithMargin(touchRefreshRate.fps)) { + bestRefreshRate->getFps().lessThanWithMargin(touchRefreshRate.getFps())) { setTouchConsidered(); ALOGV("TouchBoost - choose %s", touchRefreshRate.getName().c_str()); return touchRefreshRate; @@ -683,9 +684,30 @@ void RefreshRateConfigs::setCurrentModeId(DisplayModeId modeId) { RefreshRateConfigs::RefreshRateConfigs(const DisplayModes& modes, DisplayModeId currentModeId, Config config) : mKnownFrameRates(constructKnownFrameRates(modes)), mConfig(config) { + initializeIdleTimer(); updateDisplayModes(modes, currentModeId); } +void RefreshRateConfigs::initializeIdleTimer() { + if (mConfig.idleTimerTimeoutMs > 0) { + const auto getCallback = [this]() -> std::optional<IdleTimerCallbacks::Callbacks> { + std::scoped_lock lock(mIdleTimerCallbacksMutex); + if (!mIdleTimerCallbacks.has_value()) return {}; + return mConfig.supportKernelIdleTimer ? mIdleTimerCallbacks->kernel + : mIdleTimerCallbacks->platform; + }; + + mIdleTimer.emplace( + "IdleTimer", std::chrono::milliseconds(mConfig.idleTimerTimeoutMs), + [getCallback] { + if (const auto callback = getCallback()) callback->onReset(); + }, + [getCallback] { + if (const auto callback = getCallback()) callback->onExpired(); + }); + } +} + void RefreshRateConfigs::updateDisplayModes(const DisplayModes& modes, DisplayModeId currentModeId) { std::lock_guard lock(mLock); @@ -703,8 +725,7 @@ void RefreshRateConfigs::updateDisplayModes(const DisplayModes& modes, for (const auto& mode : modes) { const auto modeId = mode->getId(); mRefreshRates.emplace(modeId, - std::make_unique<RefreshRate>(modeId, mode, mode->getFps(), - RefreshRate::ConstructorTag(0))); + std::make_unique<RefreshRate>(mode, RefreshRate::ConstructorTag(0))); if (modeId == currentModeId) { mCurrentRefreshRate = mRefreshRates.at(modeId).get(); } @@ -797,7 +818,7 @@ RefreshRateConfigs::Policy RefreshRateConfigs::getDisplayManagerPolicy() const { bool RefreshRateConfigs::isModeAllowed(DisplayModeId modeId) const { std::lock_guard lock(mLock); for (const RefreshRate* refreshRate : mAppRequestRefreshRates) { - if (refreshRate->modeId == modeId) { + if (refreshRate->getModeId() == modeId) { return true; } } @@ -812,7 +833,7 @@ void RefreshRateConfigs::getSortedRefreshRateListLocked( for (const auto& [type, refreshRate] : mRefreshRates) { if (shouldAddRefreshRate(*refreshRate)) { ALOGV("getSortedRefreshRateListLocked: mode %d added to list policy", - refreshRate->modeId.value()); + refreshRate->getModeId().value()); outRefreshRates->push_back(refreshRate.get()); } } @@ -949,6 +970,9 @@ void RefreshRateConfigs::dump(std::string& result) const { base::StringAppendF(&result, "Supports Frame Rate Override: %s\n", mSupportsFrameRateOverride ? "yes" : "no"); + base::StringAppendF(&result, "Idle timer: (%s) %s\n", + mConfig.supportKernelIdleTimer ? "kernel" : "platform", + mIdleTimer ? mIdleTimer->dump().c_str() : "off"); result.append("\n"); } |