blob: 2c862d385ec831ab028de5bc9dfa49c552d9d238 [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"
Alec Mouri0a1cc962019-03-14 12:33:02 -070028
29using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070030
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070031namespace android::scheduler {
Dominik Laskowski0c252702021-12-20 20:32:09 -080032namespace {
33
34DisplayModePtr createDisplayMode(DisplayModeId modeId, Fps refreshRate, int32_t group = 0,
35 ui::Size resolution = ui::Size()) {
36 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
37 .setId(modeId)
38 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
39 .setVsyncPeriod(static_cast<int32_t>(refreshRate.getPeriodNsecs()))
40 .setGroup(group)
41 .setHeight(resolution.height)
42 .setWidth(resolution.width)
43 .build();
44}
45
46} // namespace
Alec Mouri0a1cc962019-03-14 12:33:02 -070047
Peiyong Line9d809e2020-04-14 13:10:48 -070048namespace hal = android::hardware::graphics::composer::hal;
49
Alec Mouri0a1cc962019-03-14 12:33:02 -070050using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080051using LayerVoteType = RefreshRateConfigs::LayerVoteType;
52using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070053
Dominik Laskowski0c252702021-12-20 20:32:09 -080054struct TestableRefreshRateConfigs : RefreshRateConfigs {
55 using RefreshRateConfigs::RefreshRateConfigs;
56
57 RefreshRate getMinSupportedRefreshRate() const {
58 std::lock_guard lock(mLock);
59 return *mMinSupportedRefreshRate;
60 }
61
62 RefreshRate getMaxSupportedRefreshRate() const {
63 std::lock_guard lock(mLock);
64 return *mMaxSupportedRefreshRate;
65 }
66
67 RefreshRate getMinRefreshRateByPolicy() const {
68 std::lock_guard lock(mLock);
69 return getMinRefreshRateByPolicyLocked();
70 }
71
72 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
73
74 using RefreshRateConfigs::GetBestRefreshRateInvocation;
75
76 std::optional<GetBestRefreshRateInvocation>& mutableLastBestRefreshRateInvocation() {
77 std::lock_guard lock(mLock);
78 return lastBestRefreshRateInvocation;
79 }
80};
81
Alec Mouri0a1cc962019-03-14 12:33:02 -070082class RefreshRateConfigsTest : public testing::Test {
83protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070084 RefreshRateConfigsTest();
85 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070086
Dominik Laskowski0c252702021-12-20 20:32:09 -080087 static RefreshRate asRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070088 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020089 }
90
Dominik Laskowski0c252702021-12-20 20:32:09 -080091 static constexpr DisplayModeId kModeId60{0};
92 static constexpr DisplayModeId kModeId90{1};
93 static constexpr DisplayModeId kModeId72{2};
94 static constexpr DisplayModeId kModeId120{3};
95 static constexpr DisplayModeId kModeId30{4};
96 static constexpr DisplayModeId kModeId25{5};
97 static constexpr DisplayModeId kModeId50{6};
98 static constexpr DisplayModeId kModeId24{7};
99 static constexpr DisplayModeId kModeId24Frac{8};
100 static constexpr DisplayModeId kModeId30Frac{9};
101 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700102
Dominik Laskowski0c252702021-12-20 20:32:09 -0800103 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
104 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
105 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
106 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
107 static inline const DisplayModePtr kMode90_4K =
108 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
109 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
110 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
111 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
112 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
113 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
114 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
115 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
116 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
117 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
118 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
119 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
120 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700121
Dominik Laskowski0c252702021-12-20 20:32:09 -0800122 // Test configurations.
123 static inline const DisplayModes kModes_60 = {kMode60};
124 static inline const DisplayModes kModes_60_90 = {kMode60, kMode90};
125 static inline const DisplayModes kModes_60_90_G1 = {kMode60, kMode90_G1};
126 static inline const DisplayModes kModes_60_90_4K = {kMode60, kMode90_4K};
127 static inline const DisplayModes kModes_60_72_90 = {kMode60, kMode90, kMode72};
128 static inline const DisplayModes kModes_60_90_72_120 = {kMode60, kMode90, kMode72, kMode120};
129 static inline const DisplayModes kModes_30_60_72_90_120 = {kMode60, kMode90, kMode72, kMode120,
130 kMode30};
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100131
Dominik Laskowski0c252702021-12-20 20:32:09 -0800132 static inline const DisplayModes kModes_30_60 = {kMode60, kMode90_G1, kMode72_G1, kMode120_G1,
133 kMode30};
134 static inline const DisplayModes kModes_30_60_72_90 = {kMode60, kMode90, kMode72, kMode120_G1,
135 kMode30};
136 static inline const DisplayModes kModes_30_60_90 = {kMode60, kMode90, kMode72_G1, kMode120_G1,
137 kMode30};
138 static inline const DisplayModes kModes_25_30_50_60 = {kMode60, kMode90, kMode72_G1,
139 kMode120_G1, kMode30_G1, kMode25_G1,
140 kMode50};
141 static inline const DisplayModes kModes_60_120 = {kMode60, kMode120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700142
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200143 // This is a typical TV configuration.
Dominik Laskowski0c252702021-12-20 20:32:09 -0800144 static inline const DisplayModes kModes_24_25_30_50_60_Frac = {kMode24, kMode24Frac, kMode25,
145 kMode30, kMode30Frac, kMode50,
146 kMode60, kMode60Frac};
Alec Mouri0a1cc962019-03-14 12:33:02 -0700147};
148
149RefreshRateConfigsTest::RefreshRateConfigsTest() {
150 const ::testing::TestInfo* const test_info =
151 ::testing::UnitTest::GetInstance()->current_test_info();
152 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
153}
154
155RefreshRateConfigsTest::~RefreshRateConfigsTest() {
156 const ::testing::TestInfo* const test_info =
157 ::testing::UnitTest::GetInstance()->current_test_info();
158 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
159}
160
161namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700162
Dominik Laskowski0c252702021-12-20 20:32:09 -0800163TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
164 RefreshRateConfigs configs(kModes_60, kModeId60);
165 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700166}
167
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100168TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800169 RefreshRateConfigs configs(kModes_60, kModeId60);
170 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
171 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100172}
173
Dominik Laskowski0c252702021-12-20 20:32:09 -0800174TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
175 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700176
Dominik Laskowski0c252702021-12-20 20:32:09 -0800177 const auto minRate = configs.getMinSupportedRefreshRate();
178 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700179
Dominik Laskowski0c252702021-12-20 20:32:09 -0800180 EXPECT_EQ(asRefreshRate(kMode60), minRate);
181 EXPECT_EQ(asRefreshRate(kMode90), performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800182
Dominik Laskowski0c252702021-12-20 20:32:09 -0800183 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
184 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
185
186 EXPECT_EQ(minRateByPolicy, minRate);
187 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188}
Ady Abraham2139f732019-11-13 18:56:40 -0800189
Dominik Laskowski0c252702021-12-20 20:32:09 -0800190TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
191 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800192
Dominik Laskowski0c252702021-12-20 20:32:09 -0800193 const auto minRate = configs.getMinRefreshRateByPolicy();
194 const auto performanceRate = configs.getMaxSupportedRefreshRate();
195 const auto minRate60 = configs.getMinRefreshRateByPolicy();
196 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800197
Dominik Laskowski0c252702021-12-20 20:32:09 -0800198 EXPECT_EQ(asRefreshRate(kMode60), minRate);
199 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
200 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800201
Dominik Laskowski0c252702021-12-20 20:32:09 -0800202 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
203 configs.setCurrentModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800204
Dominik Laskowski0c252702021-12-20 20:32:09 -0800205 const auto minRate90 = configs.getMinRefreshRateByPolicy();
206 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800207
Dominik Laskowski0c252702021-12-20 20:32:09 -0800208 EXPECT_EQ(asRefreshRate(kMode90_G1), performanceRate);
209 EXPECT_EQ(asRefreshRate(kMode90_G1), minRate90);
210 EXPECT_EQ(asRefreshRate(kMode90_G1), performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700211}
212
Dominik Laskowski0c252702021-12-20 20:32:09 -0800213TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
214 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700215
Dominik Laskowski0c252702021-12-20 20:32:09 -0800216 const auto minRate = configs.getMinRefreshRateByPolicy();
217 const auto performanceRate = configs.getMaxSupportedRefreshRate();
218 const auto minRate60 = configs.getMinRefreshRateByPolicy();
219 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700220
Dominik Laskowski0c252702021-12-20 20:32:09 -0800221 EXPECT_EQ(asRefreshRate(kMode60), minRate);
222 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
223 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
226 configs.setCurrentModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700227
Dominik Laskowski0c252702021-12-20 20:32:09 -0800228 const auto minRate90 = configs.getMinRefreshRateByPolicy();
229 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700230
Dominik Laskowski0c252702021-12-20 20:32:09 -0800231 EXPECT_EQ(asRefreshRate(kMode90_4K), performanceRate);
232 EXPECT_EQ(asRefreshRate(kMode90_4K), minRate90);
233 EXPECT_EQ(asRefreshRate(kMode90_4K), performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800234}
235
Dominik Laskowski0c252702021-12-20 20:32:09 -0800236TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
237 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800238
Dominik Laskowski0c252702021-12-20 20:32:09 -0800239 const auto minRate = configs.getMinRefreshRateByPolicy();
240 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800241
Dominik Laskowski0c252702021-12-20 20:32:09 -0800242 EXPECT_EQ(asRefreshRate(kMode60), minRate);
243 EXPECT_EQ(asRefreshRate(kMode90), performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800244
Dominik Laskowski0c252702021-12-20 20:32:09 -0800245 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Dominik Laskowski0c252702021-12-20 20:32:09 -0800247 const auto minRate60 = configs.getMinRefreshRateByPolicy();
248 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
249
250 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
251 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800252}
253
Dominik Laskowski0c252702021-12-20 20:32:09 -0800254TEST_F(RefreshRateConfigsTest, twoModes_getCurrentRefreshRate) {
255 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800256 {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800257 const auto current = configs.getCurrentRefreshRate();
258 EXPECT_EQ(current.getModeId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800259 }
260
Dominik Laskowski0c252702021-12-20 20:32:09 -0800261 configs.setCurrentModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800262 {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800263 const auto current = configs.getCurrentRefreshRate();
264 EXPECT_EQ(current.getModeId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800265 }
266
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800268 {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800269 const auto current = configs.getCurrentRefreshRate();
270 EXPECT_EQ(current.getModeId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800271 }
272}
273
Steven Thomasbb374322020-04-28 22:47:16 -0700274TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800275 {
276 RefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800277
Dominik Laskowski0c252702021-12-20 20:32:09 -0800278 // If there are no layers we select the default frame rate, which is the max of the primary
279 // range.
280 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate({}, {}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800281
Dominik Laskowski0c252702021-12-20 20:32:09 -0800282 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
283 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate({}, {}));
284 }
285 {
286 // We select max even when this will cause a non-seamless switch.
287 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
288 constexpr bool kAllowGroupSwitching = true;
289 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
290 NO_ERROR);
291 EXPECT_EQ(asRefreshRate(kMode90_G1), configs.getBestRefreshRate({}, {}));
292 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800293}
294
Steven Thomasbb374322020-04-28 22:47:16 -0700295TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800296 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700298 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 auto& lr = layers[0];
300
301 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800302 lr.name = "Min";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800303 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800304
305 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800306 lr.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800307 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800308
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700309 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800310 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800311 lr.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800312 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800313
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700314 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800315 lr.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800316 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800317
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700318 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800319 lr.name = "45Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800320 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800321
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700322 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800323 lr.name = "30Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800324 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800325
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700326 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800327 lr.name = "24Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800328 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800330 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800331 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800332
333 lr.vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800334 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800335
336 lr.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800337 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700339 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800341 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800342
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700343 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800344 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700346 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800347 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700349 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800350 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700352 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800353 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Dominik Laskowski0c252702021-12-20 20:32:09 -0800355 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800356
357 lr.vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800358 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359
360 lr.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800361 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700363 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800365 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700367 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800368 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700370 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800371 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800372
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700373 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800374 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800375
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700376 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800377 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski0c252702021-12-20 20:32:09 -0800379 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800380 lr.vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800381 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800382
383 lr.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800384 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700386 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800388 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700390 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800391 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700393 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800394 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700396 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800397 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700399 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800400 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401}
402
rnlee3bd610662021-06-23 16:27:57 -0700403TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800404 RefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700407 auto& lr = layers[0];
408
409 lr.vote = LayerVoteType::Min;
410 lr.name = "Min";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800411 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700412
413 lr.vote = LayerVoteType::Max;
414 lr.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800415 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700416
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700417 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700418 lr.vote = LayerVoteType::Heuristic;
419 lr.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800420 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700421
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700422 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700423 lr.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800424 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700425
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700426 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700427 lr.name = "45Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800428 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700429
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700430 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700431 lr.name = "30Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800432 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700433
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700434 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700435 lr.name = "24Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800436 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700437}
438
Steven Thomasbb374322020-04-28 22:47:16 -0700439TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800440 RefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700442 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443 auto& lr = layers[0];
444
445 lr.vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800446 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
448 lr.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800449 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700451 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800453 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700455 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800456 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700458 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800459 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700461 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800462 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700464 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800465 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466}
467
Steven Thomasbb374322020-04-28 22:47:16 -0700468TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800469 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700471 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472 auto& lr1 = layers[0];
473 auto& lr2 = layers[1];
474
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700475 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700477 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800479 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700481 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700483 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800485 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700487 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800488 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700489 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800491 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492}
493
Steven Thomasbb374322020-04-28 22:47:16 -0700494TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800495 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800496
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700497 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800498 auto& lr1 = layers[0];
499 auto& lr2 = layers[1];
500
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700501 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800502 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800503 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700504 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800505 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800506 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800507 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800508
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800510 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800511 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700512 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800513 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800514 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800515 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800516
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700517 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800518 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800519 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700520 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800521 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800522 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800523 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800524
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700525 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800526 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800527 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700528 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800529 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800530 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800531 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800532
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700533 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800534 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
535 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700536 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800537 lr2.vote = LayerVoteType::ExplicitDefault;
538 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800539 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800540
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700541 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800542 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700544 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800545 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800546 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800547 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800548
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800550 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800551 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700552 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800553 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800554 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800555 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800556
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700557 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800558 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800559 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700560 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800561 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800562 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800563 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800564
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700565 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800566 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800567 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700568 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800569 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800570 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800571 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800572}
573
rnlee3bd610662021-06-23 16:27:57 -0700574TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800575 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
576 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700577
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700578 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700579 auto& lr1 = layers[0];
580 auto& lr2 = layers[1];
581
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700582 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700583 lr1.vote = LayerVoteType::ExplicitDefault;
584 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700585 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700586 lr2.vote = LayerVoteType::Heuristic;
587 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800588 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700589
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700590 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700591 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
592 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700593 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700594 lr2.vote = LayerVoteType::Heuristic;
595 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800596 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700597
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700598 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700599 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
600 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700601 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700602 lr2.vote = LayerVoteType::ExplicitDefault;
603 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800604 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700605
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700606 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700607 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
608 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700609 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700610 lr2.vote = LayerVoteType::Heuristic;
611 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800612 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700613
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700614 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700615 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
616 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700617 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700618 lr2.vote = LayerVoteType::ExplicitDefault;
619 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800620 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700621
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700622 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700623 lr1.vote = LayerVoteType::ExplicitDefault;
624 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700625 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700626 lr2.vote = LayerVoteType::Heuristic;
627 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800628 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700629
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700630 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700631 lr1.vote = LayerVoteType::Heuristic;
632 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700633 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700634 lr2.vote = LayerVoteType::ExplicitDefault;
635 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800636 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700637
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700639 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
640 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700641 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700642 lr2.vote = LayerVoteType::ExplicitDefault;
643 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800644 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700645
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700646 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700647 lr1.vote = LayerVoteType::ExplicitDefault;
648 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700649 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700650 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
651 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800652 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700653}
654
Steven Thomasbb374322020-04-28 22:47:16 -0700655TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800656 RefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800657
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700658 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800659 auto& lr = layers[0];
660
661 lr.vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800662 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800663
664 lr.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800665 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800666
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700667 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800668 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800669 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800670
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700671 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800672 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800673
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700674 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800675 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800676
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700677 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800678 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800679
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700680 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800681 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800682}
683
Steven Thomasbb374322020-04-28 22:47:16 -0700684TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800685 RefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800686
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700687 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688 auto& lr = layers[0];
689
690 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800691 lr.name = "Min";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800692 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800693
694 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800695 lr.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800696 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800697
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700698 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800699 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800700 lr.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800701 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800702
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700703 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800704 lr.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800705 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
706 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800707
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700708 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800709 lr.name = "45Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800710 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
711 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800712
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700713 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800714 lr.name = "30Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800715 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {}));
716 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800717
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700718 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800719 lr.name = "24Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800720 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
721 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800722
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700723 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800724 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
725 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800726 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
727 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800728}
729
Steven Thomasbb374322020-04-28 22:47:16 -0700730TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800731 RefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800732
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700733 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734 auto& lr1 = layers[0];
735 auto& lr2 = layers[1];
736
737 lr1.vote = LayerVoteType::Min;
738 lr2.vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800739 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800740
741 lr1.vote = LayerVoteType::Min;
742 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700743 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800744 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800745
746 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800747 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700748 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800749 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800750
751 lr1.vote = LayerVoteType::Max;
752 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700753 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800754 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
756 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800757 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700758 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800759 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800760
761 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700762 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800763 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700764 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800765 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800766
767 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700768 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800769 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700770 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800771 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800772}
773
Steven Thomasbb374322020-04-28 22:47:16 -0700774TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800775 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800776
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700777 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800778 auto& lr = layers[0];
779
Ady Abraham71c437d2020-01-31 15:56:57 -0800780 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800781 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700782 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800783 const auto refreshRate = configs.getBestRefreshRate(layers, {});
784 EXPECT_EQ(asRefreshRate(kMode60), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700785 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800786 }
787}
788
rnlee3bd610662021-06-23 16:27:57 -0700789TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800790 RefreshRateConfigs configs(kModes_60_120, kModeId60, {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700791
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700792 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700793 auto& lr = layers[0];
794
795 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
796 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700797 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800798 const auto refreshRate = configs.getBestRefreshRate(layers, {});
799 EXPECT_EQ(asRefreshRate(kMode60), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700800 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
rnlee3bd610662021-06-23 16:27:57 -0700801 }
802}
803
Dominik Laskowski0c252702021-12-20 20:32:09 -0800804TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
805 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700807 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808 auto& lr1 = layers[0];
809 auto& lr2 = layers[1];
810
811 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700812 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800813 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700814 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800815 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800816
817 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700818 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800819 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700820 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800821 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800822
823 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700824 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800825 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700826 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800827 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham2139f732019-11-13 18:56:40 -0800828}
829
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800830TEST_F(RefreshRateConfigsTest, testInPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800831 const auto refreshRate =
832 asRefreshRate(createDisplayMode(kModeId60, Fps::fromPeriodNsecs(16'666'665)));
833
834 EXPECT_TRUE(refreshRate.inPolicy(60.000004_Hz, 60.000004_Hz));
835 EXPECT_TRUE(refreshRate.inPolicy(59_Hz, 60.1_Hz));
836 EXPECT_FALSE(refreshRate.inPolicy(75_Hz, 90_Hz));
837 EXPECT_FALSE(refreshRate.inPolicy(60.0011_Hz, 90_Hz));
838 EXPECT_FALSE(refreshRate.inPolicy(50_Hz, 59.998_Hz));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800839}
840
Steven Thomasbb374322020-04-28 22:47:16 -0700841TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800842 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800843
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700844 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800845 auto& lr = layers[0];
846
Ady Abraham71c437d2020-01-31 15:56:57 -0800847 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800848 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700849 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800850 const auto refreshRate = configs.getBestRefreshRate(layers, {});
851 EXPECT_EQ(asRefreshRate(kMode90), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700852 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800853 }
854}
855
Steven Thomasbb374322020-04-28 22:47:16 -0700856TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800857 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800858
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700859 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800860 auto& lr1 = layers[0];
861 auto& lr2 = layers[1];
862
863 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700864 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800865 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800866 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700867 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800868 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800869 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800870
871 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700872 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800873 lr1.name = "60Hz ExplicitExactOrMultiple";
874 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700875 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800876 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800877 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800878
879 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700880 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800881 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800882 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800883 lr2.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800884 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800885
886 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700887 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800888 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800889 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700890 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800891 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800892 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800893
894 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700895 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800896 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800897 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898 lr2.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800899 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900}
901
902TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800903 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800904
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700905 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800906 auto& lr1 = layers[0];
907 auto& lr2 = layers[1];
908
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::NoVote;
913 lr2.name = "NoVote";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800914 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800915
916 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700917 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800918 lr1.name = "60Hz ExplicitExactOrMultiple";
919 lr2.vote = LayerVoteType::NoVote;
920 lr2.name = "NoVote";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800921 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800922
923 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700924 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800925 lr1.name = "60Hz ExplicitExactOrMultiple";
926 lr2.vote = LayerVoteType::Max;
927 lr2.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800928 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800929
930 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700931 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800932 lr1.name = "60Hz ExplicitExactOrMultiple";
933 lr2.vote = LayerVoteType::Max;
934 lr2.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800935 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800936
937 // The other layer starts to provide buffers
938 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700939 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800940 lr1.name = "60Hz ExplicitExactOrMultiple";
941 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700942 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800943 lr2.name = "90Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800944 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800945}
946
947TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800948 RefreshRateConfigs configs(kModes_60_90, kModeId60);
949
Ady Abrahamdfd62162020-06-10 16:11:56 -0700950 RefreshRateConfigs::GlobalSignals consideredSignals;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800951 configs.getBestRefreshRate({}, {}, &consideredSignals);
952 EXPECT_FALSE(consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800953
Dominik Laskowski0c252702021-12-20 20:32:09 -0800954 configs.getBestRefreshRate({}, {.touch = true}, &consideredSignals);
955 EXPECT_TRUE(consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800956
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700957 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800958 auto& lr1 = layers[0];
959 auto& lr2 = layers[1];
960
961 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700962 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800963 lr1.name = "60Hz ExplicitExactOrMultiple";
964 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700965 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700966 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800967 configs.getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
968 EXPECT_TRUE(consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800969
970 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700971 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800972 lr1.name = "60Hz ExplicitExactOrMultiple";
973 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700974 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700975 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800976 configs.getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
977 EXPECT_FALSE(consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800978
979 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700980 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800981 lr1.name = "60Hz ExplicitExactOrMultiple";
982 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700983 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700984 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800985 configs.getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
986 EXPECT_TRUE(consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800987
988 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700989 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700990 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -0800991 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700992 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700993 lr2.name = "60Hz Heuristic";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800994 configs.getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
995 EXPECT_FALSE(consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -0800996}
997
Steven Thomasbb374322020-04-28 22:47:16 -0700998TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800999 RefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001000
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001001 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001002 auto& lr = layers[0];
1003
1004 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001005 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1006 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001007
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001008 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001009
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001010 {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 -08001011
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001012 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001013
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001014 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001015
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001016 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001017
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001018 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001019
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001020 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001021 };
1022
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001023 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001024 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001025 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001026
1027 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001028 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001029 lr.name = ss.str();
1030
Dominik Laskowski0c252702021-12-20 20:32:09 -08001031 const auto refreshRate = configs.getBestRefreshRate(layers, {});
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001032 EXPECT_EQ(refreshRate.getFps(), expected);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001033 }
1034}
1035
1036TEST_F(RefreshRateConfigsTest,
1037 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001038 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001039 auto& lr = layers[0];
1040
1041 // Test that 23.976 will choose 24 if 23.976 is not supported
1042 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001043 RefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60, kMode60Frac},
1044 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001045
1046 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001047 lr.desiredRefreshRate = 23.976_Hz;
1048 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001049 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001050 }
1051
1052 // Test that 24 will choose 23.976 if 24 is not supported
1053 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001054 RefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1055 kMode60Frac},
1056 kModeId60);
1057
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001058 lr.desiredRefreshRate = 24_Hz;
1059 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001060 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001061 }
1062
1063 // Test that 29.97 will prefer 59.94 over 60 and 30
1064 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001065 RefreshRateConfigs configs({kMode24, kMode24Frac, kMode25, kMode30, kMode60, kMode60Frac},
1066 kModeId60);
1067
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001068 lr.desiredRefreshRate = 29.97_Hz;
1069 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001070 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001071 }
1072}
1073
1074TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001075 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001076 auto& lr = layers[0];
1077
1078 // Test that voting for supported refresh rate will select this refresh rate
1079 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001080 RefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001081
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001082 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 +02001083 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001084 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001085 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001086 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001087 lr.name = ss.str();
1088
Dominik Laskowski0c252702021-12-20 20:32:09 -08001089 auto selectedRefreshRate = configs.getBestRefreshRate(layers, {});
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 EXPECT_EQ(selectedRefreshRate.getFps(), lr.desiredRefreshRate);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001091 }
1092 }
1093
1094 // Test that 23.976 will choose 24 if 23.976 is not supported
1095 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001096 RefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60, kMode60Frac},
1097 kModeId60);
1098
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001099 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001100 lr.desiredRefreshRate = 23.976_Hz;
1101 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001102 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001103 }
1104
1105 // Test that 24 will choose 23.976 if 24 is not supported
1106 {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001107 RefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1108 kMode60Frac},
1109 kModeId60);
1110
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001111 lr.desiredRefreshRate = 24_Hz;
1112 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001113 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers, {}).getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001114 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001115}
1116
Alec Mouri11232a22020-05-14 18:06:25 -07001117TEST_F(RefreshRateConfigsTest,
1118 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001119 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001120
Dominik Laskowski0c252702021-12-20 20:32:09 -08001121 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001122
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001123 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001124 auto& lr = layers[0];
1125
Ady Abrahamdfd62162020-06-10 16:11:56 -07001126 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001127 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001128 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001129 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001130 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001131 EXPECT_EQ(asRefreshRate(kMode60),
1132 configs.getBestRefreshRate(layers, {.touch = true, .idle = true},
1133 &consideredSignals));
1134 EXPECT_FALSE(consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001135}
1136
1137TEST_F(RefreshRateConfigsTest,
1138 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001139 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001140
Dominik Laskowski0c252702021-12-20 20:32:09 -08001141 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001142
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001143 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001144 auto& lr = layers[0];
1145
Alec Mouri11232a22020-05-14 18:06:25 -07001146 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001147 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001148 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001149 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001150 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001151}
1152
1153TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001154 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001155 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001156
Dominik Laskowski0c252702021-12-20 20:32:09 -08001157 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001158
Ady Abrahamdfd62162020-06-10 16:11:56 -07001159 RefreshRateConfigs::GlobalSignals consideredSignals;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001160 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate({}, {}, &consideredSignals));
1161 EXPECT_FALSE(consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001162
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001163 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001164 auto& lr = layers[0];
1165
1166 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001167 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001168 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001169 lr.focused = false;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001170 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001171
1172 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001173 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001174
1175 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001176 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001177 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001178 lr.focused = false;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001179 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001180
1181 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001182 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001183
1184 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001185 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001186 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001187 lr.focused = false;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001188 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001189
1190 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001191 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001192
1193 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001194 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001195 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001196 lr.focused = false;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001197 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001198
1199 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001200 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001201
1202 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001203 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001204 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001205 lr.focused = false;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001206 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001207
1208 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001209 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001210}
1211
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001212TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001213 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001214
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001215 // The default policy doesn't allow group switching. Verify that no
1216 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001217 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001218 auto& layer = layers[0];
1219 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001220 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001221 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001222 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001223 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001224
Dominik Laskowski0c252702021-12-20 20:32:09 -08001225 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001226}
Steven Thomasd4071902020-03-24 16:02:53 -07001227
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001228TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001229 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001230 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001231 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001232 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001233 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001234
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001235 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001236 auto& layer = layers[0];
1237 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001238 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001239 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1240 layer.name = "90Hz ExplicitDefault";
1241 layer.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001242 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001243}
1244
1245TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001246 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1247
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001248 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001249 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001250 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001251 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001252
1253 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001254 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001255 auto& layer = layers[0];
1256 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001257 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001258 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001259 layer.name = "90Hz ExplicitDefault";
1260 layer.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001261 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001262}
1263
1264TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001265 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001266
Dominik Laskowski0c252702021-12-20 20:32:09 -08001267 RefreshRateConfigs::Policy policy;
1268 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1269 policy.allowGroupSwitching = true;
1270 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1271
1272 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001273
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001274 // 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 -07001275 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001276 auto& layer = layers[0];
1277 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001278 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001279 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001280 layer.name = "60Hz ExplicitDefault";
1281 layer.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001282 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001283}
1284
1285TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001286 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001287
Dominik Laskowski0c252702021-12-20 20:32:09 -08001288 RefreshRateConfigs::Policy policy;
1289 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1290 policy.allowGroupSwitching = true;
1291 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1292
1293 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001294
1295 // Verify that if the current config is in another group and there are no layers with
1296 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001298 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001299 auto& layer = layers[0];
1300 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001302 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001303 layer.name = "60Hz ExplicitDefault";
1304 layer.focused = true;
1305
Dominik Laskowski0c252702021-12-20 20:32:09 -08001306 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001307}
1308
1309TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001310 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001311
Dominik Laskowski0c252702021-12-20 20:32:09 -08001312 RefreshRateConfigs::Policy policy;
1313 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1314 policy.allowGroupSwitching = true;
1315 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1316
1317 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001318
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001319 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001320 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001321 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001322 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001323 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001324 layers[0].seamlessness = Seamlessness::OnlySeamless;
1325 layers[0].name = "60Hz ExplicitDefault";
1326 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001327
1328 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001329 layers[1].vote = LayerVoteType::ExplicitDefault;
1330 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001331 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001332 layers[1].name = "90Hz ExplicitDefault";
1333 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001334
Dominik Laskowski0c252702021-12-20 20:32:09 -08001335 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001336}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001337
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001338TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001339 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001340
Dominik Laskowski0c252702021-12-20 20:32:09 -08001341 RefreshRateConfigs::Policy policy;
1342 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1343 policy.allowGroupSwitching = true;
1344 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1345
1346 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001347
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001348 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1349 // seamlessness=Default can't change the mode group back to the group of the default
1350 // mode.
1351 // For example, this may happen when a video playback requests and gets a seamed switch,
1352 // but another layer (with default seamlessness) starts animating. The animating layer
1353 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001354 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001355 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001356 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001357 layers[0].focused = true;
1358 layers[0].vote = LayerVoteType::ExplicitDefault;
1359 layers[0].name = "60Hz ExplicitDefault";
1360
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001361 layers.push_back(LayerRequirement{.weight = 0.1f});
1362 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001363 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001364 layers[1].focused = true;
1365 layers[1].vote = LayerVoteType::ExplicitDefault;
1366 layers[1].name = "90Hz ExplicitDefault";
1367
Dominik Laskowski0c252702021-12-20 20:32:09 -08001368 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001369}
1370
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001371TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001372 RefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001373
Dominik Laskowski0c252702021-12-20 20:32:09 -08001374 RefreshRateConfigs::Policy policy;
1375 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1376 policy.allowGroupSwitching = true;
1377 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1378
1379 configs.setCurrentModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001380
1381 // Layer with seamlessness=Default can change the mode group if there's a not
1382 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1383 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001384 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001385 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001386 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001387 layers[0].focused = true;
1388 layers[0].vote = LayerVoteType::ExplicitDefault;
1389 layers[0].name = "60Hz ExplicitDefault";
1390
1391 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001392 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001393 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001394 layers[1].focused = false;
1395 layers[1].vote = LayerVoteType::ExplicitDefault;
1396 layers[1].name = "90Hz ExplicitDefault";
1397
Dominik Laskowski0c252702021-12-20 20:32:09 -08001398 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001399}
1400
1401TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001402 RefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001403
1404 // Allow group switching.
1405 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001406 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001407 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001408 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001409
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001410 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001411 auto& layer = layers[0];
1412 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001413 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001414 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001415 layer.name = "60Hz ExplicitExactOrMultiple";
1416 layer.focused = true;
1417
Dominik Laskowski0c252702021-12-20 20:32:09 -08001418 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001419
Dominik Laskowski0c252702021-12-20 20:32:09 -08001420 configs.setCurrentModeId(kModeId120);
1421 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001422}
1423
1424TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001425 RefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001426
1427 // Allow group switching.
1428 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001429 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001430 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001431 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001432
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001433 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1434 .vote = LayerVoteType::ExplicitDefault,
1435 .desiredRefreshRate = 60_Hz,
1436 .seamlessness = Seamlessness::SeamedAndSeamless,
1437 .weight = 0.5f,
1438 .focused = false},
1439 {.name = "25Hz ExplicitExactOrMultiple",
1440 .vote = LayerVoteType::ExplicitExactOrMultiple,
1441 .desiredRefreshRate = 25_Hz,
1442 .seamlessness = Seamlessness::OnlySeamless,
1443 .weight = 1.f,
1444 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001445
Dominik Laskowski0c252702021-12-20 20:32:09 -08001446 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001447
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001448 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001449 seamedLayer.desiredRefreshRate = 30_Hz;
1450 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001451 configs.setCurrentModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001452
Dominik Laskowski0c252702021-12-20 20:32:09 -08001453 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers, {}).getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001454}
1455
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001456TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001457 RefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001458
1459 // Allow group switching.
1460 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001461 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001462 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001463 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001464
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001465 std::vector<LayerRequirement> layers = {
1466 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001467
Dominik Laskowski0c252702021-12-20 20:32:09 -08001468 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001469}
1470
Steven Thomasf734df42020-04-13 21:09:28 -07001471TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001472 RefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001473
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001474 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001475 layers[0].name = "Test layer";
1476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001477 struct Args {
1478 bool touch = false;
1479 bool focused = true;
1480 };
1481
Steven Thomasbb374322020-04-28 22:47:16 -07001482 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001483 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001484 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001485 layers[0].vote = voteType;
1486 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001487 layers[0].focused = args.focused;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001488 return configs.getBestRefreshRate(layers, {.touch = args.touch}).getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001489 };
1490
Dominik Laskowski0c252702021-12-20 20:32:09 -08001491 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1492
1493 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {}).getModeId());
1494 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1495 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1496 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1497 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1498 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1499 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001500
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001501 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001502 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1503 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001504 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001505
Steven Thomasf734df42020-04-13 21:09:28 -07001506 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001507 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1508
Steven Thomasf734df42020-04-13 21:09:28 -07001509 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1510 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001511 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1512 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001513 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001514
Dominik Laskowski0c252702021-12-20 20:32:09 -08001515 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1516
1517 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1518 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1519 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1520 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1521 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1522 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001523}
1524
Steven Thomasbb374322020-04-28 22:47:16 -07001525TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001526 RefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001527
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001528 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001529 layers[0].name = "Test layer";
1530
Marin Shalamanov23c44202020-12-22 19:09:20 +01001531 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001532 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001533 layers[0].desiredRefreshRate = 90_Hz;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001534 RefreshRateConfigs::GlobalSignals consideredSignals;
1535 const auto configId =
Dominik Laskowski0c252702021-12-20 20:32:09 -08001536 configs.getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1537 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001538 .getModeId();
Dominik Laskowski0c252702021-12-20 20:32:09 -08001539
Ady Abrahamdfd62162020-06-10 16:11:56 -07001540 // Refresh rate will be chosen by either touch state or idle state
1541 EXPECT_EQ(!touchActive, consideredSignals.idle);
1542 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001543 };
1544
Dominik Laskowski0c252702021-12-20 20:32:09 -08001545 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001546
1547 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001548 {
1549 constexpr bool kTouchActive = true;
1550 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1551 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1552 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1553 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1554 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1555 EXPECT_EQ(kModeId90,
1556 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1557 }
Steven Thomasbb374322020-04-28 22:47:16 -07001558
1559 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001560 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001561
1562 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001563 configs.setCurrentModeId(kModeId90);
1564
1565 {
1566 constexpr bool kTouchActive = false;
1567 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1568 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1569 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1570 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1571 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1572 EXPECT_EQ(kModeId60,
1573 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1574 }
Steven Thomasbb374322020-04-28 22:47:16 -07001575
1576 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001577 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001578}
1579
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001580TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001581 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001582
1583 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001584 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1585 const Fps expectedFrameRate = [fps] {
1586 if (fps < 26.91f) return 24_Hz;
1587 if (fps < 37.51f) return 30_Hz;
1588 if (fps < 52.51f) return 45_Hz;
1589 if (fps < 66.01f) return 60_Hz;
1590 if (fps < 81.01f) return 72_Hz;
1591 return 90_Hz;
1592 }();
1593
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001594 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001595 }
1596}
1597
1598TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001599 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001600
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001601 struct Expectation {
1602 Fps fps;
1603 const RefreshRate& refreshRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001604 };
1605
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001606 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001607 {24_Hz, asRefreshRate(kMode60)}, {30_Hz, asRefreshRate(kMode60)},
1608 {45_Hz, asRefreshRate(kMode90)}, {60_Hz, asRefreshRate(kMode60)},
1609 {72_Hz, asRefreshRate(kMode90)}, {90_Hz, asRefreshRate(kMode90)},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001610 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001611
1612 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001613 const auto& knownFrameRates = configs.knownFrameRates();
1614 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 knownFrameRatesExpectations.begin(),
1616 [](Fps fps, const Expectation& expected) {
1617 return isApproxEqual(fps, expected.fps);
1618 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001619 EXPECT_TRUE(equal);
1620
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001621 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001622 auto& layer = layers[0];
1623 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001624
1625 for (const auto& [fps, refreshRate] : knownFrameRatesExpectations) {
1626 layer.desiredRefreshRate = fps;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001627 EXPECT_EQ(refreshRate, configs.getBestRefreshRate(layers, {}));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001628 }
1629}
1630
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001631TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001632 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001633
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001634 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001635 auto& explicitExactLayer = layers[0];
1636 auto& explicitExactOrMultipleLayer = layers[1];
1637
1638 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1639 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001640 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001641
1642 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1643 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001644 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001645
Dominik Laskowski0c252702021-12-20 20:32:09 -08001646 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {}));
1647 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001648
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001649 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1650 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001651 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001652
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001653 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001654 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001655
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001656 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001657 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001658
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001659 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001660 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001661}
1662
1663TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001664 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1665 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001666
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001667 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001668 auto& explicitExactLayer = layers[0];
1669 auto& explicitExactOrMultipleLayer = layers[1];
1670
1671 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1672 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001673 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001674
1675 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1676 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001677 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001678
Dominik Laskowski0c252702021-12-20 20:32:09 -08001679 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
1680 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001681
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001682 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1683 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001684 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001685
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001686 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001687 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001688
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001689 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001690 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001692 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001693 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001694}
1695
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001696TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001697 using GetBestRefreshRateInvocation = TestableRefreshRateConfigs::GetBestRefreshRateInvocation;
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001698 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1699
Dominik Laskowski0c252702021-12-20 20:32:09 -08001700 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001701
Dominik Laskowski0c252702021-12-20 20:32:09 -08001702 configs.mutableLastBestRefreshRateInvocation() =
1703 GetBestRefreshRateInvocation{.globalSignals = {.touch = true, .idle = true},
1704 .outSignalsConsidered = {.touch = true},
1705 .resultingBestRefreshRate = asRefreshRate(kMode90)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001706
Dominik Laskowski0c252702021-12-20 20:32:09 -08001707 EXPECT_EQ(asRefreshRate(kMode90),
1708 configs.getBestRefreshRate({}, {.touch = true, .idle = true}));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001709
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001710 const GlobalSignals cachedSignalsConsidered{.touch = true};
Dominik Laskowski0c252702021-12-20 20:32:09 -08001711
1712 configs.mutableLastBestRefreshRateInvocation() =
1713 GetBestRefreshRateInvocation{.globalSignals = {.touch = true, .idle = true},
1714 .outSignalsConsidered = cachedSignalsConsidered,
1715 .resultingBestRefreshRate = asRefreshRate(kMode30)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001716
1717 GlobalSignals signalsConsidered;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001718 EXPECT_EQ(asRefreshRate(kMode30),
1719 configs.getBestRefreshRate({}, {.touch = true, .idle = true}, &signalsConsidered));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001720
1721 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1722}
1723
1724TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1725 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1726
Dominik Laskowski0c252702021-12-20 20:32:09 -08001727 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1728
1729 EXPECT_FALSE(configs.mutableLastBestRefreshRateInvocation());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001730
1731 GlobalSignals globalSignals{.touch = true, .idle = true};
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001732 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowski0c252702021-12-20 20:32:09 -08001733 const auto lastResult = configs.getBestRefreshRate(layers, globalSignals,
1734 /* outSignalsConsidered */ nullptr);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001735
Dominik Laskowski0c252702021-12-20 20:32:09 -08001736 const auto& lastInvocation = configs.mutableLastBestRefreshRateInvocation();
1737 ASSERT_TRUE(lastInvocation);
1738 EXPECT_EQ(layers, lastInvocation->layerRequirements);
1739 EXPECT_EQ(globalSignals, lastInvocation->globalSignals);
1740 EXPECT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001741
1742 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1743 // to getBestRefreshRate()
Dominik Laskowski0c252702021-12-20 20:32:09 -08001744 GlobalSignals defaultSignals;
1745 EXPECT_FALSE(defaultSignals == lastInvocation->outSignalsConsidered);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001746}
1747
Ady Abraham5e4e9832021-06-14 13:40:56 -07001748TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001749 RefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001750
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001751 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001752 auto& explicitExactLayer = layers[0];
1753 auto& explicitExactOrMultipleLayer = layers[1];
1754
1755 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1756 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001757 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001758
1759 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1760 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001761 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001762
Dominik Laskowski0c252702021-12-20 20:32:09 -08001763 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
1764 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001765
1766 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1767
Dominik Laskowski0c252702021-12-20 20:32:09 -08001768 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
1769 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001770}
1771
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001772TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001773 RefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1774 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001775
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001776 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001777 auto& explicitDefaultLayer = layers[0];
1778 auto& explicitExactOrMultipleLayer = layers[1];
1779
1780 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1781 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001782 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001783
1784 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1785 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001786 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001787
Dominik Laskowski0c252702021-12-20 20:32:09 -08001788 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {}));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001789}
1790
Ady Abraham05243be2021-09-16 15:58:52 -07001791// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001792TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001793 constexpr int kMinRefreshRate = 10;
1794 constexpr int kMaxRefreshRate = 240;
1795
1796 DisplayModes displayModes;
1797 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Ady Abraham05243be2021-09-16 15:58:52 -07001798 displayModes.push_back(
Dominik Laskowski0c252702021-12-20 20:32:09 -08001799 createDisplayMode(DisplayModeId(fps), Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001800 }
1801
Dominik Laskowski0c252702021-12-20 20:32:09 -08001802 const RefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham05243be2021-09-16 15:58:52 -07001803
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001804 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001805 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1806 layers[0].desiredRefreshRate = fps;
1807 layers[0].vote = vote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001808 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers, {}).getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001809 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001810 };
1811
1812 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001813 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001814 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1815 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1816 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1817 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1818 }
1819}
1820
Ady Abraham1c595502022-01-13 21:58:32 -08001821// b/190578904
1822TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
1823 const DisplayModes displayModes = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001824 createDisplayMode(DisplayModeId(0), 43_Hz),
1825 createDisplayMode(DisplayModeId(1), 53_Hz),
1826 createDisplayMode(DisplayModeId(2), 55_Hz),
1827 createDisplayMode(DisplayModeId(3), 60_Hz),
Ady Abraham1c595502022-01-13 21:58:32 -08001828 };
1829
1830 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowski0c252702021-12-20 20:32:09 -08001831 const RefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham1c595502022-01-13 21:58:32 -08001832
Dominik Laskowski0c252702021-12-20 20:32:09 -08001833 const std::vector<LayerRequirement> layers = {
1834 {
Ady Abraham1c595502022-01-13 21:58:32 -08001835 .vote = LayerVoteType::ExplicitDefault,
1836 .desiredRefreshRate = 43_Hz,
1837 .seamlessness = Seamlessness::SeamedAndSeamless,
1838 .weight = 0.41f,
1839 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001840 {
Ady Abraham1c595502022-01-13 21:58:32 -08001841 .vote = LayerVoteType::ExplicitExactOrMultiple,
1842 .desiredRefreshRate = 53_Hz,
1843 .seamlessness = Seamlessness::SeamedAndSeamless,
1844 .weight = 0.41f,
1845 },
1846 };
1847
Dominik Laskowski0c252702021-12-20 20:32:09 -08001848 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals).getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001849}
1850
Ana Krulecb9afd792020-06-11 13:16:15 -07001851TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001852 EXPECT_TRUE(asRefreshRate(kMode60) < asRefreshRate(kMode90));
1853 EXPECT_FALSE(asRefreshRate(kMode60) < asRefreshRate(kMode60));
1854 EXPECT_FALSE(asRefreshRate(kMode90) < asRefreshRate(kMode90));
Ana Krulecb9afd792020-06-11 13:16:15 -07001855}
1856
1857TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001858 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001859
Dominik Laskowski0c252702021-12-20 20:32:09 -08001860 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1861
Ana Krulecb9afd792020-06-11 13:16:15 -07001862 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001863 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001864
1865 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001866 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1867 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001868
Ady Abrahama91605e2021-06-18 11:41:47 -07001869 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001870 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1871 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001872
1873 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001874 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1875 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001876}
1877
TreeHugger Robot758ab612021-06-22 19:17:29 +00001878TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001879 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001880
Dominik Laskowski0c252702021-12-20 20:32:09 -08001881 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1882
TreeHugger Robot758ab612021-06-22 19:17:29 +00001883 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001884 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1885 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001886
1887 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001888 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1889 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001890
1891 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001892 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1893 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001894
1895 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001896 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1897 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001898}
1899
Ady Abraham5cc2e262021-03-25 13:09:17 -07001900TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001901 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001902
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001903 const auto frameRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001904 Fps displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001905 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001906
Dominik Laskowski0c252702021-12-20 20:32:09 -08001907 configs.setCurrentModeId(kModeId60);
1908 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001909 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001910
Dominik Laskowski0c252702021-12-20 20:32:09 -08001911 configs.setCurrentModeId(kModeId72);
1912 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001913 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001914
Dominik Laskowski0c252702021-12-20 20:32:09 -08001915 configs.setCurrentModeId(kModeId90);
1916 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001917 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001918
Dominik Laskowski0c252702021-12-20 20:32:09 -08001919 configs.setCurrentModeId(kModeId120);
1920 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001921 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001922
Dominik Laskowski0c252702021-12-20 20:32:09 -08001923 configs.setCurrentModeId(kModeId90);
1924 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001925 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001926
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001927 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 25_Hz));
1928 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 23.976_Hz));
1929 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(30_Hz, 29.97_Hz));
1930 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001931}
1932
1933TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001934 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1935 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001936
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001937 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1938 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001939
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001940 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1941 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001942
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001943 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1944 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001945
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001946 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1947 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001948
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001949 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 +02001950 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001951 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001952 }
1953
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001954 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1955 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1956 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001957}
1958
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001959TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001960 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001961
Dominik Laskowski0c252702021-12-20 20:32:09 -08001962 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001963}
1964
1965TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001966 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1967 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001968
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001969 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001970 layers[0].name = "Test layer";
1971 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001972 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001973 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001974
1975 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1976 EXPECT_EQ(1u, frameRateOverrides.size());
1977 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1978 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001979
1980 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001981 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1982 EXPECT_EQ(1u, frameRateOverrides.size());
1983 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1984 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001985
1986 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001987 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1988 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001989
1990 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001991 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1992 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001993
1994 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001995 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1996 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001997
1998 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001999 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2000 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002001}
2002
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002003TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002004 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2005 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002006
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002007 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2008 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002009
2010 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002011 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002012 layers[0].vote = LayerVoteType::ExplicitDefault;
2013
2014 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002015 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002016 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002017 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002018
Dominik Laskowski0c252702021-12-20 20:32:09 -08002019 EXPECT_EQ(2u, frameRateOverrides.size());
2020 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2021 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2022 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2023 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002024
2025 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002026 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2027 EXPECT_EQ(1u, frameRateOverrides.size());
2028 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2029 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002030
2031 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002032 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2033 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002034}
2035
2036TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002037 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2038 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002039
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002040 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002041 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002042 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002043 layers[0].vote = LayerVoteType::ExplicitDefault;
2044
Dominik Laskowski0c252702021-12-20 20:32:09 -08002045 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2046 EXPECT_EQ(1u, frameRateOverrides.size());
2047 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2048 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002049
Dominik Laskowski0c252702021-12-20 20:32:09 -08002050 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2051 EXPECT_EQ(1u, frameRateOverrides.size());
2052 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2053 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002054
2055 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002056 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2057 EXPECT_EQ(1u, frameRateOverrides.size());
2058 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2059 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002060
Dominik Laskowski0c252702021-12-20 20:32:09 -08002061 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2062 EXPECT_EQ(1u, frameRateOverrides.size());
2063 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2064 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002065
2066 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002067 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2068 EXPECT_EQ(1u, frameRateOverrides.size());
2069 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2070 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002071
Dominik Laskowski0c252702021-12-20 20:32:09 -08002072 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2073 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002074}
2075
Alec Mouri0a1cc962019-03-14 12:33:02 -07002076} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002077} // namespace android::scheduler