Loading services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +23 −2 Original line number Diff line number Diff line Loading @@ -929,17 +929,38 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, RefreshRateOrder refreshRateOrder, std::optional<DisplayModeId> preferredDisplayModeOpt) const -> FrameRateRanking { using fps_approx_ops::operator<; const char* const whence = __func__; // find the highest frame rate for each display mode ftl::SmallMap<DisplayModeId, Fps, 8> maxRenderRateForMode; const bool ascending = (refreshRateOrder == RefreshRateOrder::Ascending); if (ascending) { // TODO(b/266481656): Once this bug is fixed, we can remove this workaround and actually // use a lower frame rate when we want Ascending frame rates. for (const auto& frameRateMode : mPrimaryFrameRates) { if (anchorGroupOpt && frameRateMode.modePtr->getGroup() != anchorGroupOpt) { continue; } const auto [iter, _] = maxRenderRateForMode.try_emplace(frameRateMode.modePtr->getId(), frameRateMode.fps); if (iter->second < frameRateMode.fps) { iter->second = frameRateMode.fps; } } } std::deque<ScoredFrameRate> ranking; const auto rankFrameRate = [&](const FrameRateMode& frameRateMode) REQUIRES(mLock) { using fps_approx_ops::operator<; const auto& modePtr = frameRateMode.modePtr; if (anchorGroupOpt && modePtr->getGroup() != anchorGroupOpt) { return; } const bool ascending = (refreshRateOrder == RefreshRateOrder::Ascending); if (ascending && frameRateMode.fps < getMinRefreshRateByPolicyLocked()->getFps()) { const auto id = frameRateMode.modePtr->getId(); if (ascending && frameRateMode.fps < *maxRenderRateForMode.get(id)) { // TODO(b/266481656): Once this bug is fixed, we can remove this workaround and actually // use a lower frame rate when we want Ascending frame rates. return; Loading services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -1165,7 +1165,7 @@ TEST_P(RefreshRateSelectorTest, getMinRefreshRatesByPolicy) { case Config::FrameRateOverride::AppOverride: return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; case Config::FrameRateOverride::Enabled: return {{30_Hz, kMode30}, {45_Hz, kMode90}, {60_Hz, kMode60}, {90_Hz, kMode90}}; return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; } }(); ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size()); Loading Loading @@ -1197,7 +1197,7 @@ TEST_P(RefreshRateSelectorTest, getMinRefreshRatesByPolicyOutsideTheGroup) { case Config::FrameRateOverride::AppOverride: return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; case Config::FrameRateOverride::Enabled: return {{30_Hz, kMode30}, {45_Hz, kMode90}, {60_Hz, kMode60}, {90_Hz, kMode90}}; return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; } }(); ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size()); Loading Loading @@ -2983,5 +2983,24 @@ TEST_P(RefreshRateSelectorTest, noLowerFrameRateOnMinVote) { EXPECT_FRAME_RATE_MODE(kMode60, 60_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } TEST_P(RefreshRateSelectorTest, frameRateIsCappedByPolicy) { if (GetParam() != Config::FrameRateOverride::Enabled) { return; } auto selector = createSelector(kModes_60_90, kModeId60); constexpr FpsRanges kCappedAt30 = {{60_Hz, 90_Hz}, {30_Hz, 30_Hz}}; EXPECT_EQ(SetPolicyResult::Changed, selector.setDisplayManagerPolicy( {DisplayModeId(kModeId60), kCappedAt30, kCappedAt30})); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; layers[0].name = "Test layer"; layers[0].vote = LayerVoteType::Min; EXPECT_FRAME_RATE_MODE(kMode60, 30_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } } // namespace } // namespace android::scheduler Loading
services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +23 −2 Original line number Diff line number Diff line Loading @@ -929,17 +929,38 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, RefreshRateOrder refreshRateOrder, std::optional<DisplayModeId> preferredDisplayModeOpt) const -> FrameRateRanking { using fps_approx_ops::operator<; const char* const whence = __func__; // find the highest frame rate for each display mode ftl::SmallMap<DisplayModeId, Fps, 8> maxRenderRateForMode; const bool ascending = (refreshRateOrder == RefreshRateOrder::Ascending); if (ascending) { // TODO(b/266481656): Once this bug is fixed, we can remove this workaround and actually // use a lower frame rate when we want Ascending frame rates. for (const auto& frameRateMode : mPrimaryFrameRates) { if (anchorGroupOpt && frameRateMode.modePtr->getGroup() != anchorGroupOpt) { continue; } const auto [iter, _] = maxRenderRateForMode.try_emplace(frameRateMode.modePtr->getId(), frameRateMode.fps); if (iter->second < frameRateMode.fps) { iter->second = frameRateMode.fps; } } } std::deque<ScoredFrameRate> ranking; const auto rankFrameRate = [&](const FrameRateMode& frameRateMode) REQUIRES(mLock) { using fps_approx_ops::operator<; const auto& modePtr = frameRateMode.modePtr; if (anchorGroupOpt && modePtr->getGroup() != anchorGroupOpt) { return; } const bool ascending = (refreshRateOrder == RefreshRateOrder::Ascending); if (ascending && frameRateMode.fps < getMinRefreshRateByPolicyLocked()->getFps()) { const auto id = frameRateMode.modePtr->getId(); if (ascending && frameRateMode.fps < *maxRenderRateForMode.get(id)) { // TODO(b/266481656): Once this bug is fixed, we can remove this workaround and actually // use a lower frame rate when we want Ascending frame rates. return; Loading
services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -1165,7 +1165,7 @@ TEST_P(RefreshRateSelectorTest, getMinRefreshRatesByPolicy) { case Config::FrameRateOverride::AppOverride: return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; case Config::FrameRateOverride::Enabled: return {{30_Hz, kMode30}, {45_Hz, kMode90}, {60_Hz, kMode60}, {90_Hz, kMode90}}; return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; } }(); ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size()); Loading Loading @@ -1197,7 +1197,7 @@ TEST_P(RefreshRateSelectorTest, getMinRefreshRatesByPolicyOutsideTheGroup) { case Config::FrameRateOverride::AppOverride: return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; case Config::FrameRateOverride::Enabled: return {{30_Hz, kMode30}, {45_Hz, kMode90}, {60_Hz, kMode60}, {90_Hz, kMode90}}; return {{30_Hz, kMode30}, {60_Hz, kMode60}, {90_Hz, kMode90}}; } }(); ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size()); Loading Loading @@ -2983,5 +2983,24 @@ TEST_P(RefreshRateSelectorTest, noLowerFrameRateOnMinVote) { EXPECT_FRAME_RATE_MODE(kMode60, 60_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } TEST_P(RefreshRateSelectorTest, frameRateIsCappedByPolicy) { if (GetParam() != Config::FrameRateOverride::Enabled) { return; } auto selector = createSelector(kModes_60_90, kModeId60); constexpr FpsRanges kCappedAt30 = {{60_Hz, 90_Hz}, {30_Hz, 30_Hz}}; EXPECT_EQ(SetPolicyResult::Changed, selector.setDisplayManagerPolicy( {DisplayModeId(kModeId60), kCappedAt30, kCappedAt30})); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; layers[0].name = "Test layer"; layers[0].vote = LayerVoteType::Min; EXPECT_FRAME_RATE_MODE(kMode60, 30_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } } // namespace } // namespace android::scheduler