Loading services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -280,6 +280,15 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire ATRACE_CALL(); ALOGV("%s: %zu layers", __func__, layers.size()); const auto& activeMode = *getActiveModeItLocked()->second; // Keep the display at max refresh rate for the duration of powering on the display. if (signals.powerOnImminent) { ALOGV("Power On Imminent"); const auto& max = getMaxRefreshRateByPolicyLocked(activeMode.getGroup()); return {max, GlobalSignals{.powerOnImminent = true}}; } int noVoteLayers = 0; int minVoteLayers = 0; int maxVoteLayers = 0; Loading Loading @@ -326,7 +335,6 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire const Policy* policy = getCurrentPolicyLocked(); const auto& defaultMode = mDisplayModes.get(policy->defaultMode)->get(); const auto& activeMode = *getActiveModeItLocked()->second; // If the default mode group is different from the group of current mode, // this means a layer requesting a seamed mode switch just disappeared and Loading services/surfaceflinger/Scheduler/RefreshRateConfigs.h +5 −1 Original line number Diff line number Diff line Loading @@ -185,9 +185,13 @@ public: bool touch = false; // True if the system hasn't seen any buffers posted to layers recently. bool idle = false; // Whether the display is about to be powered on, or has been in PowerMode::ON // within the timeout of DisplayPowerTimer. bool powerOnImminent = false; bool operator==(GlobalSignals other) const { return touch == other.touch && idle == other.idle; return touch == other.touch && idle == other.idle && powerOnImminent == other.powerOnImminent; } }; Loading services/surfaceflinger/Scheduler/Scheduler.cpp +5 −9 Original line number Diff line number Diff line Loading @@ -704,17 +704,13 @@ auto Scheduler::chooseDisplayMode() -> std::pair<DisplayModePtr, GlobalSignals> const auto configs = holdRefreshRateConfigs(); // If Display Power is not in normal operation we want to be in performance mode. When coming // back to normal mode, a grace period is given with DisplayPowerTimer. if (mDisplayPowerTimer && const bool powerOnImminent = mDisplayPowerTimer && (mPolicy.displayPowerMode != hal::PowerMode::ON || mPolicy.displayPowerTimer == TimerState::Reset)) { constexpr GlobalSignals kNoSignals; return {configs->getMaxRefreshRateByPolicy(), kNoSignals}; } mPolicy.displayPowerTimer == TimerState::Reset); const GlobalSignals signals{.touch = mTouchTimer && mPolicy.touch == TouchState::Active, .idle = mPolicy.idleTimer == TimerState::Expired}; .idle = mPolicy.idleTimer == TimerState::Expired, .powerOnImminent = powerOnImminent}; return configs->getBestRefreshRate(mPolicy.contentRequirements, signals); } Loading services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -977,6 +977,32 @@ TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) { EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers)); } TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) { RefreshRateConfigs configs(kModes_60_90, kModeId60); auto [refreshRate, signals] = configs.getBestRefreshRate({}, {}); EXPECT_FALSE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); std::tie(refreshRate, signals) = configs.getBestRefreshRate({}, {.powerOnImminent = true}); EXPECT_TRUE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; auto& lr1 = layers[0]; lr1.vote = LayerVoteType::ExplicitExactOrMultiple; lr1.desiredRefreshRate = 60_Hz; lr1.name = "60Hz ExplicitExactOrMultiple"; std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = false}); EXPECT_FALSE(signals.powerOnImminent); EXPECT_EQ(kMode60, refreshRate); std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = true}); EXPECT_TRUE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); } TEST_F(RefreshRateConfigsTest, touchConsidered) { RefreshRateConfigs configs(kModes_60_90, kModeId60); Loading Loading
services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -280,6 +280,15 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire ATRACE_CALL(); ALOGV("%s: %zu layers", __func__, layers.size()); const auto& activeMode = *getActiveModeItLocked()->second; // Keep the display at max refresh rate for the duration of powering on the display. if (signals.powerOnImminent) { ALOGV("Power On Imminent"); const auto& max = getMaxRefreshRateByPolicyLocked(activeMode.getGroup()); return {max, GlobalSignals{.powerOnImminent = true}}; } int noVoteLayers = 0; int minVoteLayers = 0; int maxVoteLayers = 0; Loading Loading @@ -326,7 +335,6 @@ auto RefreshRateConfigs::getBestRefreshRateLocked(const std::vector<LayerRequire const Policy* policy = getCurrentPolicyLocked(); const auto& defaultMode = mDisplayModes.get(policy->defaultMode)->get(); const auto& activeMode = *getActiveModeItLocked()->second; // If the default mode group is different from the group of current mode, // this means a layer requesting a seamed mode switch just disappeared and Loading
services/surfaceflinger/Scheduler/RefreshRateConfigs.h +5 −1 Original line number Diff line number Diff line Loading @@ -185,9 +185,13 @@ public: bool touch = false; // True if the system hasn't seen any buffers posted to layers recently. bool idle = false; // Whether the display is about to be powered on, or has been in PowerMode::ON // within the timeout of DisplayPowerTimer. bool powerOnImminent = false; bool operator==(GlobalSignals other) const { return touch == other.touch && idle == other.idle; return touch == other.touch && idle == other.idle && powerOnImminent == other.powerOnImminent; } }; Loading
services/surfaceflinger/Scheduler/Scheduler.cpp +5 −9 Original line number Diff line number Diff line Loading @@ -704,17 +704,13 @@ auto Scheduler::chooseDisplayMode() -> std::pair<DisplayModePtr, GlobalSignals> const auto configs = holdRefreshRateConfigs(); // If Display Power is not in normal operation we want to be in performance mode. When coming // back to normal mode, a grace period is given with DisplayPowerTimer. if (mDisplayPowerTimer && const bool powerOnImminent = mDisplayPowerTimer && (mPolicy.displayPowerMode != hal::PowerMode::ON || mPolicy.displayPowerTimer == TimerState::Reset)) { constexpr GlobalSignals kNoSignals; return {configs->getMaxRefreshRateByPolicy(), kNoSignals}; } mPolicy.displayPowerTimer == TimerState::Reset); const GlobalSignals signals{.touch = mTouchTimer && mPolicy.touch == TouchState::Active, .idle = mPolicy.idleTimer == TimerState::Expired}; .idle = mPolicy.idleTimer == TimerState::Expired, .powerOnImminent = powerOnImminent}; return configs->getBestRefreshRate(mPolicy.contentRequirements, signals); } Loading
services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -977,6 +977,32 @@ TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) { EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers)); } TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) { RefreshRateConfigs configs(kModes_60_90, kModeId60); auto [refreshRate, signals] = configs.getBestRefreshRate({}, {}); EXPECT_FALSE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); std::tie(refreshRate, signals) = configs.getBestRefreshRate({}, {.powerOnImminent = true}); EXPECT_TRUE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; auto& lr1 = layers[0]; lr1.vote = LayerVoteType::ExplicitExactOrMultiple; lr1.desiredRefreshRate = 60_Hz; lr1.name = "60Hz ExplicitExactOrMultiple"; std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = false}); EXPECT_FALSE(signals.powerOnImminent); EXPECT_EQ(kMode60, refreshRate); std::tie(refreshRate, signals) = configs.getBestRefreshRate(layers, {.powerOnImminent = true}); EXPECT_TRUE(signals.powerOnImminent); EXPECT_EQ(kMode90, refreshRate); } TEST_F(RefreshRateConfigsTest, touchConsidered) { RefreshRateConfigs configs(kModes_60_90, kModeId60); Loading