blob: fcde532b859125b17ad6e83056cb0004c48afbdf [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "SchedulerUnittests"
19
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070020#include <ftl/enum.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#include <gmock/gmock.h>
22#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010023#include <ui/Size.h>
24
Alec Mouri0a1cc962019-03-14 12:33:02 -070025#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070026#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070027#include "Scheduler/RefreshRateConfigs.h"
Dominik Laskowskib0054a22022-03-03 09:03:06 -080028#include "mock/DisplayHardware/MockDisplayMode.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070029
30using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070031
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070032namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
Peiyong Line9d809e2020-04-14 13:10:48 -070034namespace hal = android::hardware::graphics::composer::hal;
35
Ady Abraham8a82ba62020-01-17 12:43:17 -080036using LayerVoteType = RefreshRateConfigs::LayerVoteType;
37using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070038
Dominik Laskowskib0054a22022-03-03 09:03:06 -080039using mock::createDisplayMode;
40
Dominik Laskowski0c252702021-12-20 20:32:09 -080041struct TestableRefreshRateConfigs : RefreshRateConfigs {
42 using RefreshRateConfigs::RefreshRateConfigs;
43
Dominik Laskowskib0054a22022-03-03 09:03:06 -080044 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080045 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080046 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080047 }
48
Dominik Laskowskib0054a22022-03-03 09:03:06 -080049 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080050 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080051 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080052 }
53
Dominik Laskowskib0054a22022-03-03 09:03:06 -080054 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080055 std::lock_guard lock(mLock);
56 return getMinRefreshRateByPolicyLocked();
57 }
58
59 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
60
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080061 using RefreshRateConfigs::GetBestRefreshRateCache;
62 auto& mutableGetBestRefreshRateCache() { return mGetBestRefreshRateCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080063
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080064 auto getBestRefreshRateAndSignals(const std::vector<LayerRequirement>& layers,
65 GlobalSignals signals) const {
66 return RefreshRateConfigs::getBestRefreshRate(layers, signals);
67 }
68
Dominik Laskowskib0054a22022-03-03 09:03:06 -080069 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
70 GlobalSignals signals = {}) const {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080071 return getBestRefreshRateAndSignals(layers, signals).first;
Dominik Laskowski0c252702021-12-20 20:32:09 -080072 }
73};
74
Alec Mouri0a1cc962019-03-14 12:33:02 -070075class RefreshRateConfigsTest : public testing::Test {
76protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070077 RefreshRateConfigsTest();
78 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070079
Dominik Laskowski0c252702021-12-20 20:32:09 -080080 static constexpr DisplayModeId kModeId60{0};
81 static constexpr DisplayModeId kModeId90{1};
82 static constexpr DisplayModeId kModeId72{2};
83 static constexpr DisplayModeId kModeId120{3};
84 static constexpr DisplayModeId kModeId30{4};
85 static constexpr DisplayModeId kModeId25{5};
86 static constexpr DisplayModeId kModeId50{6};
87 static constexpr DisplayModeId kModeId24{7};
88 static constexpr DisplayModeId kModeId24Frac{8};
89 static constexpr DisplayModeId kModeId30Frac{9};
90 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -070091
Dominik Laskowski0c252702021-12-20 20:32:09 -080092 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
93 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
94 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
95 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
96 static inline const DisplayModePtr kMode90_4K =
97 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
98 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
99 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
100 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
101 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
102 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
103 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
104 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
105 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
106 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
107 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
108 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
109 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700110
Dominik Laskowski0c252702021-12-20 20:32:09 -0800111 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800112 static inline const DisplayModes kModes_60 = makeModes(kMode60);
113 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
114 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
115 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
116 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
117 static inline const DisplayModes kModes_60_90_72_120 =
118 makeModes(kMode60, kMode90, kMode72, kMode120);
119 static inline const DisplayModes kModes_30_60_72_90_120 =
120 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100121
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800122 static inline const DisplayModes kModes_30_60 =
123 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
124 static inline const DisplayModes kModes_30_60_72_90 =
125 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
126 static inline const DisplayModes kModes_30_60_90 =
127 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
128 static inline const DisplayModes kModes_25_30_50_60 =
129 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
130 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700131
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200132 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800133 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
134 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
135 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700136};
137
138RefreshRateConfigsTest::RefreshRateConfigsTest() {
139 const ::testing::TestInfo* const test_info =
140 ::testing::UnitTest::GetInstance()->current_test_info();
141 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
142}
143
144RefreshRateConfigsTest::~RefreshRateConfigsTest() {
145 const ::testing::TestInfo* const test_info =
146 ::testing::UnitTest::GetInstance()->current_test_info();
147 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
148}
149
150namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700151
Dominik Laskowski0c252702021-12-20 20:32:09 -0800152TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
153 RefreshRateConfigs configs(kModes_60, kModeId60);
154 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700155}
156
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100157TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800158 RefreshRateConfigs configs(kModes_60, kModeId60);
159 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
160 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100161}
162
Dominik Laskowski0c252702021-12-20 20:32:09 -0800163TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
164 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700165
Dominik Laskowski0c252702021-12-20 20:32:09 -0800166 const auto minRate = configs.getMinSupportedRefreshRate();
167 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700168
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800169 EXPECT_EQ(kMode60, minRate);
170 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800171
Dominik Laskowski0c252702021-12-20 20:32:09 -0800172 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
173 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
174
175 EXPECT_EQ(minRateByPolicy, minRate);
176 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700177}
Ady Abraham2139f732019-11-13 18:56:40 -0800178
Dominik Laskowski0c252702021-12-20 20:32:09 -0800179TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
180 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800181
Dominik Laskowski0c252702021-12-20 20:32:09 -0800182 const auto minRate = configs.getMinRefreshRateByPolicy();
183 const auto performanceRate = configs.getMaxSupportedRefreshRate();
184 const auto minRate60 = configs.getMinRefreshRateByPolicy();
185 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800186
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800187 EXPECT_EQ(kMode60, minRate);
188 EXPECT_EQ(kMode60, minRate60);
189 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800190
Dominik Laskowski0c252702021-12-20 20:32:09 -0800191 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800192 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800193
Dominik Laskowski0c252702021-12-20 20:32:09 -0800194 const auto minRate90 = configs.getMinRefreshRateByPolicy();
195 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800196
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800197 EXPECT_EQ(kMode90_G1, performanceRate);
198 EXPECT_EQ(kMode90_G1, minRate90);
199 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700200}
201
Dominik Laskowski0c252702021-12-20 20:32:09 -0800202TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
203 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700204
Dominik Laskowski0c252702021-12-20 20:32:09 -0800205 const auto minRate = configs.getMinRefreshRateByPolicy();
206 const auto performanceRate = configs.getMaxSupportedRefreshRate();
207 const auto minRate60 = configs.getMinRefreshRateByPolicy();
208 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700209
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800210 EXPECT_EQ(kMode60, minRate);
211 EXPECT_EQ(kMode60, minRate60);
212 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700213
Dominik Laskowski0c252702021-12-20 20:32:09 -0800214 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800215 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700216
Dominik Laskowski0c252702021-12-20 20:32:09 -0800217 const auto minRate90 = configs.getMinRefreshRateByPolicy();
218 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700219
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800220 EXPECT_EQ(kMode90_4K, performanceRate);
221 EXPECT_EQ(kMode90_4K, minRate90);
222 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800223}
224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
226 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800227
Dominik Laskowski0c252702021-12-20 20:32:09 -0800228 const auto minRate = configs.getMinRefreshRateByPolicy();
229 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800230
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800231 EXPECT_EQ(kMode60, minRate);
232 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800233
Dominik Laskowski0c252702021-12-20 20:32:09 -0800234 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800235
Dominik Laskowski0c252702021-12-20 20:32:09 -0800236 const auto minRate60 = configs.getMinRefreshRateByPolicy();
237 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
238
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800239 EXPECT_EQ(kMode60, minRate60);
240 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800241}
242
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800243TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800244 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800245 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800246 const auto mode = configs.getActiveMode();
247 EXPECT_EQ(mode->getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800248 }
249
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800250 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800251 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800252 const auto mode = configs.getActiveMode();
253 EXPECT_EQ(mode->getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800254 }
255
Dominik Laskowski0c252702021-12-20 20:32:09 -0800256 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800257 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800258 const auto mode = configs.getActiveMode();
259 EXPECT_EQ(mode->getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800260 }
261}
262
Steven Thomasbb374322020-04-28 22:47:16 -0700263TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800264 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800265 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800266
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 // If there are no layers we select the default frame rate, which is the max of the primary
268 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800269 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800270
Dominik Laskowski0c252702021-12-20 20:32:09 -0800271 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800272 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800273 }
274 {
275 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800276 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800277 constexpr bool kAllowGroupSwitching = true;
278 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
279 NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800280 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800281 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800282}
283
Steven Thomasbb374322020-04-28 22:47:16 -0700284TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800285 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800286
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700287 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800288 auto& lr = layers[0];
289
290 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800291 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800292 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800293
294 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800295 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800296 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700298 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800300 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800301 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800302
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700303 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800304 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800305 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800306
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700307 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800308 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800309 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800310
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700311 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800312 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800313 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800314
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700315 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800316 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800317 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800318
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800319 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800320 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800321
322 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800323 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800324
325 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800326 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700328 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800330 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800331
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700332 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800333 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800334
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700335 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800336 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800337
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700338 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800339 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700341 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800342 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800343
Dominik Laskowski0c252702021-12-20 20:32:09 -0800344 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345
346 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800347 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348
349 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800350 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700352 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800353 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800354 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800355
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700356 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800357 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700359 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800360 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700362 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800363 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700365 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800366 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800367
Dominik Laskowski0c252702021-12-20 20:32:09 -0800368 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800370 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
372 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800373 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700375 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800377 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700379 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800380 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800383 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700385 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800386 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700388 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800389 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390}
391
rnlee3bd610662021-06-23 16:27:57 -0700392TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800393 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700394
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700395 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700396 auto& lr = layers[0];
397
398 lr.vote = LayerVoteType::Min;
399 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800400 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700401
402 lr.vote = LayerVoteType::Max;
403 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800404 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700407 lr.vote = LayerVoteType::Heuristic;
408 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800409 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700410
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700411 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700412 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800413 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700414
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700415 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700416 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800417 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700418
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700419 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700420 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800421 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700422
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700423 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700424 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800425 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700426}
427
Steven Thomasbb374322020-04-28 22:47:16 -0700428TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800429 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700431 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432 auto& lr = layers[0];
433
434 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800435 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
437 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800438 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700440 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800442 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700444 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800445 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700447 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800448 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700450 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800451 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700453 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800454 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455}
456
Steven Thomasbb374322020-04-28 22:47:16 -0700457TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800458 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700460 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461 auto& lr1 = layers[0];
462 auto& lr2 = layers[1];
463
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700464 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700466 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800468 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700470 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800471 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700472 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800474 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700476 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700478 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800480 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481}
482
Steven Thomasbb374322020-04-28 22:47:16 -0700483TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800484 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800485
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700486 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800487 auto& lr1 = layers[0];
488 auto& lr2 = layers[1];
489
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700490 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800491 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800492 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800494 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800495 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800496 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800497
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700498 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800499 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800500 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700501 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800502 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800503 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800504 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800505
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700506 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800507 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800508 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800510 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800511 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800512 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800513
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700514 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800515 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800516 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700517 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800518 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800519 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800520 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800521
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700522 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800523 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
524 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700525 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800526 lr2.vote = LayerVoteType::ExplicitDefault;
527 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800528 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800529
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700530 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800531 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800532 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700533 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800534 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800535 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800536 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800537
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700538 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800539 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800540 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700541 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800542 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800544 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800545
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700546 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800547 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800548 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800550 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800551 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800552 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800553
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700554 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800555 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800556 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700557 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800558 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800559 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800560 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800561}
562
rnlee3bd610662021-06-23 16:27:57 -0700563TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800564 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
565 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700566
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700567 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700568 auto& lr1 = layers[0];
569 auto& lr2 = layers[1];
570
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700571 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700572 lr1.vote = LayerVoteType::ExplicitDefault;
573 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700574 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700575 lr2.vote = LayerVoteType::Heuristic;
576 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800577 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700578
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700579 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700580 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
581 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700582 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700583 lr2.vote = LayerVoteType::Heuristic;
584 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800585 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700586
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700587 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700588 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
589 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700590 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700591 lr2.vote = LayerVoteType::ExplicitDefault;
592 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800593 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700595 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700596 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
597 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700598 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700599 lr2.vote = LayerVoteType::Heuristic;
600 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800601 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700602
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700603 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700604 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
605 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700606 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700607 lr2.vote = LayerVoteType::ExplicitDefault;
608 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800609 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700610
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700611 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700612 lr1.vote = LayerVoteType::ExplicitDefault;
613 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700614 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700615 lr2.vote = LayerVoteType::Heuristic;
616 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800617 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700618
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700619 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700620 lr1.vote = LayerVoteType::Heuristic;
621 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700622 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700623 lr2.vote = LayerVoteType::ExplicitDefault;
624 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800625 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700626
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700627 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700628 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
629 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700630 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700631 lr2.vote = LayerVoteType::ExplicitDefault;
632 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800633 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700634
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700635 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700636 lr1.vote = LayerVoteType::ExplicitDefault;
637 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700639 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
640 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800641 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700642}
643
Steven Thomasbb374322020-04-28 22:47:16 -0700644TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800645 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800646
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700647 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800648 auto& lr = layers[0];
649
650 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800651 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800652
653 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800654 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800655
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700656 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800657 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800658 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800659
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700660 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800661 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800662
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700663 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800664 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800665
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700666 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800667 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800668
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700669 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800670 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800671}
672
Steven Thomasbb374322020-04-28 22:47:16 -0700673TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800674 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800675
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700676 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800677 auto& lr = layers[0];
678
679 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800680 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800681 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800682
683 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800684 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800685 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800686
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700687 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800689 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800690 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700692 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800693 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800694 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
695 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800696
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700697 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800698 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800699 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
700 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800701
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700702 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800703 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800704 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
705 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800706
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700707 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800708 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800709 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
710 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800711
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700712 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800713 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
714 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800715 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
716 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800717}
718
Steven Thomasbb374322020-04-28 22:47:16 -0700719TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800720 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800721
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700722 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800723 auto& lr1 = layers[0];
724 auto& lr2 = layers[1];
725
726 lr1.vote = LayerVoteType::Min;
727 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800728 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729
730 lr1.vote = LayerVoteType::Min;
731 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700732 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800733 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
735 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800736 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700737 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800738 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800739
740 lr1.vote = LayerVoteType::Max;
741 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700742 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800743 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
745 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800746 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700747 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800748 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800749
750 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700751 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700753 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800754 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
756 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700757 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800758 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700759 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800760 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800761}
762
Steven Thomasbb374322020-04-28 22:47:16 -0700763TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800764 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800765
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700766 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800767 auto& lr = layers[0];
768
Ady Abraham71c437d2020-01-31 15:56:57 -0800769 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800770 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700771 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800772 const auto mode = configs.getBestRefreshRate(layers);
773 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
774 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775 }
776}
777
rnlee3bd610662021-06-23 16:27:57 -0700778TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800779 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
780 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700781
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700782 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700783 auto& lr = layers[0];
784
785 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
786 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700787 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800788 const auto mode = configs.getBestRefreshRate(layers);
789 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
790 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700791 }
792}
793
Dominik Laskowski0c252702021-12-20 20:32:09 -0800794TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800795 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700797 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798 auto& lr1 = layers[0];
799 auto& lr2 = layers[1];
800
801 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700802 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800803 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700804 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800805 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800806
807 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700808 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800809 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700810 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800811 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812
813 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700814 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800815 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700816 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800817 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800818}
819
Steven Thomasbb374322020-04-28 22:47:16 -0700820TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800821 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800822
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700823 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800824 auto& lr = layers[0];
825
Ady Abraham71c437d2020-01-31 15:56:57 -0800826 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800827 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700828 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800829 const auto mode = configs.getBestRefreshRate(layers, {});
830 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
831 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800832 }
833}
834
Steven Thomasbb374322020-04-28 22:47:16 -0700835TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800836 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800837
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700838 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800839 auto& lr1 = layers[0];
840 auto& lr2 = layers[1];
841
842 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700843 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800844 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800845 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700846 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800847 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800848 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800849
850 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800852 lr1.name = "60Hz ExplicitExactOrMultiple";
853 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700854 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800855 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800856 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800857
858 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700859 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800860 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800861 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800862 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800863 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800864
865 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700866 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800867 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800868 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700869 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800870 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800871 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800872
873 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700874 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800875 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800876 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800877 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800878 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800879}
880
881TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800882 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800883
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700884 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885 auto& lr1 = layers[0];
886 auto& lr2 = layers[1];
887
888 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr1.name = "60Hz ExplicitExactOrMultiple";
891 lr2.vote = LayerVoteType::NoVote;
892 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800893 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800894
895 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700896 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800897 lr1.name = "60Hz ExplicitExactOrMultiple";
898 lr2.vote = LayerVoteType::NoVote;
899 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800900 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800901
902 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700903 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800904 lr1.name = "60Hz ExplicitExactOrMultiple";
905 lr2.vote = LayerVoteType::Max;
906 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800907 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800908
909 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700910 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800911 lr1.name = "60Hz ExplicitExactOrMultiple";
912 lr2.vote = LayerVoteType::Max;
913 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800914 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800915
916 // The other layer starts to provide buffers
917 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700918 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800919 lr1.name = "60Hz ExplicitExactOrMultiple";
920 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700921 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800922 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800923 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800924}
925
926TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800927 RefreshRateConfigs configs(kModes_60_90, kModeId60);
928
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800929 auto [_, signals] = configs.getBestRefreshRate({}, {});
930 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800931
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800932 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
933 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800934
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700935 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800936 auto& lr1 = layers[0];
937 auto& lr2 = layers[1];
938
939 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700940 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800941 lr1.name = "60Hz ExplicitExactOrMultiple";
942 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700943 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700944 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800945 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
946 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800947
948 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700949 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800950 lr1.name = "60Hz ExplicitExactOrMultiple";
951 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700952 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700953 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800954 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
955 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800956
957 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700958 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800959 lr1.name = "60Hz ExplicitExactOrMultiple";
960 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700961 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700962 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800963 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
964 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800965
966 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700967 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700968 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -0800969 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700970 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700971 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800972 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
973 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -0800974}
975
Steven Thomasbb374322020-04-28 22:47:16 -0700976TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800977 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800978
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700979 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800980 auto& lr = layers[0];
981
982 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700983 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
984 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800985
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700986 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800987
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700988 {80_Hz, 72_Hz}, {73_Hz, 72_Hz}, {72_Hz, 72_Hz}, {71_Hz, 72_Hz}, {70_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800989
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700990 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800991
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700992 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800993
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700994 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800995
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700996 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800997
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700998 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800999 };
1000
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001001 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001002 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001003 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001004
1005 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001006 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001007 lr.name = ss.str();
1008
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001009 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001010 }
1011}
1012
1013TEST_F(RefreshRateConfigsTest,
1014 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001015 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001016 auto& lr = layers[0];
1017
1018 // Test that 23.976 will choose 24 if 23.976 is not supported
1019 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001020 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1021 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001022 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001023
1024 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001025 lr.desiredRefreshRate = 23.976_Hz;
1026 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001027 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001028 }
1029
1030 // Test that 24 will choose 23.976 if 24 is not supported
1031 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001032 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1033 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001034 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001035
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001036 lr.desiredRefreshRate = 24_Hz;
1037 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001038 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001039 }
1040
1041 // Test that 29.97 will prefer 59.94 over 60 and 30
1042 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001043 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1044 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001045 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001046
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001047 lr.desiredRefreshRate = 29.97_Hz;
1048 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001049 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001050 }
1051}
1052
1053TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001054 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001055 auto& lr = layers[0];
1056
1057 // Test that voting for supported refresh rate will select this refresh rate
1058 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001059 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001060
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001061 for (auto desired : {23.976_Hz, 24_Hz, 25_Hz, 29.97_Hz, 30_Hz, 50_Hz, 59.94_Hz, 60_Hz}) {
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001062 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001063 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001064 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001065 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001066 lr.name = ss.str();
1067
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001068 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001069 }
1070 }
1071
1072 // Test that 23.976 will choose 24 if 23.976 is not supported
1073 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001074 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1075 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001076 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001077
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001078 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001079 lr.desiredRefreshRate = 23.976_Hz;
1080 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001081 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001082 }
1083
1084 // Test that 24 will choose 23.976 if 24 is not supported
1085 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001086 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1087 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001088 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 lr.desiredRefreshRate = 24_Hz;
1091 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001092 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001093 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001094}
1095
Alec Mouri11232a22020-05-14 18:06:25 -07001096TEST_F(RefreshRateConfigsTest,
1097 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001098 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001099
Dominik Laskowski0c252702021-12-20 20:32:09 -08001100 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001101
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001102 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001103 auto& lr = layers[0];
1104
Alec Mouri11232a22020-05-14 18:06:25 -07001105 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001106 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001107 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001108 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001109
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001110 const auto [mode, signals] = configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001111
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001112 EXPECT_EQ(mode, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001113 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001114}
1115
1116TEST_F(RefreshRateConfigsTest,
1117 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001118 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001119
Dominik Laskowski0c252702021-12-20 20:32:09 -08001120 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001121
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001122 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001123 auto& lr = layers[0];
1124
Alec Mouri11232a22020-05-14 18:06:25 -07001125 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001126 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001127 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001128 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001129 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001130}
1131
1132TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001133 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001134 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001135
Dominik Laskowski0c252702021-12-20 20:32:09 -08001136 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001137
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001138 const auto [mode, signals] = configs.getBestRefreshRateAndSignals({}, {});
1139 EXPECT_EQ(mode, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001140 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001141
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001142 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001143 auto& lr = layers[0];
1144
1145 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001146 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001147 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001148 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001149 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001150
1151 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001152 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001153
1154 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001155 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001156 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001157 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001158 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001159
1160 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001161 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001162
1163 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001164 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001165 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001166 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001167 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001168
1169 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001170 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001171
1172 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001173 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001174 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001175 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001176 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001177
1178 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001179 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001180
1181 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001182 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001183 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001184 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001185 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001186
1187 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001188 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001189}
1190
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001191TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001192 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001193
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001194 // The default policy doesn't allow group switching. Verify that no
1195 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001196 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001197 auto& layer = layers[0];
1198 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001199 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001200 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001201 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001202 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001203
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001204 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001205}
Steven Thomasd4071902020-03-24 16:02:53 -07001206
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001207TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001208 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1209
Steven Thomasd4071902020-03-24 16:02:53 -07001210 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001211 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001212 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001213 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001214
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001215 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001216 auto& layer = layers[0];
1217 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001218 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001219 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1220 layer.name = "90Hz ExplicitDefault";
1221 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001222 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001223}
1224
1225TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001226 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001227
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001228 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001229 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001230 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001231 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001232
1233 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001234 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001235 auto& layer = layers[0];
1236 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001237 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001238 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001239 layer.name = "90Hz ExplicitDefault";
1240 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001241 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001242}
1243
1244TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001245 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001246
Dominik Laskowski0c252702021-12-20 20:32:09 -08001247 RefreshRateConfigs::Policy policy;
1248 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1249 policy.allowGroupSwitching = true;
1250 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1251
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001252 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001253
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001254 // Verify that we won't do a seamless switch if we request the same mode as the default
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001255 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001256 auto& layer = layers[0];
1257 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001258 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001259 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001260 layer.name = "60Hz ExplicitDefault";
1261 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001262 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001263}
1264
1265TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001266 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001267
Dominik Laskowski0c252702021-12-20 20:32:09 -08001268 RefreshRateConfigs::Policy policy;
1269 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1270 policy.allowGroupSwitching = true;
1271 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1272
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001273 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001274
1275 // Verify that if the current config is in another group and there are no layers with
1276 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001277
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001278 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001279 auto& layer = layers[0];
1280 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001281 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001282 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001283 layer.name = "60Hz ExplicitDefault";
1284 layer.focused = true;
1285
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001286 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001287}
1288
1289TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001290 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001291
Dominik Laskowski0c252702021-12-20 20:32:09 -08001292 RefreshRateConfigs::Policy policy;
1293 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1294 policy.allowGroupSwitching = true;
1295 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1296
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001297 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001298
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001299 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001300 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001302 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001303 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001304 layers[0].seamlessness = Seamlessness::OnlySeamless;
1305 layers[0].name = "60Hz ExplicitDefault";
1306 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001307
1308 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001309 layers[1].vote = LayerVoteType::ExplicitDefault;
1310 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001311 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001312 layers[1].name = "90Hz ExplicitDefault";
1313 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001314
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001315 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001316}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001317
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001318TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001319 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001320
Dominik Laskowski0c252702021-12-20 20:32:09 -08001321 RefreshRateConfigs::Policy policy;
1322 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1323 policy.allowGroupSwitching = true;
1324 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1325
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001326 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001327
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001328 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1329 // seamlessness=Default can't change the mode group back to the group of the default
1330 // mode.
1331 // For example, this may happen when a video playback requests and gets a seamed switch,
1332 // but another layer (with default seamlessness) starts animating. The animating layer
1333 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001334 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001335 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001336 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001337 layers[0].focused = true;
1338 layers[0].vote = LayerVoteType::ExplicitDefault;
1339 layers[0].name = "60Hz ExplicitDefault";
1340
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001341 layers.push_back(LayerRequirement{.weight = 0.1f});
1342 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001343 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001344 layers[1].focused = true;
1345 layers[1].vote = LayerVoteType::ExplicitDefault;
1346 layers[1].name = "90Hz ExplicitDefault";
1347
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001348 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001349}
1350
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001351TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001352 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001353
Dominik Laskowski0c252702021-12-20 20:32:09 -08001354 RefreshRateConfigs::Policy policy;
1355 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1356 policy.allowGroupSwitching = true;
1357 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1358
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001359 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001360
1361 // Layer with seamlessness=Default can change the mode group if there's a not
1362 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1363 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001364 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001365 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001366 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001367 layers[0].focused = true;
1368 layers[0].vote = LayerVoteType::ExplicitDefault;
1369 layers[0].name = "60Hz ExplicitDefault";
1370
1371 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001372 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001373 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001374 layers[1].focused = false;
1375 layers[1].vote = LayerVoteType::ExplicitDefault;
1376 layers[1].name = "90Hz ExplicitDefault";
1377
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001378 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001379}
1380
1381TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001382 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001383
1384 // Allow group switching.
1385 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001386 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001387 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001388 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001389
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001390 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001391 auto& layer = layers[0];
1392 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001393 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001394 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001395 layer.name = "60Hz ExplicitExactOrMultiple";
1396 layer.focused = true;
1397
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001398 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001399
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001400 configs.setActiveModeId(kModeId120);
1401 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001402}
1403
1404TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001405 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001406
1407 // Allow group switching.
1408 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001409 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001410 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001411 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001412
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001413 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1414 .vote = LayerVoteType::ExplicitDefault,
1415 .desiredRefreshRate = 60_Hz,
1416 .seamlessness = Seamlessness::SeamedAndSeamless,
1417 .weight = 0.5f,
1418 .focused = false},
1419 {.name = "25Hz ExplicitExactOrMultiple",
1420 .vote = LayerVoteType::ExplicitExactOrMultiple,
1421 .desiredRefreshRate = 25_Hz,
1422 .seamlessness = Seamlessness::OnlySeamless,
1423 .weight = 1.f,
1424 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001425
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001426 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001427
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001428 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001429 seamedLayer.desiredRefreshRate = 30_Hz;
1430 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001431 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001432
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001433 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001434}
1435
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001436TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001437 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001438
1439 // Allow group switching.
1440 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001441 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001442 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001443 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001444
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001445 std::vector<LayerRequirement> layers = {
1446 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001447
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001448 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001449}
1450
Steven Thomasf734df42020-04-13 21:09:28 -07001451TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001452 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001454 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001455 layers[0].name = "Test layer";
1456
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001457 struct Args {
1458 bool touch = false;
1459 bool focused = true;
1460 };
1461
Steven Thomasbb374322020-04-28 22:47:16 -07001462 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001463 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001464 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001465 layers[0].vote = voteType;
1466 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001467 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001468 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001469 };
1470
Dominik Laskowski0c252702021-12-20 20:32:09 -08001471 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1472
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001473 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001474 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1475 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1476 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1477 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1478 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1479 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001481 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001482 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1483 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001484 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001485
Steven Thomasf734df42020-04-13 21:09:28 -07001486 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001487 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1488
Steven Thomasf734df42020-04-13 21:09:28 -07001489 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1490 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001491 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1492 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001493 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001494
Dominik Laskowski0c252702021-12-20 20:32:09 -08001495 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1496
1497 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1498 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1499 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1500 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1501 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1502 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001503}
1504
Steven Thomasbb374322020-04-28 22:47:16 -07001505TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001506 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001507
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001508 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001509 layers[0].name = "Test layer";
1510
Marin Shalamanov23c44202020-12-22 19:09:20 +01001511 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001512 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001513 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001514
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001515 const auto [refreshRate, signals] =
1516 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1517
1518 // Refresh rate will be chosen by either touch state or idle state.
1519 EXPECT_EQ(!touchActive, signals.idle);
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001520 return refreshRate->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001521 };
1522
Dominik Laskowski0c252702021-12-20 20:32:09 -08001523 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001524
1525 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001526 {
1527 constexpr bool kTouchActive = true;
1528 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1529 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1530 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1531 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1532 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1533 EXPECT_EQ(kModeId90,
1534 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1535 }
Steven Thomasbb374322020-04-28 22:47:16 -07001536
1537 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001538 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001539
1540 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001541 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001542
1543 {
1544 constexpr bool kTouchActive = false;
1545 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1546 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1547 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1548 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1549 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1550 EXPECT_EQ(kModeId60,
1551 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1552 }
Steven Thomasbb374322020-04-28 22:47:16 -07001553
1554 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001555 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001556}
1557
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001558TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001559 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001560
1561 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001562 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1563 const Fps expectedFrameRate = [fps] {
1564 if (fps < 26.91f) return 24_Hz;
1565 if (fps < 37.51f) return 30_Hz;
1566 if (fps < 52.51f) return 45_Hz;
1567 if (fps < 66.01f) return 60_Hz;
1568 if (fps < 81.01f) return 72_Hz;
1569 return 90_Hz;
1570 }();
1571
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001572 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001573 }
1574}
1575
1576TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001577 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001578
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001579 struct Expectation {
1580 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001581 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001582 };
1583
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001584 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001585 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1586 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001587 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001588
1589 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001590 const auto& knownFrameRates = configs.knownFrameRates();
1591 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001592 knownFrameRatesExpectations.begin(),
1593 [](Fps fps, const Expectation& expected) {
1594 return isApproxEqual(fps, expected.fps);
1595 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001596 EXPECT_TRUE(equal);
1597
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001598 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001599 auto& layer = layers[0];
1600 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001601
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001602 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001603 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001604 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001605 }
1606}
1607
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001608TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001609 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001610
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001611 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001612 auto& explicitExactLayer = layers[0];
1613 auto& explicitExactOrMultipleLayer = layers[1];
1614
1615 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1616 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001617 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001618
1619 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1620 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001621 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001622
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001623 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
1624 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001625
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001626 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1627 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001628 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001629
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001630 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001631 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001632
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001633 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001634 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001635
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001636 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001637 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001638}
1639
1640TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001641 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1642 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001643
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001644 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001645 auto& explicitExactLayer = layers[0];
1646 auto& explicitExactOrMultipleLayer = layers[1];
1647
1648 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1649 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001650 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001651
1652 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1653 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001654 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001655
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001656 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1657 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001658
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001659 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1660 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001661 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001662
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001663 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001664 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001665
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001666 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001667 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001668
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001669 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001670 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001671}
1672
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001673TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001674 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001675
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001676 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1677 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1678 GlobalSignals{.touch = true, .idle = true});
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001679 const auto result = std::make_pair(kMode90, GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001680
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001681 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001682
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001683 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001684}
1685
1686TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001687 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1688
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001689 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001690
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001691 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001692 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001693
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001694 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001695
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001696 const auto& cache = configs.mutableGetBestRefreshRateCache();
1697 ASSERT_TRUE(cache);
1698
1699 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1700 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001701}
1702
Ady Abraham5e4e9832021-06-14 13:40:56 -07001703TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001704 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001705
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001706 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001707 auto& explicitExactLayer = layers[0];
1708 auto& explicitExactOrMultipleLayer = layers[1];
1709
1710 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1711 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001712 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001713
1714 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1715 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001716 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001717
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001718 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1719 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001720
1721 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1722
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001723 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1724 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001725}
1726
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001727TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001728 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1729 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001730
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001731 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001732 auto& explicitDefaultLayer = layers[0];
1733 auto& explicitExactOrMultipleLayer = layers[1];
1734
1735 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1736 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001737 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001738
1739 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1740 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001741 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001742
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001743 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001744}
1745
Ady Abraham05243be2021-09-16 15:58:52 -07001746// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001747TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001748 constexpr int kMinRefreshRate = 10;
1749 constexpr int kMaxRefreshRate = 240;
1750
1751 DisplayModes displayModes;
1752 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001753 const DisplayModeId modeId(fps);
1754 displayModes.try_emplace(modeId,
1755 createDisplayMode(modeId,
1756 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001757 }
1758
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001759 const TestableRefreshRateConfigs configs(std::move(displayModes),
1760 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07001761
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001762 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001763 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1764 layers[0].desiredRefreshRate = fps;
1765 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001766 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001767 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001768 };
1769
1770 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001771 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001772 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1773 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1774 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1775 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1776 }
1777}
1778
Ady Abraham1c595502022-01-13 21:58:32 -08001779// b/190578904
1780TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001781 constexpr DisplayModeId kActiveModeId{0};
1782 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
1783 createDisplayMode(DisplayModeId(1), 53_Hz),
1784 createDisplayMode(DisplayModeId(2), 55_Hz),
1785 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08001786
1787 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001788 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08001789
Dominik Laskowski0c252702021-12-20 20:32:09 -08001790 const std::vector<LayerRequirement> layers = {
1791 {
Ady Abraham1c595502022-01-13 21:58:32 -08001792 .vote = LayerVoteType::ExplicitDefault,
1793 .desiredRefreshRate = 43_Hz,
1794 .seamlessness = Seamlessness::SeamedAndSeamless,
1795 .weight = 0.41f,
1796 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001797 {
Ady Abraham1c595502022-01-13 21:58:32 -08001798 .vote = LayerVoteType::ExplicitExactOrMultiple,
1799 .desiredRefreshRate = 53_Hz,
1800 .seamlessness = Seamlessness::SeamedAndSeamless,
1801 .weight = 0.41f,
1802 },
1803 };
1804
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001805 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001806}
1807
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001808TEST_F(RefreshRateConfigsTest, modeComparison) {
1809 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
1810 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
1811 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07001812}
1813
1814TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001815 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001816
Dominik Laskowski0c252702021-12-20 20:32:09 -08001817 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1818
Ana Krulecb9afd792020-06-11 13:16:15 -07001819 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001820 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001821
1822 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001823 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1824 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001825
Ady Abrahama91605e2021-06-18 11:41:47 -07001826 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001827 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1828 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001829
1830 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001831 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1832 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001833}
1834
TreeHugger Robot758ab612021-06-22 19:17:29 +00001835TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001836 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001837
Dominik Laskowski0c252702021-12-20 20:32:09 -08001838 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1839
TreeHugger Robot758ab612021-06-22 19:17:29 +00001840 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001841 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1842 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001843
1844 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001845 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1846 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001847
1848 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001849 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1850 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001851
1852 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001853 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1854 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001855}
1856
Ady Abrahamcc315492022-02-17 17:06:39 -08001857TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001858 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001859
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001860 const auto frameRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001861 Fps displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001862 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001863
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001864 configs.setActiveModeId(kModeId60);
1865 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001866 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001867
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001868 configs.setActiveModeId(kModeId72);
1869 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001870 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001871
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001872 configs.setActiveModeId(kModeId90);
1873 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001874 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001875
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001876 configs.setActiveModeId(kModeId120);
1877 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001878 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001879
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001880 configs.setActiveModeId(kModeId90);
1881 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001882 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001883
Ady Abrahamcc315492022-02-17 17:06:39 -08001884 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
1885 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
1886 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
1887 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001888}
1889
1890TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001891 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1892 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001893
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001894 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1895 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001896
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001897 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1898 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001899
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001900 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1901 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001902
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001903 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1904 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001905
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001906 const auto refreshRates = {23.976_Hz, 24_Hz, 25_Hz, 29.97_Hz, 30_Hz, 50_Hz, 59.94_Hz, 60_Hz};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001907 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001908 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001909 }
1910
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001911 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1912 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1913 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001914}
1915
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001916TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001917 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001918
Dominik Laskowski0c252702021-12-20 20:32:09 -08001919 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001920}
1921
1922TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001923 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1924 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001925
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001926 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001927 layers[0].name = "Test layer";
1928 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001929 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001930 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001931
1932 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1933 EXPECT_EQ(1u, frameRateOverrides.size());
1934 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1935 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001936
1937 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001938 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1939 EXPECT_EQ(1u, frameRateOverrides.size());
1940 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1941 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001942
1943 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001944 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1945 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001946
1947 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001948 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1949 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001950
1951 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001952 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1953 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001954
1955 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001956 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1957 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001958}
1959
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001960TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001961 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1962 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001963
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001964 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
1965 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001966
1967 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001968 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001969 layers[0].vote = LayerVoteType::ExplicitDefault;
1970
1971 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001972 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001973 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001974 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08001975
Dominik Laskowski0c252702021-12-20 20:32:09 -08001976 EXPECT_EQ(2u, frameRateOverrides.size());
1977 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1978 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
1979 ASSERT_EQ(1u, frameRateOverrides.count(5678));
1980 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08001981
1982 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001983 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1984 EXPECT_EQ(1u, frameRateOverrides.size());
1985 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1986 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001987
1988 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001989 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1990 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001991}
1992
1993TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001994 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1995 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001996
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001997 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001998 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001999 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002000 layers[0].vote = LayerVoteType::ExplicitDefault;
2001
Dominik Laskowski0c252702021-12-20 20:32:09 -08002002 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2003 EXPECT_EQ(1u, frameRateOverrides.size());
2004 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2005 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002006
Dominik Laskowski0c252702021-12-20 20:32:09 -08002007 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2008 EXPECT_EQ(1u, frameRateOverrides.size());
2009 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2010 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002011
2012 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002013 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2014 EXPECT_EQ(1u, frameRateOverrides.size());
2015 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2016 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002017
Dominik Laskowski0c252702021-12-20 20:32:09 -08002018 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2019 EXPECT_EQ(1u, frameRateOverrides.size());
2020 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2021 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002022
2023 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002024 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2025 EXPECT_EQ(1u, frameRateOverrides.size());
2026 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2027 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002028
Dominik Laskowski0c252702021-12-20 20:32:09 -08002029 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2030 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002031}
2032
Alec Mouri0a1cc962019-03-14 12:33:02 -07002033} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002034} // namespace android::scheduler