From 6398a0a12d478a46446029ef25785bced671b443 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Thu, 18 Apr 2019 19:30:44 -0700 Subject: SurfaceFlinger: call to changeRefreshRate on state change only Check if Scheduler's idle timer / content detection changed before calling to changeRefreshRate to avoid sending config changed events when those are not neeed. Test: scroll within calendar app and observe systraces Bug: 130759239 Change-Id: If7bce0ac096630918decbf62c568baa5e17408f2 --- services/surfaceflinger/Scheduler/Scheduler.cpp | 41 +++++++++++++++---------- services/surfaceflinger/Scheduler/Scheduler.h | 5 ++- services/surfaceflinger/SurfaceFlinger.cpp | 3 ++ 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index 1b154a4b06..88d2638423 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -318,12 +318,24 @@ void Scheduler::withPrimaryDispSync(std::function const& fn) { void Scheduler::updateFpsBasedOnContent() { uint32_t refreshRate = std::round(mLayerHistory.getDesiredRefreshRate()); - ATRACE_INT("ContentFPS", refreshRate); - if (refreshRate > 0) { - contentChangeRefreshRate(ContentFeatureState::CONTENT_DETECTION_ON, refreshRate); - } else { - contentChangeRefreshRate(ContentFeatureState::CONTENT_DETECTION_OFF, 0); + RefreshRateType newRefreshRateType; + { + std::lock_guard lock(mFeatureStateLock); + if (mContentRefreshRate == refreshRate) { + return; + } + mContentRefreshRate = refreshRate; + ATRACE_INT("ContentFPS", mContentRefreshRate); + + mCurrentContentFeatureState = refreshRate > 0 ? ContentFeatureState::CONTENT_DETECTION_ON + : ContentFeatureState::CONTENT_DETECTION_OFF; + newRefreshRateType = calculateRefreshRateType(); + if (mRefreshRateType == newRefreshRateType) { + return; + } + mRefreshRateType = newRefreshRateType; } + changeRefreshRate(newRefreshRateType, ConfigEvent::Changed); } void Scheduler::setChangeRefreshRateCallback( @@ -365,24 +377,19 @@ std::string Scheduler::doDump() { return stream.str(); } -void Scheduler::contentChangeRefreshRate(ContentFeatureState contentFeatureState, - uint32_t refreshRate) { - RefreshRateType newRefreshRateType; - { - std::lock_guard lock(mFeatureStateLock); - mCurrentContentFeatureState = contentFeatureState; - mContentRefreshRate = refreshRate; - newRefreshRateType = calculateRefreshRateType(); - } - changeRefreshRate(newRefreshRateType, ConfigEvent::Changed); -} - void Scheduler::timerChangeRefreshRate(IdleTimerState idleTimerState) { RefreshRateType newRefreshRateType; { std::lock_guard lock(mFeatureStateLock); + if (mCurrentIdleTimerState == idleTimerState) { + return; + } mCurrentIdleTimerState = idleTimerState; newRefreshRateType = calculateRefreshRateType(); + if (mRefreshRateType == newRefreshRateType) { + return; + } + mRefreshRateType = newRefreshRateType; } changeRefreshRate(newRefreshRateType, ConfigEvent::None); } diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h index 134dc0b785..34327b5da0 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.h +++ b/services/surfaceflinger/Scheduler/Scheduler.h @@ -193,8 +193,6 @@ private: void expiredTimerCallback(); // Sets vsync period. void setVsyncPeriod(const nsecs_t period); - // Media feature's function to change the refresh rate. - void contentChangeRefreshRate(ContentFeatureState contentFeatureState, uint32_t refreshRate); // Idle timer feature's function to change the refresh rate. void timerChangeRefreshRate(IdleTimerState idleTimerState); // Calculate the new refresh rate type @@ -254,7 +252,8 @@ private: ContentFeatureState mCurrentContentFeatureState GUARDED_BY(mFeatureStateLock) = ContentFeatureState::CONTENT_DETECTION_OFF; IdleTimerState mCurrentIdleTimerState GUARDED_BY(mFeatureStateLock) = IdleTimerState::RESET; - uint32_t mContentRefreshRate; + uint32_t mContentRefreshRate GUARDED_BY(mFeatureStateLock); + RefreshRateType mRefreshRateType GUARDED_BY(mFeatureStateLock); const scheduler::RefreshRateConfigs& mRefreshRateConfigs; }; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 3744f8b0b8..a51f020576 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1005,6 +1005,7 @@ bool SurfaceFlinger::performSetActiveConfig() { // display is not valid or we are already in the requested mode // on both cases there is nothing left to do std::lock_guard lock(mActiveConfigLock); + mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; mDesiredActiveConfigChanged = false; ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); return false; @@ -1017,6 +1018,8 @@ bool SurfaceFlinger::performSetActiveConfig() { std::lock_guard lock(mActiveConfigLock); mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; mDesiredActiveConfig.configId = display->getActiveConfig(); + mDesiredActiveConfigChanged = false; + ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); return false; } mUpcomingActiveConfig = desiredActiveConfig; -- cgit v1.2.3-59-g8ed1b