Loading services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +11 −2 Original line number Diff line number Diff line Loading @@ -932,14 +932,22 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, const char* const whence = __func__; 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()) { // 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; } float score = calculateDistanceScoreFromMax(frameRateMode.fps); const bool inverseScore = (refreshRateOrder == RefreshRateOrder::Ascending); if (inverseScore) { if (ascending) { score = 1.0f / score; } if (preferredDisplayModeOpt) { Loading @@ -951,6 +959,7 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, constexpr float kNonPreferredModePenalty = 0.95f; score *= kNonPreferredModePenalty; } ALOGV("%s(%s) %s (%s) scored %.2f", whence, ftl::enum_string(refreshRateOrder).c_str(), to_string(frameRateMode.fps).c_str(), to_string(modePtr->getFps()).c_str(), score); ranking.emplace_back(ScoredFrameRate{frameRateMode, score}); Loading services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -2973,5 +2973,15 @@ TEST_P(RefreshRateSelectorTest, SupportsLowPhysicalRefreshRates) { EXPECT_EQ(kMode1, selector.getMinRefreshRateByPolicy()); } // TODO(b/266481656): Once this bug is fixed, we can remove this test TEST_P(RefreshRateSelectorTest, noLowerFrameRateOnMinVote) { auto selector = createSelector(kModes_60_90, kModeId60); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; layers[0].name = "Test layer"; layers[0].vote = LayerVoteType::Min; EXPECT_FRAME_RATE_MODE(kMode60, 60_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } } // namespace } // namespace android::scheduler Loading
services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +11 −2 Original line number Diff line number Diff line Loading @@ -932,14 +932,22 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, const char* const whence = __func__; 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()) { // 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; } float score = calculateDistanceScoreFromMax(frameRateMode.fps); const bool inverseScore = (refreshRateOrder == RefreshRateOrder::Ascending); if (inverseScore) { if (ascending) { score = 1.0f / score; } if (preferredDisplayModeOpt) { Loading @@ -951,6 +959,7 @@ auto RefreshRateSelector::rankFrameRates(std::optional<int> anchorGroupOpt, constexpr float kNonPreferredModePenalty = 0.95f; score *= kNonPreferredModePenalty; } ALOGV("%s(%s) %s (%s) scored %.2f", whence, ftl::enum_string(refreshRateOrder).c_str(), to_string(frameRateMode.fps).c_str(), to_string(modePtr->getFps()).c_str(), score); ranking.emplace_back(ScoredFrameRate{frameRateMode, score}); Loading
services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -2973,5 +2973,15 @@ TEST_P(RefreshRateSelectorTest, SupportsLowPhysicalRefreshRates) { EXPECT_EQ(kMode1, selector.getMinRefreshRateByPolicy()); } // TODO(b/266481656): Once this bug is fixed, we can remove this test TEST_P(RefreshRateSelectorTest, noLowerFrameRateOnMinVote) { auto selector = createSelector(kModes_60_90, kModeId60); std::vector<LayerRequirement> layers = {{.weight = 1.f}}; layers[0].name = "Test layer"; layers[0].vote = LayerVoteType::Min; EXPECT_FRAME_RATE_MODE(kMode60, 60_Hz, selector.getBestScoredFrameRate(layers).frameRateMode); } } // namespace } // namespace android::scheduler