summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2019-04-22 22:14:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-04-22 22:14:33 +0000
commit2ea045dd11f662e347345dcaf0a9cd8e6953dd2f (patch)
tree7a676757905522c87c8f307bbca553811286c5e4
parent55fd57fea62204847c5f2e99a3729f160b3fe685 (diff)
parent6398a0a12d478a46446029ef25785bced671b443 (diff)
Merge "SurfaceFlinger: call to changeRefreshRate on state change only" into qt-dev
-rw-r--r--services/surfaceflinger/Scheduler/Scheduler.cpp41
-rw-r--r--services/surfaceflinger/Scheduler/Scheduler.h5
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp3
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;