SF: Dedupe functions to apply Scheduler::Policy
The only functional difference is the early out when there is no change
in timer state, which now applies to LayerRequirement state as well.
Bug: 185535769
Test: libsurfaceflinger_unittest
Change-Id: Ia7234847e4f44d78dbf3920d77f38f3bfa40e5a2
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp
index de27bd1..2690716 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.cpp
+++ b/services/surfaceflinger/Scheduler/Scheduler.cpp
@@ -531,50 +531,13 @@
}
void Scheduler::chooseRefreshRateForContent() {
- {
- std::scoped_lock lock(mRefreshRateConfigsLock);
- if (!mRefreshRateConfigs->canSwitch()) return;
- }
+ const auto configs = holdRefreshRateConfigs();
+ if (!configs->canSwitch()) return;
ATRACE_CALL();
- DisplayModePtr newMode;
- GlobalSignals consideredSignals;
-
- bool frameRateChanged;
- bool frameRateOverridesChanged;
-
- const auto refreshRateConfigs = holdRefreshRateConfigs();
- LayerHistory::Summary summary = mLayerHistory.summarize(*refreshRateConfigs, systemTime());
- {
- std::lock_guard<std::mutex> lock(mPolicyLock);
- mPolicy.contentRequirements = std::move(summary);
-
- std::tie(newMode, consideredSignals) = chooseDisplayMode();
- frameRateOverridesChanged = updateFrameRateOverrides(consideredSignals, newMode->getFps());
-
- if (mPolicy.mode == newMode) {
- // We don't need to change the display mode, but we might need to send an event
- // about a mode change, since it was suppressed due to a previous idleConsidered
- if (!consideredSignals.idle) {
- dispatchCachedReportedMode();
- }
- frameRateChanged = false;
- } else {
- mPolicy.mode = newMode;
- frameRateChanged = true;
- }
- }
- if (frameRateChanged) {
- const auto newRefreshRate = refreshRateConfigs->getRefreshRateFromModeId(newMode->getId());
-
- mSchedulerCallback.changeRefreshRate(newRefreshRate,
- consideredSignals.idle ? DisplayModeEvent::None
- : DisplayModeEvent::Changed);
- }
- if (frameRateOverridesChanged) {
- mSchedulerCallback.triggerOnFrameRateOverridesChanged();
- }
+ LayerHistory::Summary summary = mLayerHistory.summarize(*configs, systemTime());
+ applyPolicy(&Policy::contentRequirements, std::move(summary));
}
void Scheduler::resetIdleTimer() {
@@ -636,7 +599,7 @@
}
void Scheduler::idleTimerCallback(TimerState state) {
- handleTimerStateChanged(&mPolicy.idleTimer, state);
+ applyPolicy(&Policy::idleTimer, state);
ATRACE_INT("ExpiredIdleTimer", static_cast<int>(state));
}
@@ -646,14 +609,14 @@
// Clear layer history to get fresh FPS detection.
// NOTE: Instead of checking all the layers, we should be checking the layer
// that is currently on top. b/142507166 will give us this capability.
- if (handleTimerStateChanged(&mPolicy.touch, touch)) {
+ if (applyPolicy(&Policy::touch, touch).touch) {
mLayerHistory.clear();
}
ATRACE_INT("TouchState", static_cast<int>(touch));
}
void Scheduler::displayPowerTimerCallback(TimerState state) {
- handleTimerStateChanged(&mPolicy.displayPowerTimer, state);
+ applyPolicy(&Policy::displayPowerTimer, state);
ATRACE_INT("ExpiredDisplayPowerTimer", static_cast<int>(state));
}
@@ -695,8 +658,8 @@
return false;
}
-template <class T>
-bool Scheduler::handleTimerStateChanged(T* currentState, T newState) {
+template <typename S, typename T>
+auto Scheduler::applyPolicy(S Policy::*statePtr, T&& newState) -> GlobalSignals {
DisplayModePtr newMode;
GlobalSignals consideredSignals;
@@ -706,15 +669,17 @@
const auto refreshRateConfigs = holdRefreshRateConfigs();
{
std::lock_guard<std::mutex> lock(mPolicyLock);
- if (*currentState == newState) {
- return false;
- }
- *currentState = newState;
+
+ auto& currentState = mPolicy.*statePtr;
+ if (currentState == newState) return {};
+ currentState = std::forward<T>(newState);
+
std::tie(newMode, consideredSignals) = chooseDisplayMode();
frameRateOverridesChanged = updateFrameRateOverrides(consideredSignals, newMode->getFps());
+
if (mPolicy.mode == newMode) {
// We don't need to change the display mode, but we might need to send an event
- // about a mode change, since it was suppressed due to a previous idleConsidered
+ // about a mode change, since it was suppressed if previously considered idle.
if (!consideredSignals.idle) {
dispatchCachedReportedMode();
}
@@ -733,7 +698,7 @@
if (frameRateOverridesChanged) {
mSchedulerCallback.triggerOnFrameRateOverridesChanged();
}
- return consideredSignals.touch;
+ return consideredSignals;
}
auto Scheduler::chooseDisplayMode() -> std::pair<DisplayModePtr, GlobalSignals> {