blob: 4efcc051bb20b25e44c22b7b3b58c8ab8574ec26 [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
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080074 using RefreshRateConfigs::GetBestRefreshRateCache;
75 auto& mutableGetBestRefreshRateCache() { return mGetBestRefreshRateCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080076
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080077 auto getBestRefreshRateAndSignals(const std::vector<LayerRequirement>& layers,
78 GlobalSignals signals) const {
79 return RefreshRateConfigs::getBestRefreshRate(layers, signals);
80 }
81
82 RefreshRate getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
83 GlobalSignals signals = {}) const {
84 return getBestRefreshRateAndSignals(layers, signals).first;
Dominik Laskowski0c252702021-12-20 20:32:09 -080085 }
86};
87
Alec Mouri0a1cc962019-03-14 12:33:02 -070088class RefreshRateConfigsTest : public testing::Test {
89protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070090 RefreshRateConfigsTest();
91 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070092
Dominik Laskowski0c252702021-12-20 20:32:09 -080093 static RefreshRate asRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070094 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020095 }
96
Dominik Laskowski0c252702021-12-20 20:32:09 -080097 static constexpr DisplayModeId kModeId60{0};
98 static constexpr DisplayModeId kModeId90{1};
99 static constexpr DisplayModeId kModeId72{2};
100 static constexpr DisplayModeId kModeId120{3};
101 static constexpr DisplayModeId kModeId30{4};
102 static constexpr DisplayModeId kModeId25{5};
103 static constexpr DisplayModeId kModeId50{6};
104 static constexpr DisplayModeId kModeId24{7};
105 static constexpr DisplayModeId kModeId24Frac{8};
106 static constexpr DisplayModeId kModeId30Frac{9};
107 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700108
Dominik Laskowski0c252702021-12-20 20:32:09 -0800109 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
110 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
111 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
112 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
113 static inline const DisplayModePtr kMode90_4K =
114 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
115 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
116 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
117 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
118 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
119 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
120 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
121 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
122 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
123 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
124 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
125 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
126 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700127
Dominik Laskowski0c252702021-12-20 20:32:09 -0800128 // Test configurations.
129 static inline const DisplayModes kModes_60 = {kMode60};
130 static inline const DisplayModes kModes_60_90 = {kMode60, kMode90};
131 static inline const DisplayModes kModes_60_90_G1 = {kMode60, kMode90_G1};
132 static inline const DisplayModes kModes_60_90_4K = {kMode60, kMode90_4K};
133 static inline const DisplayModes kModes_60_72_90 = {kMode60, kMode90, kMode72};
134 static inline const DisplayModes kModes_60_90_72_120 = {kMode60, kMode90, kMode72, kMode120};
135 static inline const DisplayModes kModes_30_60_72_90_120 = {kMode60, kMode90, kMode72, kMode120,
136 kMode30};
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100137
Dominik Laskowski0c252702021-12-20 20:32:09 -0800138 static inline const DisplayModes kModes_30_60 = {kMode60, kMode90_G1, kMode72_G1, kMode120_G1,
139 kMode30};
140 static inline const DisplayModes kModes_30_60_72_90 = {kMode60, kMode90, kMode72, kMode120_G1,
141 kMode30};
142 static inline const DisplayModes kModes_30_60_90 = {kMode60, kMode90, kMode72_G1, kMode120_G1,
143 kMode30};
144 static inline const DisplayModes kModes_25_30_50_60 = {kMode60, kMode90, kMode72_G1,
145 kMode120_G1, kMode30_G1, kMode25_G1,
146 kMode50};
147 static inline const DisplayModes kModes_60_120 = {kMode60, kMode120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700148
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200149 // This is a typical TV configuration.
Dominik Laskowski0c252702021-12-20 20:32:09 -0800150 static inline const DisplayModes kModes_24_25_30_50_60_Frac = {kMode24, kMode24Frac, kMode25,
151 kMode30, kMode30Frac, kMode50,
152 kMode60, kMode60Frac};
Alec Mouri0a1cc962019-03-14 12:33:02 -0700153};
154
155RefreshRateConfigsTest::RefreshRateConfigsTest() {
156 const ::testing::TestInfo* const test_info =
157 ::testing::UnitTest::GetInstance()->current_test_info();
158 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
159}
160
161RefreshRateConfigsTest::~RefreshRateConfigsTest() {
162 const ::testing::TestInfo* const test_info =
163 ::testing::UnitTest::GetInstance()->current_test_info();
164 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
165}
166
167namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700168
Dominik Laskowski0c252702021-12-20 20:32:09 -0800169TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
170 RefreshRateConfigs configs(kModes_60, kModeId60);
171 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700172}
173
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100174TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800175 RefreshRateConfigs configs(kModes_60, kModeId60);
176 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
177 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100178}
179
Dominik Laskowski0c252702021-12-20 20:32:09 -0800180TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
181 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700182
Dominik Laskowski0c252702021-12-20 20:32:09 -0800183 const auto minRate = configs.getMinSupportedRefreshRate();
184 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700185
Dominik Laskowski0c252702021-12-20 20:32:09 -0800186 EXPECT_EQ(asRefreshRate(kMode60), minRate);
187 EXPECT_EQ(asRefreshRate(kMode90), performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800188
Dominik Laskowski0c252702021-12-20 20:32:09 -0800189 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
190 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
191
192 EXPECT_EQ(minRateByPolicy, minRate);
193 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700194}
Ady Abraham2139f732019-11-13 18:56:40 -0800195
Dominik Laskowski0c252702021-12-20 20:32:09 -0800196TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
197 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800198
Dominik Laskowski0c252702021-12-20 20:32:09 -0800199 const auto minRate = configs.getMinRefreshRateByPolicy();
200 const auto performanceRate = configs.getMaxSupportedRefreshRate();
201 const auto minRate60 = configs.getMinRefreshRateByPolicy();
202 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800203
Dominik Laskowski0c252702021-12-20 20:32:09 -0800204 EXPECT_EQ(asRefreshRate(kMode60), minRate);
205 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
206 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800207
Dominik Laskowski0c252702021-12-20 20:32:09 -0800208 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
209 configs.setCurrentModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800210
Dominik Laskowski0c252702021-12-20 20:32:09 -0800211 const auto minRate90 = configs.getMinRefreshRateByPolicy();
212 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800213
Dominik Laskowski0c252702021-12-20 20:32:09 -0800214 EXPECT_EQ(asRefreshRate(kMode90_G1), performanceRate);
215 EXPECT_EQ(asRefreshRate(kMode90_G1), minRate90);
216 EXPECT_EQ(asRefreshRate(kMode90_G1), performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700217}
218
Dominik Laskowski0c252702021-12-20 20:32:09 -0800219TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
220 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700221
Dominik Laskowski0c252702021-12-20 20:32:09 -0800222 const auto minRate = configs.getMinRefreshRateByPolicy();
223 const auto performanceRate = configs.getMaxSupportedRefreshRate();
224 const auto minRate60 = configs.getMinRefreshRateByPolicy();
225 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700226
Dominik Laskowski0c252702021-12-20 20:32:09 -0800227 EXPECT_EQ(asRefreshRate(kMode60), minRate);
228 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
229 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700230
Dominik Laskowski0c252702021-12-20 20:32:09 -0800231 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
232 configs.setCurrentModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700233
Dominik Laskowski0c252702021-12-20 20:32:09 -0800234 const auto minRate90 = configs.getMinRefreshRateByPolicy();
235 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700236
Dominik Laskowski0c252702021-12-20 20:32:09 -0800237 EXPECT_EQ(asRefreshRate(kMode90_4K), performanceRate);
238 EXPECT_EQ(asRefreshRate(kMode90_4K), minRate90);
239 EXPECT_EQ(asRefreshRate(kMode90_4K), performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800240}
241
Dominik Laskowski0c252702021-12-20 20:32:09 -0800242TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
243 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800244
Dominik Laskowski0c252702021-12-20 20:32:09 -0800245 const auto minRate = configs.getMinRefreshRateByPolicy();
246 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800247
Dominik Laskowski0c252702021-12-20 20:32:09 -0800248 EXPECT_EQ(asRefreshRate(kMode60), minRate);
249 EXPECT_EQ(asRefreshRate(kMode90), performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800250
Dominik Laskowski0c252702021-12-20 20:32:09 -0800251 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800252
Dominik Laskowski0c252702021-12-20 20:32:09 -0800253 const auto minRate60 = configs.getMinRefreshRateByPolicy();
254 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
255
256 EXPECT_EQ(asRefreshRate(kMode60), minRate60);
257 EXPECT_EQ(asRefreshRate(kMode60), performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800258}
259
Dominik Laskowski0c252702021-12-20 20:32:09 -0800260TEST_F(RefreshRateConfigsTest, twoModes_getCurrentRefreshRate) {
261 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
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(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800265 }
266
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 configs.setCurrentModeId(kModeId90);
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
Dominik Laskowski0c252702021-12-20 20:32:09 -0800273 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800274 {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800275 const auto current = configs.getCurrentRefreshRate();
276 EXPECT_EQ(current.getModeId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800277 }
278}
279
Steven Thomasbb374322020-04-28 22:47:16 -0700280TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800281 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800282 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800283
Dominik Laskowski0c252702021-12-20 20:32:09 -0800284 // If there are no layers we select the default frame rate, which is the max of the primary
285 // range.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800286 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800287
Dominik Laskowski0c252702021-12-20 20:32:09 -0800288 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800289 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800290 }
291 {
292 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800293 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800294 constexpr bool kAllowGroupSwitching = true;
295 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
296 NO_ERROR);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800297 EXPECT_EQ(asRefreshRate(kMode90_G1), configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800298 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800299}
300
Steven Thomasbb374322020-04-28 22:47:16 -0700301TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800302 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800303
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700304 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800305 auto& lr = layers[0];
306
307 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800308 lr.name = "Min";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800309 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800310
311 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800312 lr.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800313 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800314
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700315 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800316 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800317 lr.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800318 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800319
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700320 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800321 lr.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800322 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800323
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700324 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800325 lr.name = "45Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800326 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700328 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800329 lr.name = "30Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800330 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800331
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700332 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800333 lr.name = "24Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800334 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800335
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800336 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800337 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338
339 lr.vote = LayerVoteType::Min;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800340 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800341
342 lr.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800343 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800344
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700345 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800346 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800353 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700355 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800356 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800357
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700358 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800359 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800360
Dominik Laskowski0c252702021-12-20 20:32:09 -0800361 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
363 lr.vote = LayerVoteType::Min;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800364 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365
366 lr.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800367 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700369 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800377 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700379 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800380 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800383 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Dominik Laskowski0c252702021-12-20 20:32:09 -0800385 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386 lr.vote = LayerVoteType::Min;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800387 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800388
389 lr.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800390 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700392 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800393 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800400 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700402 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800403 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700405 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800406 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407}
408
rnlee3bd610662021-06-23 16:27:57 -0700409TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800410 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700411
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700412 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700413 auto& lr = layers[0];
414
415 lr.vote = LayerVoteType::Min;
416 lr.name = "Min";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800417 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700418
419 lr.vote = LayerVoteType::Max;
420 lr.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800421 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700422
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700423 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700424 lr.vote = LayerVoteType::Heuristic;
425 lr.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800426 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700427
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700428 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700429 lr.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800430 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700431
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700432 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700433 lr.name = "45Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800434 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700435
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700436 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700437 lr.name = "30Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800438 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700439
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700440 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700441 lr.name = "24Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800442 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700443}
444
Steven Thomasbb374322020-04-28 22:47:16 -0700445TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800446 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700448 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449 auto& lr = layers[0];
450
451 lr.vote = LayerVoteType::Min;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800452 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
454 lr.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800455 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700457 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800458 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800465 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700467 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800468 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700470 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800471 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472}
473
Steven Thomasbb374322020-04-28 22:47:16 -0700474TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800475 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700477 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478 auto& lr1 = layers[0];
479 auto& lr2 = layers[1];
480
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 = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800485 EXPECT_EQ(asRefreshRate(kMode120), 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 Laskowskia8626ec2021-12-15 18:13:30 -0800491 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700495 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800496 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800497 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498}
499
Steven Thomasbb374322020-04-28 22:47:16 -0700500TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800501 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800502
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700503 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800504 auto& lr1 = layers[0];
505 auto& lr2 = layers[1];
506
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700507 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800508 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800509 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700510 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800511 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800512 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800513 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800514
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700515 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800516 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800517 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700518 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800519 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800520 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800521 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800522
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700523 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800524 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800525 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700526 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800527 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800528 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800529 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800530
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700531 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800532 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800533 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700534 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800535 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800536 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800537 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800538
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700539 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800540 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
541 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700542 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr2.vote = LayerVoteType::ExplicitDefault;
544 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800545 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800546
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700547 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800548 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800549 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700550 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800551 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800552 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800553 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800554
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700555 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800556 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800557 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700558 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800559 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800560 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800561 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800562
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700563 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800564 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800565 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700566 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800567 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800568 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800569 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800570
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700571 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800572 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800573 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700574 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800575 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800576 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800577 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800578}
579
rnlee3bd610662021-06-23 16:27:57 -0700580TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800581 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
582 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700583
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700584 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700585 auto& lr1 = layers[0];
586 auto& lr2 = layers[1];
587
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700588 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700589 lr1.vote = LayerVoteType::ExplicitDefault;
590 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700591 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700592 lr2.vote = LayerVoteType::Heuristic;
593 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800594 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700595
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700596 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700597 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
598 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700599 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700600 lr2.vote = LayerVoteType::Heuristic;
601 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800602 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700603
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700604 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700605 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
606 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700607 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700608 lr2.vote = LayerVoteType::ExplicitDefault;
609 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800610 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700611
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700612 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700613 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
614 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700615 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700616 lr2.vote = LayerVoteType::Heuristic;
617 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800618 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700619
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700620 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700621 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
622 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700623 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700624 lr2.vote = LayerVoteType::ExplicitDefault;
625 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800626 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700627
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700628 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700629 lr1.vote = LayerVoteType::ExplicitDefault;
630 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700631 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700632 lr2.vote = LayerVoteType::Heuristic;
633 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800634 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700635
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700636 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700637 lr1.vote = LayerVoteType::Heuristic;
638 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700639 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700640 lr2.vote = LayerVoteType::ExplicitDefault;
641 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800642 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700643
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700644 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700645 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
646 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700647 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700648 lr2.vote = LayerVoteType::ExplicitDefault;
649 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800650 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700651
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700652 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700653 lr1.vote = LayerVoteType::ExplicitDefault;
654 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700655 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700656 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
657 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800658 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700659}
660
Steven Thomasbb374322020-04-28 22:47:16 -0700661TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800662 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800663
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700664 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800665 auto& lr = layers[0];
666
667 lr.vote = LayerVoteType::Min;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800668 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800669
670 lr.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800671 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800672
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700673 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800674 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800678 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800679
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700680 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800681 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800682
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700683 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800684 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800685
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700686 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800687 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688}
689
Steven Thomasbb374322020-04-28 22:47:16 -0700690TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800691 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800692
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700693 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800694 auto& lr = layers[0];
695
696 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800697 lr.name = "Min";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800698 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800699
700 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800702 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800703
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700704 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800705 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800706 lr.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800707 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800708
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700709 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800710 lr.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800711 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -0800712 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800713
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700714 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800715 lr.name = "45Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800716 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -0800717 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800718
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700719 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800720 lr.name = "30Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800721 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -0800722 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800723
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700724 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800725 lr.name = "24Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800726 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -0800727 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800728
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700729 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800730 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
731 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800732 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -0800733 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734}
735
Steven Thomasbb374322020-04-28 22:47:16 -0700736TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800737 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800738
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700739 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800740 auto& lr1 = layers[0];
741 auto& lr2 = layers[1];
742
743 lr1.vote = LayerVoteType::Min;
744 lr2.vote = LayerVoteType::Max;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800745 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800746
747 lr1.vote = LayerVoteType::Min;
748 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700749 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800750 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800751
752 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800753 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700754 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800755 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800756
757 lr1.vote = LayerVoteType::Max;
758 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700759 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800760 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800761
762 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800763 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700764 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -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 = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800769 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700770 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800771 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800772
773 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700774 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800775 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700776 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800777 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800778}
779
Steven Thomasbb374322020-04-28 22:47:16 -0700780TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800781 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800782
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700783 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800784 auto& lr = layers[0];
785
Ady Abraham71c437d2020-01-31 15:56:57 -0800786 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800787 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700788 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800789 const auto refreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800790 EXPECT_EQ(asRefreshRate(kMode60), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700791 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800792 }
793}
794
rnlee3bd610662021-06-23 16:27:57 -0700795TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800796 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
797 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700798
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700799 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700800 auto& lr = layers[0];
801
802 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
803 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700804 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800805 const auto refreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800806 EXPECT_EQ(asRefreshRate(kMode60), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700807 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
rnlee3bd610662021-06-23 16:27:57 -0700808 }
809}
810
Dominik Laskowski0c252702021-12-20 20:32:09 -0800811TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800812 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700814 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815 auto& lr1 = layers[0];
816 auto& lr2 = layers[1];
817
818 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700819 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800820 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700821 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800822 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800823
824 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800826 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700827 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800828 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829
830 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700831 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800832 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700833 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800834 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800835}
836
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800837TEST_F(RefreshRateConfigsTest, testInPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800838 const auto refreshRate =
839 asRefreshRate(createDisplayMode(kModeId60, Fps::fromPeriodNsecs(16'666'665)));
840
841 EXPECT_TRUE(refreshRate.inPolicy(60.000004_Hz, 60.000004_Hz));
842 EXPECT_TRUE(refreshRate.inPolicy(59_Hz, 60.1_Hz));
843 EXPECT_FALSE(refreshRate.inPolicy(75_Hz, 90_Hz));
844 EXPECT_FALSE(refreshRate.inPolicy(60.0011_Hz, 90_Hz));
845 EXPECT_FALSE(refreshRate.inPolicy(50_Hz, 59.998_Hz));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800846}
847
Steven Thomasbb374322020-04-28 22:47:16 -0700848TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800849 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800850
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800852 auto& lr = layers[0];
853
Ady Abraham71c437d2020-01-31 15:56:57 -0800854 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800855 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700856 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800857 const auto refreshRate = configs.getBestRefreshRate(layers, {});
858 EXPECT_EQ(asRefreshRate(kMode90), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700859 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800860 }
861}
862
Steven Thomasbb374322020-04-28 22:47:16 -0700863TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800864 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800865
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700866 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800867 auto& lr1 = layers[0];
868 auto& lr2 = layers[1];
869
870 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700871 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800873 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700874 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800875 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800876 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800877
878 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700879 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800880 lr1.name = "60Hz ExplicitExactOrMultiple";
881 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700882 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800883 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800884 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885
886 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700887 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800888 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800889 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800891 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800892
893 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700894 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800895 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800896 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700897 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800899 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800900
901 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700902 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800903 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800904 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800906 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800907}
908
909TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800910 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800911
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700912 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800913 auto& lr1 = layers[0];
914 auto& lr2 = layers[1];
915
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 Laskowskia8626ec2021-12-15 18:13:30 -0800921 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
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::NoVote;
927 lr2.name = "NoVote";
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, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800936
937 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700938 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800939 lr1.name = "60Hz ExplicitExactOrMultiple";
940 lr2.vote = LayerVoteType::Max;
941 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800942 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800943
944 // The other layer starts to provide buffers
945 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700946 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800947 lr1.name = "60Hz ExplicitExactOrMultiple";
948 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700949 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800950 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800951 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800952}
953
954TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800955 RefreshRateConfigs configs(kModes_60_90, kModeId60);
956
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800957 auto [_, signals] = configs.getBestRefreshRate({}, {});
958 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800959
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800960 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
961 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800962
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700963 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800964 auto& lr1 = layers[0];
965 auto& lr2 = layers[1];
966
967 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700968 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800969 lr1.name = "60Hz ExplicitExactOrMultiple";
970 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700971 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700972 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800973 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
974 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800975
976 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700977 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800978 lr1.name = "60Hz ExplicitExactOrMultiple";
979 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700980 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700981 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800982 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
983 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800984
985 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700986 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800987 lr1.name = "60Hz ExplicitExactOrMultiple";
988 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700989 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700990 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800991 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
992 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800993
994 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700995 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700996 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -0800997 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700998 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700999 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001000 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1001 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001002}
1003
Steven Thomasbb374322020-04-28 22:47:16 -07001004TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001005 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001006
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001007 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001008 auto& lr = layers[0];
1009
1010 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001011 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1012 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001013
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001014 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001015
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001016 {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 -08001017
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001018 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001019
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001020 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001021
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001022 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001023
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001024 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001025
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001026 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001027 };
1028
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001029 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001030 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001031 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001032
1033 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001034 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001035 lr.name = ss.str();
1036
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001037 const auto refreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001038 EXPECT_EQ(refreshRate.getFps(), expected);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001039 }
1040}
1041
1042TEST_F(RefreshRateConfigsTest,
1043 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001044 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001045 auto& lr = layers[0];
1046
1047 // Test that 23.976 will choose 24 if 23.976 is not supported
1048 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001049 TestableRefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60,
1050 kMode60Frac},
1051 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001052
1053 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001054 lr.desiredRefreshRate = 23.976_Hz;
1055 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001056 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001057 }
1058
1059 // Test that 24 will choose 23.976 if 24 is not supported
1060 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001061 TestableRefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1062 kMode60Frac},
1063 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001064
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001065 lr.desiredRefreshRate = 24_Hz;
1066 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001067 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001068 }
1069
1070 // Test that 29.97 will prefer 59.94 over 60 and 30
1071 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001072 TestableRefreshRateConfigs configs({kMode24, kMode24Frac, kMode25, kMode30, kMode60,
1073 kMode60Frac},
1074 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001075
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001076 lr.desiredRefreshRate = 29.97_Hz;
1077 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001078 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001079 }
1080}
1081
1082TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001083 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001084 auto& lr = layers[0];
1085
1086 // Test that voting for supported refresh rate will select this refresh rate
1087 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001088 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 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 +02001091 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001092 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001093 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001094 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001095 lr.name = ss.str();
1096
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001097 auto selectedRefreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001098 EXPECT_EQ(selectedRefreshRate.getFps(), lr.desiredRefreshRate);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001099 }
1100 }
1101
1102 // Test that 23.976 will choose 24 if 23.976 is not supported
1103 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001104 TestableRefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60,
1105 kMode60Frac},
1106 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001107
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001108 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001109 lr.desiredRefreshRate = 23.976_Hz;
1110 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001111 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001112 }
1113
1114 // Test that 24 will choose 23.976 if 24 is not supported
1115 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001116 TestableRefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1117 kMode60Frac},
1118 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001119
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001120 lr.desiredRefreshRate = 24_Hz;
1121 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001122 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers).getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001123 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001124}
1125
Alec Mouri11232a22020-05-14 18:06:25 -07001126TEST_F(RefreshRateConfigsTest,
1127 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001128 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001129
Dominik Laskowski0c252702021-12-20 20:32:09 -08001130 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001131
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001132 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001133 auto& lr = layers[0];
1134
Alec Mouri11232a22020-05-14 18:06:25 -07001135 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001136 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001137 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001138 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001139
1140 const auto [refreshRate, signals] =
1141 configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
1142
1143 EXPECT_EQ(refreshRate, asRefreshRate(kMode60));
1144 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001145}
1146
1147TEST_F(RefreshRateConfigsTest,
1148 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001149 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001150
Dominik Laskowski0c252702021-12-20 20:32:09 -08001151 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001152
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001153 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001154 auto& lr = layers[0];
1155
Alec Mouri11232a22020-05-14 18:06:25 -07001156 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001157 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001158 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001159 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001160 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001161}
1162
1163TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001164 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001165 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001166
Dominik Laskowski0c252702021-12-20 20:32:09 -08001167 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001168
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001169 const auto [refreshRate, signals] = configs.getBestRefreshRateAndSignals({}, {});
1170 EXPECT_EQ(refreshRate, asRefreshRate(kMode90));
1171 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001172
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001173 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001174 auto& lr = layers[0];
1175
1176 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001177 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001178 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001179 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001180 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001181
1182 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001183 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001184
1185 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001186 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001187 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001188 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001189 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001190
1191 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001192 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001193
1194 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001195 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001196 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001197 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001198 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001199
1200 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001201 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001202
1203 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001204 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001205 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001206 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001207 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001208
1209 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001210 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001211
1212 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001213 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001214 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001215 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001216 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001217
1218 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001219 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001220}
1221
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001222TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001223 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001224
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001225 // The default policy doesn't allow group switching. Verify that no
1226 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001227 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001228 auto& layer = layers[0];
1229 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001230 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001231 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001232 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001233 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001234
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001235 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001236}
Steven Thomasd4071902020-03-24 16:02:53 -07001237
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001238TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001239 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1240
Steven Thomasd4071902020-03-24 16:02:53 -07001241 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001242 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001243 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001244 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001245
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001246 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001247 auto& layer = layers[0];
1248 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001249 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001250 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1251 layer.name = "90Hz ExplicitDefault";
1252 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001253 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001254}
1255
1256TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001257 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001258
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001259 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001260 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001261 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001262 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001263
1264 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001265 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001266 auto& layer = layers[0];
1267 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001268 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001269 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001270 layer.name = "90Hz ExplicitDefault";
1271 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001272 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001273}
1274
1275TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001276 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001277
Dominik Laskowski0c252702021-12-20 20:32:09 -08001278 RefreshRateConfigs::Policy policy;
1279 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1280 policy.allowGroupSwitching = true;
1281 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1282
1283 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001284
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001285 // 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 -07001286 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001287 auto& layer = layers[0];
1288 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001289 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001290 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001291 layer.name = "60Hz ExplicitDefault";
1292 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001293 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001294}
1295
1296TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001297 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001298
Dominik Laskowski0c252702021-12-20 20:32:09 -08001299 RefreshRateConfigs::Policy policy;
1300 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1301 policy.allowGroupSwitching = true;
1302 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1303
1304 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001305
1306 // Verify that if the current config is in another group and there are no layers with
1307 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001308
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001309 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001310 auto& layer = layers[0];
1311 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001312 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001313 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001314 layer.name = "60Hz ExplicitDefault";
1315 layer.focused = true;
1316
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001317 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001318}
1319
1320TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001321 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001322
Dominik Laskowski0c252702021-12-20 20:32:09 -08001323 RefreshRateConfigs::Policy policy;
1324 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1325 policy.allowGroupSwitching = true;
1326 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1327
1328 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001329
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001330 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001331 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001332 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001333 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001334 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001335 layers[0].seamlessness = Seamlessness::OnlySeamless;
1336 layers[0].name = "60Hz ExplicitDefault";
1337 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001338
1339 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001340 layers[1].vote = LayerVoteType::ExplicitDefault;
1341 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001342 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001343 layers[1].name = "90Hz ExplicitDefault";
1344 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001345
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001346 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001347}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001348
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001349TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001350 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001351
Dominik Laskowski0c252702021-12-20 20:32:09 -08001352 RefreshRateConfigs::Policy policy;
1353 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1354 policy.allowGroupSwitching = true;
1355 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1356
1357 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001358
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001359 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1360 // seamlessness=Default can't change the mode group back to the group of the default
1361 // mode.
1362 // For example, this may happen when a video playback requests and gets a seamed switch,
1363 // but another layer (with default seamlessness) starts animating. The animating layer
1364 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001365 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001366 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001367 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001368 layers[0].focused = true;
1369 layers[0].vote = LayerVoteType::ExplicitDefault;
1370 layers[0].name = "60Hz ExplicitDefault";
1371
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001372 layers.push_back(LayerRequirement{.weight = 0.1f});
1373 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001374 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001375 layers[1].focused = true;
1376 layers[1].vote = LayerVoteType::ExplicitDefault;
1377 layers[1].name = "90Hz ExplicitDefault";
1378
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001379 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001380}
1381
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001382TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001383 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001384
Dominik Laskowski0c252702021-12-20 20:32:09 -08001385 RefreshRateConfigs::Policy policy;
1386 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1387 policy.allowGroupSwitching = true;
1388 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1389
1390 configs.setCurrentModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001391
1392 // Layer with seamlessness=Default can change the mode group if there's a not
1393 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1394 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001395 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001396 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001397 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001398 layers[0].focused = true;
1399 layers[0].vote = LayerVoteType::ExplicitDefault;
1400 layers[0].name = "60Hz ExplicitDefault";
1401
1402 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001403 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001404 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001405 layers[1].focused = false;
1406 layers[1].vote = LayerVoteType::ExplicitDefault;
1407 layers[1].name = "90Hz ExplicitDefault";
1408
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001409 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001410}
1411
1412TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001413 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001414
1415 // Allow group switching.
1416 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001417 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001418 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001419 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001420
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001421 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001422 auto& layer = layers[0];
1423 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001424 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001425 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001426 layer.name = "60Hz ExplicitExactOrMultiple";
1427 layer.focused = true;
1428
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001429 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001430
Dominik Laskowski0c252702021-12-20 20:32:09 -08001431 configs.setCurrentModeId(kModeId120);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001432 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001433}
1434
1435TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001436 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001437
1438 // Allow group switching.
1439 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001440 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001441 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001442 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001443
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001444 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1445 .vote = LayerVoteType::ExplicitDefault,
1446 .desiredRefreshRate = 60_Hz,
1447 .seamlessness = Seamlessness::SeamedAndSeamless,
1448 .weight = 0.5f,
1449 .focused = false},
1450 {.name = "25Hz ExplicitExactOrMultiple",
1451 .vote = LayerVoteType::ExplicitExactOrMultiple,
1452 .desiredRefreshRate = 25_Hz,
1453 .seamlessness = Seamlessness::OnlySeamless,
1454 .weight = 1.f,
1455 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001456
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001457 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001458
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001459 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001460 seamedLayer.desiredRefreshRate = 30_Hz;
1461 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001462 configs.setCurrentModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001463
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001464 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers).getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001465}
1466
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001467TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001468 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001469
1470 // Allow group switching.
1471 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001472 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001473 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001474 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001475
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001476 std::vector<LayerRequirement> layers = {
1477 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001478
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001479 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001480}
1481
Steven Thomasf734df42020-04-13 21:09:28 -07001482TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001483 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001484
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001485 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001486 layers[0].name = "Test layer";
1487
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001488 struct Args {
1489 bool touch = false;
1490 bool focused = true;
1491 };
1492
Steven Thomasbb374322020-04-28 22:47:16 -07001493 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001494 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001495 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001496 layers[0].vote = voteType;
1497 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001498 layers[0].focused = args.focused;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001499 return configs.getBestRefreshRate(layers, {.touch = args.touch}).getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001500 };
1501
Dominik Laskowski0c252702021-12-20 20:32:09 -08001502 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1503
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001504 EXPECT_EQ(kModeId60, configs.getBestRefreshRate().getModeId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001505 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1506 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1507 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1508 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1509 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1510 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001511
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001512 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001513 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1514 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001515 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001516
Steven Thomasf734df42020-04-13 21:09:28 -07001517 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001518 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1519
Steven Thomasf734df42020-04-13 21:09:28 -07001520 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1521 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001522 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1523 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001524 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001525
Dominik Laskowski0c252702021-12-20 20:32:09 -08001526 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1527
1528 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1529 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1530 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1531 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1532 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1533 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001534}
1535
Steven Thomasbb374322020-04-28 22:47:16 -07001536TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001537 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001538
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001539 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001540 layers[0].name = "Test layer";
1541
Marin Shalamanov23c44202020-12-22 19:09:20 +01001542 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001543 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001544 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001545
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001546 const auto [refreshRate, signals] =
1547 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1548
1549 // Refresh rate will be chosen by either touch state or idle state.
1550 EXPECT_EQ(!touchActive, signals.idle);
1551 return refreshRate.getModeId();
Steven Thomasbb374322020-04-28 22:47:16 -07001552 };
1553
Dominik Laskowski0c252702021-12-20 20:32:09 -08001554 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001555
1556 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001557 {
1558 constexpr bool kTouchActive = true;
1559 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1560 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1561 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1562 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1563 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1564 EXPECT_EQ(kModeId90,
1565 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1566 }
Steven Thomasbb374322020-04-28 22:47:16 -07001567
1568 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001569 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001570
1571 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001572 configs.setCurrentModeId(kModeId90);
1573
1574 {
1575 constexpr bool kTouchActive = false;
1576 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1577 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1578 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1579 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1580 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1581 EXPECT_EQ(kModeId60,
1582 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1583 }
Steven Thomasbb374322020-04-28 22:47:16 -07001584
1585 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001586 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001587}
1588
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001589TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001590 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001591
1592 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001593 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1594 const Fps expectedFrameRate = [fps] {
1595 if (fps < 26.91f) return 24_Hz;
1596 if (fps < 37.51f) return 30_Hz;
1597 if (fps < 52.51f) return 45_Hz;
1598 if (fps < 66.01f) return 60_Hz;
1599 if (fps < 81.01f) return 72_Hz;
1600 return 90_Hz;
1601 }();
1602
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001603 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001604 }
1605}
1606
1607TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001608 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001609
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001610 struct Expectation {
1611 Fps fps;
1612 const RefreshRate& refreshRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001613 };
1614
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001616 {24_Hz, asRefreshRate(kMode60)}, {30_Hz, asRefreshRate(kMode60)},
1617 {45_Hz, asRefreshRate(kMode90)}, {60_Hz, asRefreshRate(kMode60)},
1618 {72_Hz, asRefreshRate(kMode90)}, {90_Hz, asRefreshRate(kMode90)},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001619 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001620
1621 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001622 const auto& knownFrameRates = configs.knownFrameRates();
1623 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001624 knownFrameRatesExpectations.begin(),
1625 [](Fps fps, const Expectation& expected) {
1626 return isApproxEqual(fps, expected.fps);
1627 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001628 EXPECT_TRUE(equal);
1629
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001630 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001631 auto& layer = layers[0];
1632 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001633
1634 for (const auto& [fps, refreshRate] : knownFrameRatesExpectations) {
1635 layer.desiredRefreshRate = fps;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001636 EXPECT_EQ(refreshRate, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001637 }
1638}
1639
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001640TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001641 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001642
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001643 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001644 auto& explicitExactLayer = layers[0];
1645 auto& explicitExactOrMultipleLayer = layers[1];
1646
1647 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1648 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001649 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001650
1651 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1652 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001653 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001654
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001655 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001656 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001657
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001658 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1659 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001660 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001661
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001662 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001663 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001664
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001665 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001666 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001667
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001668 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001669 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001670}
1671
1672TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001673 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1674 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001675
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001676 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001677 auto& explicitExactLayer = layers[0];
1678 auto& explicitExactOrMultipleLayer = layers[1];
1679
1680 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1681 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001682 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001683
1684 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1685 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001686 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001687
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001688 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001689 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001690
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001691 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1692 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001693 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001694
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001695 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001696 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001697
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001698 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001699 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001700
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001701 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001702 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001703}
1704
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001705TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001706 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001707
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001708 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1709 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1710 GlobalSignals{.touch = true, .idle = true});
1711 const auto result = std::make_pair(asRefreshRate(kMode90), GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001712
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001713 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001714
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001715 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001716}
1717
1718TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001719 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1720
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001721 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001722
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001723 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001724 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001725
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001726 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001727
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001728 const auto& cache = configs.mutableGetBestRefreshRateCache();
1729 ASSERT_TRUE(cache);
1730
1731 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1732 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001733}
1734
Ady Abraham5e4e9832021-06-14 13:40:56 -07001735TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001736 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001737
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001738 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001739 auto& explicitExactLayer = layers[0];
1740 auto& explicitExactOrMultipleLayer = layers[1];
1741
1742 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1743 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001744 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001745
1746 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1747 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001748 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001749
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001750 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001751 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001752
1753 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1754
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001755 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001756 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001757}
1758
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001759TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001760 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1761 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001762
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001763 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001764 auto& explicitDefaultLayer = layers[0];
1765 auto& explicitExactOrMultipleLayer = layers[1];
1766
1767 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1768 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001769 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001770
1771 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1772 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001773 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001774
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001775 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001776}
1777
Ady Abraham05243be2021-09-16 15:58:52 -07001778// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001779TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001780 constexpr int kMinRefreshRate = 10;
1781 constexpr int kMaxRefreshRate = 240;
1782
1783 DisplayModes displayModes;
1784 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Ady Abraham05243be2021-09-16 15:58:52 -07001785 displayModes.push_back(
Dominik Laskowski0c252702021-12-20 20:32:09 -08001786 createDisplayMode(DisplayModeId(fps), Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001787 }
1788
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001789 const TestableRefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham05243be2021-09-16 15:58:52 -07001790
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001791 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001792 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1793 layers[0].desiredRefreshRate = fps;
1794 layers[0].vote = vote;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001795 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers).getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001796 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001797 };
1798
1799 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001800 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001801 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1802 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1803 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1804 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1805 }
1806}
1807
Ady Abraham1c595502022-01-13 21:58:32 -08001808// b/190578904
1809TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
1810 const DisplayModes displayModes = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001811 createDisplayMode(DisplayModeId(0), 43_Hz),
1812 createDisplayMode(DisplayModeId(1), 53_Hz),
1813 createDisplayMode(DisplayModeId(2), 55_Hz),
1814 createDisplayMode(DisplayModeId(3), 60_Hz),
Ady Abraham1c595502022-01-13 21:58:32 -08001815 };
1816
1817 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001818 const TestableRefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham1c595502022-01-13 21:58:32 -08001819
Dominik Laskowski0c252702021-12-20 20:32:09 -08001820 const std::vector<LayerRequirement> layers = {
1821 {
Ady Abraham1c595502022-01-13 21:58:32 -08001822 .vote = LayerVoteType::ExplicitDefault,
1823 .desiredRefreshRate = 43_Hz,
1824 .seamlessness = Seamlessness::SeamedAndSeamless,
1825 .weight = 0.41f,
1826 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001827 {
Ady Abraham1c595502022-01-13 21:58:32 -08001828 .vote = LayerVoteType::ExplicitExactOrMultiple,
1829 .desiredRefreshRate = 53_Hz,
1830 .seamlessness = Seamlessness::SeamedAndSeamless,
1831 .weight = 0.41f,
1832 },
1833 };
1834
Dominik Laskowski0c252702021-12-20 20:32:09 -08001835 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals).getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001836}
1837
Ana Krulecb9afd792020-06-11 13:16:15 -07001838TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001839 EXPECT_TRUE(asRefreshRate(kMode60) < asRefreshRate(kMode90));
1840 EXPECT_FALSE(asRefreshRate(kMode60) < asRefreshRate(kMode60));
1841 EXPECT_FALSE(asRefreshRate(kMode90) < asRefreshRate(kMode90));
Ana Krulecb9afd792020-06-11 13:16:15 -07001842}
1843
1844TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001845 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001846
Dominik Laskowski0c252702021-12-20 20:32:09 -08001847 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1848
Ana Krulecb9afd792020-06-11 13:16:15 -07001849 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001850 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001851
1852 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001853 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1854 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001855
Ady Abrahama91605e2021-06-18 11:41:47 -07001856 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001857 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1858 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001859
1860 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001861 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1862 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001863}
1864
TreeHugger Robot758ab612021-06-22 19:17:29 +00001865TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001866 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001867
Dominik Laskowski0c252702021-12-20 20:32:09 -08001868 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1869
TreeHugger Robot758ab612021-06-22 19:17:29 +00001870 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001871 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1872 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001873
1874 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001875 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1876 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001877
1878 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001879 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1880 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001881
1882 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001883 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1884 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001885}
1886
Ady Abraham5cc2e262021-03-25 13:09:17 -07001887TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001888 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001889
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001890 const auto frameRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001891 Fps displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001892 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001893
Dominik Laskowski0c252702021-12-20 20:32:09 -08001894 configs.setCurrentModeId(kModeId60);
1895 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001896 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001897
Dominik Laskowski0c252702021-12-20 20:32:09 -08001898 configs.setCurrentModeId(kModeId72);
1899 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001900 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001901
Dominik Laskowski0c252702021-12-20 20:32:09 -08001902 configs.setCurrentModeId(kModeId90);
1903 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001904 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001905
Dominik Laskowski0c252702021-12-20 20:32:09 -08001906 configs.setCurrentModeId(kModeId120);
1907 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abraham5cc2e262021-03-25 13:09:17 -07001908 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001909
Dominik Laskowski0c252702021-12-20 20:32:09 -08001910 configs.setCurrentModeId(kModeId90);
1911 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001912 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001913
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001914 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 25_Hz));
1915 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 23.976_Hz));
1916 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(30_Hz, 29.97_Hz));
1917 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001918}
1919
1920TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001921 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1922 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001923
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001924 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1925 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001926
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001927 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1928 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001929
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001930 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1931 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001932
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001933 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1934 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001935
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001936 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 +02001937 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001938 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001939 }
1940
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001941 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1942 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1943 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001944}
1945
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001946TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001947 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001948
Dominik Laskowski0c252702021-12-20 20:32:09 -08001949 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001950}
1951
1952TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001953 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1954 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001955
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001956 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001957 layers[0].name = "Test layer";
1958 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001959 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001960 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001961
1962 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1963 EXPECT_EQ(1u, frameRateOverrides.size());
1964 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1965 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001966
1967 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001968 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1969 EXPECT_EQ(1u, frameRateOverrides.size());
1970 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1971 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001972
1973 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001974 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1975 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001976
1977 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001978 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1979 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001980
1981 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001982 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1983 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001984
1985 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001986 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1987 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001988}
1989
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001990TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001991 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1992 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001993
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001994 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
1995 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001996
1997 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001998 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001999 layers[0].vote = LayerVoteType::ExplicitDefault;
2000
2001 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002002 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002003 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002004 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002005
Dominik Laskowski0c252702021-12-20 20:32:09 -08002006 EXPECT_EQ(2u, frameRateOverrides.size());
2007 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2008 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2009 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2010 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002011
2012 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002013 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2014 EXPECT_EQ(1u, frameRateOverrides.size());
2015 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2016 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002017
2018 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002019 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2020 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002021}
2022
2023TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002024 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2025 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002026
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002027 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002028 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002029 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002030 layers[0].vote = LayerVoteType::ExplicitDefault;
2031
Dominik Laskowski0c252702021-12-20 20:32:09 -08002032 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2033 EXPECT_EQ(1u, frameRateOverrides.size());
2034 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2035 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002036
Dominik Laskowski0c252702021-12-20 20:32:09 -08002037 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2038 EXPECT_EQ(1u, frameRateOverrides.size());
2039 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2040 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002041
2042 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002043 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2044 EXPECT_EQ(1u, frameRateOverrides.size());
2045 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2046 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002047
Dominik Laskowski0c252702021-12-20 20:32:09 -08002048 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2049 EXPECT_EQ(1u, frameRateOverrides.size());
2050 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2051 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002052
2053 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002054 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2055 EXPECT_EQ(1u, frameRateOverrides.size());
2056 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2057 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002058
Dominik Laskowski0c252702021-12-20 20:32:09 -08002059 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2060 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002061}
2062
Alec Mouri0a1cc962019-03-14 12:33:02 -07002063} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002064} // namespace android::scheduler