Skip to content

Commit 5cf032c

Browse files
Rachel LeeAndroid Build Cherrypicker Worker
authored andcommitted
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
1 parent 47c8085 commit 5cf032c

2 files changed

Lines changed: 44 additions & 6 deletions

File tree

services/surfaceflinger/Scheduler/RefreshRateSelector.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,8 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi
841841
return score.overallScore == 0;
842842
});
843843

844-
if (policy->primaryRangeIsSingleRate()) {
844+
// TODO(b/364651864): Evaluate correctness of primaryRangeIsSingleRate.
845+
if (!isVrrDevice() && policy->primaryRangeIsSingleRate()) {
845846
// If we never scored any layers, then choose the rate from the primary
846847
// range instead of picking a random score from the app range.
847848
if (noLayerScore) {
@@ -887,10 +888,10 @@ auto RefreshRateSelector::getRankedFrameRatesLocked(const std::vector<LayerRequi
887888
const auto touchRefreshRates = rankFrameRates(anchorGroup, RefreshRateOrder::Descending);
888889
using fps_approx_ops::operator<;
889890

890-
if (scores.front().frameRateMode.fps < touchRefreshRates.front().frameRateMode.fps) {
891-
ALOGV("Touch Boost");
891+
if (scores.front().frameRateMode.fps <= touchRefreshRates.front().frameRateMode.fps) {
892+
ALOGV("Touch Boost [late]");
892893
ATRACE_FORMAT_INSTANT("%s (Touch Boost [late])",
893-
to_string(touchRefreshRates.front().frameRateMode.fps).c_str());
894+
to_string(touchRefreshRates.front().frameRateMode.fps).c_str());
894895
return {touchRefreshRates, GlobalSignals{.touch = true}};
895896
}
896897
}

services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,43 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_60_12
17661766
}
17671767
}
17681768

1769+
TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_vrrHighHintTouch_primaryRangeIsSingleRate) {
1770+
if (GetParam() != Config::FrameRateOverride::Enabled) {
1771+
return;
1772+
}
1773+
1774+
SET_FLAG_FOR_TEST(flags::vrr_config, true);
1775+
1776+
auto selector = createSelector(kVrrMode_120, kModeId120);
1777+
selector.setActiveMode(kModeId120, 60_Hz);
1778+
1779+
// Change primary physical range to be single rate, which on VRR device should not affect
1780+
// fps scoring.
1781+
EXPECT_EQ(SetPolicyResult::Changed,
1782+
selector.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}));
1783+
1784+
std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
1785+
layers[0].vote = LayerVoteType::ExplicitCategory;
1786+
layers[0].frameRateCategory = FrameRateCategory::HighHint;
1787+
layers[0].name = "ExplicitCategory HighHint";
1788+
1789+
auto actualRankedFrameRates = selector.getRankedFrameRates(layers);
1790+
// Expect late touch boost from HighHint.
1791+
EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);
1792+
EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId());
1793+
EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch);
1794+
1795+
layers[1].vote = LayerVoteType::ExplicitExactOrMultiple;
1796+
layers[1].desiredRefreshRate = 30_Hz;
1797+
layers[1].name = "ExplicitExactOrMultiple 30Hz";
1798+
1799+
actualRankedFrameRates = selector.getRankedFrameRates(layers);
1800+
// Expect late touch boost from HighHint.
1801+
EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);
1802+
EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId());
1803+
EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch);
1804+
}
1805+
17691806
TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighHint) {
17701807
auto selector = createSelector(makeModes(kMode24, kMode30, kMode60, kMode120), kModeId60);
17711808

@@ -1884,7 +1921,7 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_HighH
18841921
// Gets touch boost
18851922
EXPECT_EQ(120_Hz, actualRankedFrameRates.ranking.front().frameRateMode.fps);
18861923
EXPECT_EQ(kModeId120, actualRankedFrameRates.ranking.front().frameRateMode.modePtr->getId());
1887-
EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch);
1924+
EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch);
18881925
}
18891926

18901927
TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_TouchBoost) {
@@ -1978,7 +2015,7 @@ TEST_P(RefreshRateSelectorTest, getBestFrameRateMode_withFrameRateCategory_Touch
19782015
lr2.name = "Max";
19792016
actualRankedFrameRates = selector.getRankedFrameRates(layers, {.touch = true});
19802017
EXPECT_FRAME_RATE_MODE(kMode120, 120_Hz, actualRankedFrameRates.ranking.front().frameRateMode);
1981-
EXPECT_FALSE(actualRankedFrameRates.consideredSignals.touch);
2018+
EXPECT_TRUE(actualRankedFrameRates.consideredSignals.touch);
19822019

19832020
lr1.vote = LayerVoteType::ExplicitCategory;
19842021
lr1.frameRateCategory = FrameRateCategory::Normal;

0 commit comments

Comments
 (0)