RefreshRateConfigs: fix getMaxRefreshRateByPolicyLocked
If there are no layers which are requesting a
non seamless switch getMaxRefreshRateByPolicyLocked
should return the max refresh rate from the group of
the default mode (and not the group of the current mode).
This fixes a bug where when the display mode is never
reset to default after we exit an app which has called
setFrameRate with changeFrameRateStrategy=Always.
This change should have no affect phones, because
there all modes are in the same config group.
Bug: 199270559
Test: atest MatchContentFrameRateTest SetFrameRateTest
Test: atest RefreshRateConfigsTest
Change-Id: I6ff200a85edf026b0d04d4a06a13995832ffdab4
diff --git a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
index a6bfde7..618c10d 100644
--- a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
+++ b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp
@@ -349,10 +349,19 @@
EXPECT_EQ(mExpected90Config,
refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
- ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
- 0);
+ ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
+ NO_ERROR);
EXPECT_EQ(mExpected60Config,
refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
+
+ // We select max even when this will cause a non-seamless switch.
+ refreshRateConfigs = std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
+ /*currentConfigId=*/HWC_CONFIG_ID_60);
+ ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy(
+ {HWC_CONFIG_ID_90, /*allowGroupSwitching*/ true, {Fps(0), Fps(90)}}),
+ NO_ERROR);
+ EXPECT_EQ(mExpected90DifferentGroupConfig,
+ refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
}
TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {