diff options
| author | 2019-04-22 22:14:33 +0000 | |
|---|---|---|
| committer | 2019-04-22 22:14:33 +0000 | |
| commit | 2ea045dd11f662e347345dcaf0a9cd8e6953dd2f (patch) | |
| tree | 7a676757905522c87c8f307bbca553811286c5e4 | |
| parent | 55fd57fea62204847c5f2e99a3729f160b3fe685 (diff) | |
| parent | 6398a0a12d478a46446029ef25785bced671b443 (diff) | |
Merge "SurfaceFlinger: call to changeRefreshRate on state change only" into qt-dev
| -rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.cpp | 41 | ||||
| -rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.h | 5 | ||||
| -rw-r--r-- | 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<void(DispSync&)> 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<std::mutex> 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<std::mutex> lock(mFeatureStateLock); - mCurrentContentFeatureState = contentFeatureState; - mContentRefreshRate = refreshRate; - newRefreshRateType = calculateRefreshRateType(); - } - changeRefreshRate(newRefreshRateType, ConfigEvent::Changed); -} - void Scheduler::timerChangeRefreshRate(IdleTimerState idleTimerState) { RefreshRateType newRefreshRateType; { std::lock_guard<std::mutex> 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 0c8a4413e3..1d54cb275b 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<std::mutex> 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<std::mutex> lock(mActiveConfigLock); mDesiredActiveConfig.event = Scheduler::ConfigEvent::None; mDesiredActiveConfig.configId = display->getActiveConfig(); + mDesiredActiveConfigChanged = false; + ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged); return false; } mUpcomingActiveConfig = desiredActiveConfig; |