Loading services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -855,7 +855,7 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi ALOGV("Touch Boost"); ATRACE_FORMAT_INSTANT("%s (Touch Boost [late])", to_string(touchRefreshRates.front().frameRateMode.fps).c_str()); return {touchRefreshRates, GlobalSignals{.touch = signals.touch}}; return {touchRefreshRates, GlobalSignals{.touch = true}}; } // If we never scored any layers, and we don't favor high refresh rates, prefer to stay with the Loading services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +29 −21 Original line number Diff line number Diff line Loading @@ -103,7 +103,7 @@ struct TestableRefreshRateSelector : RefreshRateSelector { auto& mutableGetRankedRefreshRatesCache() { return mGetRankedFrameRatesCache; } auto getRankedFrameRates(const std::vector<LayerRequirement>& layers, GlobalSignals signals) const { GlobalSignals signals = {}) const { const auto result = RefreshRateSelector::getRankedFrameRates(layers, signals); EXPECT_TRUE(std::is_sorted(result.ranking.begin(), result.ranking.end(), Loading Loading @@ -1619,10 +1619,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr1.name = "ExplicitCategory HighHint"; lr2.vote = LayerVoteType::NoVote; lr2.name = "NoVote"; auto actualFrameRateMode = selector.getBestFrameRateMode(layers); auto actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); // No touch boost, for example a game that uses setFrameRate(30, default compatibility). lr1.vote = LayerVoteType::ExplicitCategory; Loading @@ -1631,9 +1632,10 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitDefault; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitDefault"; actualFrameRateMode = selector.getBestFrameRateMode(layers); EXPECT_EQ(30_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId30, actualFrameRateMode.modePtr->getId()); actualRankedFrameRates = selector.getRankedFrameRates(layers); EXPECT_EQ(30_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId30, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1641,10 +1643,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::HighHint; lr2.name = "ExplicitCategory HighHint#2"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1652,10 +1655,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::Low; lr2.name = "ExplicitCategory Low"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1663,10 +1667,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitExactOrMultiple; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExactOrMultiple"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1674,14 +1679,17 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitExact; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExact"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); if (selector.supportsAppFrameRateOverrideByContent()) { // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); } else { EXPECT_EQ(30_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId30, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(30_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId30, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); } } Loading services/surfaceflinger/tests/unittests/SchedulerTest.cpp +55 −0 Original line number Diff line number Diff line Loading @@ -339,6 +339,61 @@ TEST_F(SchedulerTest, chooseDisplayModesSingleDisplay) { EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, globalSignals)); } TEST_F(SchedulerTest, chooseDisplayModesSingleDisplayHighHintTouchSignal) { mScheduler->registerDisplay(kDisplayId1, std::make_shared<RefreshRateSelector>(kDisplay1Modes, kDisplay1Mode60->getId())); using DisplayModeChoice = TestableScheduler::DisplayModeChoice; std::vector<RefreshRateSelector::LayerRequirement> layers = std::vector<RefreshRateSelector::LayerRequirement>({{.weight = 1.f}, {.weight = 1.f}}); auto& lr1 = layers[0]; auto& lr2 = layers[1]; // Scenario that is similar to game. Expects no touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitDefault; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitDefault"; mScheduler->setContentRequirements(layers); auto modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); auto choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({60_Hz, kDisplay1Mode60}, {.touch = false})); // Scenario that is similar to video playback and interaction. Expects touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitExactOrMultiple; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExactOrMultiple"; mScheduler->setContentRequirements(layers); modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, {.touch = true})); // Scenario with explicit category and HighHint. Expects touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::Low; lr2.name = "ExplicitCategory Low"; mScheduler->setContentRequirements(layers); modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, {.touch = true})); } TEST_F(SchedulerTest, chooseDisplayModesMultipleDisplays) { mScheduler->registerDisplay(kDisplayId1, std::make_shared<RefreshRateSelector>(kDisplay1Modes, Loading Loading
services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -855,7 +855,7 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi ALOGV("Touch Boost"); ATRACE_FORMAT_INSTANT("%s (Touch Boost [late])", to_string(touchRefreshRates.front().frameRateMode.fps).c_str()); return {touchRefreshRates, GlobalSignals{.touch = signals.touch}}; return {touchRefreshRates, GlobalSignals{.touch = true}}; } // If we never scored any layers, and we don't favor high refresh rates, prefer to stay with the Loading
services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +29 −21 Original line number Diff line number Diff line Loading @@ -103,7 +103,7 @@ struct TestableRefreshRateSelector : RefreshRateSelector { auto& mutableGetRankedRefreshRatesCache() { return mGetRankedFrameRatesCache; } auto getRankedFrameRates(const std::vector<LayerRequirement>& layers, GlobalSignals signals) const { GlobalSignals signals = {}) const { const auto result = RefreshRateSelector::getRankedFrameRates(layers, signals); EXPECT_TRUE(std::is_sorted(result.ranking.begin(), result.ranking.end(), Loading Loading @@ -1619,10 +1619,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr1.name = "ExplicitCategory HighHint"; lr2.vote = LayerVoteType::NoVote; lr2.name = "NoVote"; auto actualFrameRateMode = selector.getBestFrameRateMode(layers); auto actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); // No touch boost, for example a game that uses setFrameRate(30, default compatibility). lr1.vote = LayerVoteType::ExplicitCategory; Loading @@ -1631,9 +1632,10 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitDefault; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitDefault"; actualFrameRateMode = selector.getBestFrameRateMode(layers); EXPECT_EQ(30_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId30, actualFrameRateMode.modePtr->getId()); actualRankedFrameRates = selector.getRankedFrameRates(layers); EXPECT_EQ(30_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId30, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1641,10 +1643,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::HighHint; lr2.name = "ExplicitCategory HighHint#2"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1652,10 +1655,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::Low; lr2.name = "ExplicitCategory Low"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1663,10 +1667,11 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitExactOrMultiple; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExactOrMultiple"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; Loading @@ -1674,14 +1679,17 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH lr2.vote = LayerVoteType::ExplicitExact; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExact"; actualFrameRateMode = selector.getBestFrameRateMode(layers); actualRankedFrameRates = selector.getRankedFrameRates(layers); if (selector.supportsAppFrameRateOverrideByContent()) { // Gets touch boost EXPECT_EQ(120_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId120, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); } else { EXPECT_EQ(30_Hz, actualFrameRateMode.fps); EXPECT_EQ(kModeId30, actualFrameRateMode.modePtr->getId()); EXPECT_EQ(30_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId30, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); } } Loading
services/surfaceflinger/tests/unittests/SchedulerTest.cpp +55 −0 Original line number Diff line number Diff line Loading @@ -339,6 +339,61 @@ TEST_F(SchedulerTest, chooseDisplayModesSingleDisplay) { EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, globalSignals)); } TEST_F(SchedulerTest, chooseDisplayModesSingleDisplayHighHintTouchSignal) { mScheduler->registerDisplay(kDisplayId1, std::make_shared<RefreshRateSelector>(kDisplay1Modes, kDisplay1Mode60->getId())); using DisplayModeChoice = TestableScheduler::DisplayModeChoice; std::vector<RefreshRateSelector::LayerRequirement> layers = std::vector<RefreshRateSelector::LayerRequirement>({{.weight = 1.f}, {.weight = 1.f}}); auto& lr1 = layers[0]; auto& lr2 = layers[1]; // Scenario that is similar to game. Expects no touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitDefault; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitDefault"; mScheduler->setContentRequirements(layers); auto modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); auto choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({60_Hz, kDisplay1Mode60}, {.touch = false})); // Scenario that is similar to video playback and interaction. Expects touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitExactOrMultiple; lr2.desiredRefreshRate = 30_Hz; lr2.name = "30Hz ExplicitExactOrMultiple"; mScheduler->setContentRequirements(layers); modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, {.touch = true})); // Scenario with explicit category and HighHint. Expects touch boost. lr1.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::HighHint; lr1.name = "ExplicitCategory HighHint"; lr2.vote = RefreshRateSelector::LayerVoteType::ExplicitCategory; lr2.frameRateCategory = FrameRateCategory::Low; lr2.name = "ExplicitCategory Low"; mScheduler->setContentRequirements(layers); modeChoices = mScheduler->chooseDisplayModes(); ASSERT_EQ(1u, modeChoices.size()); choice = modeChoices.get(kDisplayId1); ASSERT_TRUE(choice); EXPECT_EQ(choice->get(), DisplayModeChoice({120_Hz, kDisplay1Mode120}, {.touch = true})); } TEST_F(SchedulerTest, chooseDisplayModesMultipleDisplays) { mScheduler->registerDisplay(kDisplayId1, std::make_shared<RefreshRateSelector>(kDisplay1Modes, Loading