From 5cf032c4c53f5930091be2a145530d49bce7fae5 Mon Sep 17 00:00:00 2001 From: Rachel Lee Date: Fri, 20 Sep 2024 18:50:36 +0000 Subject: DO_NOT_MERGE Fix primaryRangeIsSingleRate + touch on dVRR Disable a primaryRangeIsSingleRate section on dVRR and allow late touch boost to trigger when no layer score. On dVRR display, the primary physical range may be a single rate, but late touch boost should still be able to trigger. Bug: 353142444 Bug: 362379874 Flag: EXEMPT_bugfix Test: atest libsurfaceflinger_unittest Test: Twitter scrolling with and without video, with policy backdoor Test: notification shade scrolling with policy backdoor (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7bedfbf0d7b106702a241a64a79c36205606496c) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:14e725f4ba7d1f71af2067945498a676372e0499) Merged-In: Ic5b2b298fe0df357f77ef8f06b1fc0fc248e0498 Change-Id: Ic5b2b298fe0df357f77ef8f06b1fc0fc248e0498 --- .../Scheduler/RefreshRateSelector.cpp | 9 ++--- .../tests/unittests/RefreshRateSelectorTest.cpp | 41 ++++++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp index 846727b1d5..234f1cb97f 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp @@ -841,7 +841,8 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vectorprimaryRangeIsSingleRate()) { + // TODO(b/364651864): Evaluate correctness of primaryRangeIsSingleRate. + if (!isVrrDevice() && policy->primaryRangeIsSingleRate()) { // If we never scored any layers, then choose the rate from the primary // range instead of picking a random score from the app range. if (noLayerScore) { @@ -887,10 +888,10 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector layers = {{.weight = 1.f}, {.weight = 1.f}}; + layers[0].vote = LayerVoteType::ExplicitCategory; + layers[0].frameRateCategory = FrameRateCategory::HighHint; + layers[0].name = "ExplicitCategory HighHint"; + + auto actualRankedFrameRates = selector.getRankedFrameRates(layers); + // Expect late touch boost from HighHint. + EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); + EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); + EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); + + layers[1].vote = LayerVoteType::ExplicitExactOrMultiple; + layers[1].desiredRefreshRate = 30_Hz; + layers[1].name = "ExplicitExactOrMultiple 30Hz"; + + actualRankedFrameRates = selector.getRankedFrameRates(layers); + // Expect late touch boost from HighHint. + EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); + EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); + EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); +} + TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighHint) { auto selector = createSelector(makeModes(kMode24, kMode30, kMode60, kMode120), kModeId60); @@ -1884,7 +1921,7 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH // Gets touch boost EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps); EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId()); - EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); + EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); } TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_TouchBoost) { @@ -1978,7 +2015,7 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_Touch lr2.name = "Max"; actualRankedFrameRates = selector.getRankedFrameRates(layers, {.touch = true}); EXPECT_FRAME_RATE_MODE(kMode120, 120_Hz, actualRankedFrameRates.ranking.front().frameRateMode); - EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch); + EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch); lr1.vote = LayerVoteType::ExplicitCategory; lr1.frameRateCategory = FrameRateCategory::Normal; -- cgit v1.2.3-59-g8ed1b