blob: 97f3747d0775340a9c4b7069c57182b9bb128834 [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
Steven Thomasbb374322020-04-28 22:47:16 -0700837TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800838 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800839
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700840 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800841 auto& lr = layers[0];
842
Ady Abraham71c437d2020-01-31 15:56:57 -0800843 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800844 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700845 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800846 const auto refreshRate = configs.getBestRefreshRate(layers, {});
847 EXPECT_EQ(asRefreshRate(kMode90), refreshRate)
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700848 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800849 }
850}
851
Steven Thomasbb374322020-04-28 22:47:16 -0700852TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800853 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800854
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700855 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800856 auto& lr1 = layers[0];
857 auto& lr2 = layers[1];
858
859 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700860 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800861 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800862 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700863 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800864 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800865 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800866
867 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700868 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800869 lr1.name = "60Hz ExplicitExactOrMultiple";
870 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700871 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800873 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800874
875 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700876 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800877 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800878 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800879 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800880 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800881
882 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700883 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800884 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800885 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700886 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800887 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800888 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800889
890 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700891 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800892 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800893 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800894 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800895 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800896}
897
898TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800899 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700901 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902 auto& lr1 = layers[0];
903 auto& lr2 = layers[1];
904
905 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700906 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800907 lr1.name = "60Hz ExplicitExactOrMultiple";
908 lr2.vote = LayerVoteType::NoVote;
909 lr2.name = "NoVote";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800910 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800911
912 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700913 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800914 lr1.name = "60Hz ExplicitExactOrMultiple";
915 lr2.vote = LayerVoteType::NoVote;
916 lr2.name = "NoVote";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800917 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800918
919 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700920 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800921 lr1.name = "60Hz ExplicitExactOrMultiple";
922 lr2.vote = LayerVoteType::Max;
923 lr2.name = "Max";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800924 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800925
926 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700927 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800928 lr1.name = "60Hz ExplicitExactOrMultiple";
929 lr2.vote = LayerVoteType::Max;
930 lr2.name = "Max";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800931 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800932
933 // The other layer starts to provide buffers
934 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700935 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800936 lr1.name = "60Hz ExplicitExactOrMultiple";
937 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700938 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800939 lr2.name = "90Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800940 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800941}
942
943TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800944 RefreshRateConfigs configs(kModes_60_90, kModeId60);
945
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800946 auto [_, signals] = configs.getBestRefreshRate({}, {});
947 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800948
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800949 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
950 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800951
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700952 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800953 auto& lr1 = layers[0];
954 auto& lr2 = layers[1];
955
956 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700957 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800958 lr1.name = "60Hz ExplicitExactOrMultiple";
959 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700960 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700961 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800962 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
963 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800964
965 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700966 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800967 lr1.name = "60Hz ExplicitExactOrMultiple";
968 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700969 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700970 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800971 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
972 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800973
974 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700975 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800976 lr1.name = "60Hz ExplicitExactOrMultiple";
977 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700978 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700979 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800980 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
981 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800982
983 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700984 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700985 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -0800986 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700987 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700988 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800989 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
990 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -0800991}
992
Steven Thomasbb374322020-04-28 22:47:16 -0700993TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800994 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800995
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700996 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -0800997 auto& lr = layers[0];
998
999 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001000 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1001 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001002
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001003 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001004
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001005 {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 -08001006
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001007 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001008
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001009 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001010
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001011 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001012
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001013 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001014
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001015 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001016 };
1017
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001018 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001019 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001020 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001021
1022 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001023 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001024 lr.name = ss.str();
1025
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001026 const auto refreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001027 EXPECT_EQ(refreshRate.getFps(), expected);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001028 }
1029}
1030
1031TEST_F(RefreshRateConfigsTest,
1032 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001033 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001034 auto& lr = layers[0];
1035
1036 // Test that 23.976 will choose 24 if 23.976 is not supported
1037 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001038 TestableRefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60,
1039 kMode60Frac},
1040 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001041
1042 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001043 lr.desiredRefreshRate = 23.976_Hz;
1044 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001045 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001046 }
1047
1048 // Test that 24 will choose 23.976 if 24 is not supported
1049 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001050 TestableRefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1051 kMode60Frac},
1052 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001053
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001054 lr.desiredRefreshRate = 24_Hz;
1055 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001056 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001057 }
1058
1059 // Test that 29.97 will prefer 59.94 over 60 and 30
1060 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001061 TestableRefreshRateConfigs configs({kMode24, kMode24Frac, kMode25, kMode30, kMode60,
1062 kMode60Frac},
1063 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001064
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001065 lr.desiredRefreshRate = 29.97_Hz;
1066 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001067 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001068 }
1069}
1070
1071TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001072 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001073 auto& lr = layers[0];
1074
1075 // Test that voting for supported refresh rate will select this refresh rate
1076 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001077 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001078
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001079 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 +02001080 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001081 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001082 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001083 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001084 lr.name = ss.str();
1085
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001086 auto selectedRefreshRate = configs.getBestRefreshRate(layers);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001087 EXPECT_EQ(selectedRefreshRate.getFps(), lr.desiredRefreshRate);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001088 }
1089 }
1090
1091 // Test that 23.976 will choose 24 if 23.976 is not supported
1092 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001093 TestableRefreshRateConfigs configs({kMode24, kMode25, kMode30, kMode30Frac, kMode60,
1094 kMode60Frac},
1095 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001096
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001097 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001098 lr.desiredRefreshRate = 23.976_Hz;
1099 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001100 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001101 }
1102
1103 // Test that 24 will choose 23.976 if 24 is not supported
1104 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001105 TestableRefreshRateConfigs configs({kMode24Frac, kMode25, kMode30, kMode30Frac, kMode60,
1106 kMode60Frac},
1107 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001108
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001109 lr.desiredRefreshRate = 24_Hz;
1110 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001111 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers).getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001112 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001113}
1114
Alec Mouri11232a22020-05-14 18:06:25 -07001115TEST_F(RefreshRateConfigsTest,
1116 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001117 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001118
Dominik Laskowski0c252702021-12-20 20:32:09 -08001119 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001120
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001121 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001122 auto& lr = layers[0];
1123
Alec Mouri11232a22020-05-14 18:06:25 -07001124 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001125 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001126 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001127 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001128
1129 const auto [refreshRate, signals] =
1130 configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
1131
1132 EXPECT_EQ(refreshRate, asRefreshRate(kMode60));
1133 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001134}
1135
1136TEST_F(RefreshRateConfigsTest,
1137 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001138 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001139
Dominik Laskowski0c252702021-12-20 20:32:09 -08001140 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001141
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001142 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001143 auto& lr = layers[0];
1144
Alec Mouri11232a22020-05-14 18:06:25 -07001145 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001146 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001147 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001148 lr.focused = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001149 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001150}
1151
1152TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001153 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001154 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001155
Dominik Laskowski0c252702021-12-20 20:32:09 -08001156 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001157
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001158 const auto [refreshRate, signals] = configs.getBestRefreshRateAndSignals({}, {});
1159 EXPECT_EQ(refreshRate, asRefreshRate(kMode90));
1160 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001161
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001162 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001163 auto& lr = layers[0];
1164
1165 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001166 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001167 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001168 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001169 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001170
1171 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001172 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001173
1174 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001175 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001176 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001177 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001178 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001179
1180 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001181 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001182
1183 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001184 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001185 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001186 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001187 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001188
1189 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001190 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001191
1192 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001193 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001194 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001195 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001196 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001197
1198 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001199 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001200
1201 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001202 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001203 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001204 lr.focused = false;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001205 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001206
1207 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001208 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001209}
1210
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001211TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001212 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001213
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001214 // The default policy doesn't allow group switching. Verify that no
1215 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001216 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001217 auto& layer = layers[0];
1218 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001219 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001220 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001221 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001222 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001223
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001224 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001225}
Steven Thomasd4071902020-03-24 16:02:53 -07001226
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001227TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001228 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1229
Steven Thomasd4071902020-03-24 16:02:53 -07001230 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001231 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001232 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001233 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001234
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001235 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001236 auto& layer = layers[0];
1237 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001238 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001239 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1240 layer.name = "90Hz ExplicitDefault";
1241 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001242 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001243}
1244
1245TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001246 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001247
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001248 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001249 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001250 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001251 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001252
1253 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001254 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001255 auto& layer = layers[0];
1256 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001257 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001258 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001259 layer.name = "90Hz ExplicitDefault";
1260 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001261 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001262}
1263
1264TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001265 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001266
Dominik Laskowski0c252702021-12-20 20:32:09 -08001267 RefreshRateConfigs::Policy policy;
1268 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1269 policy.allowGroupSwitching = true;
1270 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1271
1272 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001273
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001274 // Verify that we won't do a seamless switch if we request the same mode as the default
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001275 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001276 auto& layer = layers[0];
1277 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001278 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001279 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001280 layer.name = "60Hz ExplicitDefault";
1281 layer.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001282 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001283}
1284
1285TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001286 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001287
Dominik Laskowski0c252702021-12-20 20:32:09 -08001288 RefreshRateConfigs::Policy policy;
1289 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1290 policy.allowGroupSwitching = true;
1291 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1292
1293 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001294
1295 // Verify that if the current config is in another group and there are no layers with
1296 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001298 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001299 auto& layer = layers[0];
1300 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001302 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001303 layer.name = "60Hz ExplicitDefault";
1304 layer.focused = true;
1305
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001306 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001307}
1308
1309TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001310 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001311
Dominik Laskowski0c252702021-12-20 20:32:09 -08001312 RefreshRateConfigs::Policy policy;
1313 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1314 policy.allowGroupSwitching = true;
1315 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1316
1317 configs.setCurrentModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001318
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001319 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001320 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001321 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001322 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001323 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001324 layers[0].seamlessness = Seamlessness::OnlySeamless;
1325 layers[0].name = "60Hz ExplicitDefault";
1326 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001327
1328 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001329 layers[1].vote = LayerVoteType::ExplicitDefault;
1330 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001331 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001332 layers[1].name = "90Hz ExplicitDefault";
1333 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001334
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001335 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001336}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001337
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001338TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001339 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001340
Dominik Laskowski0c252702021-12-20 20:32:09 -08001341 RefreshRateConfigs::Policy policy;
1342 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1343 policy.allowGroupSwitching = true;
1344 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1345
1346 configs.setCurrentModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001347
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001348 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1349 // seamlessness=Default can't change the mode group back to the group of the default
1350 // mode.
1351 // For example, this may happen when a video playback requests and gets a seamed switch,
1352 // but another layer (with default seamlessness) starts animating. The animating layer
1353 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001354 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001355 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001356 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001357 layers[0].focused = true;
1358 layers[0].vote = LayerVoteType::ExplicitDefault;
1359 layers[0].name = "60Hz ExplicitDefault";
1360
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001361 layers.push_back(LayerRequirement{.weight = 0.1f});
1362 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001363 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001364 layers[1].focused = true;
1365 layers[1].vote = LayerVoteType::ExplicitDefault;
1366 layers[1].name = "90Hz ExplicitDefault";
1367
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001368 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001369}
1370
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001371TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001372 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001373
Dominik Laskowski0c252702021-12-20 20:32:09 -08001374 RefreshRateConfigs::Policy policy;
1375 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1376 policy.allowGroupSwitching = true;
1377 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1378
1379 configs.setCurrentModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001380
1381 // Layer with seamlessness=Default can change the mode group if there's a not
1382 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1383 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001384 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001385 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001386 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001387 layers[0].focused = true;
1388 layers[0].vote = LayerVoteType::ExplicitDefault;
1389 layers[0].name = "60Hz ExplicitDefault";
1390
1391 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001392 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001393 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001394 layers[1].focused = false;
1395 layers[1].vote = LayerVoteType::ExplicitDefault;
1396 layers[1].name = "90Hz ExplicitDefault";
1397
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001398 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001399}
1400
1401TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001402 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001403
1404 // Allow group switching.
1405 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001406 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001407 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001408 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001409
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001410 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001411 auto& layer = layers[0];
1412 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001413 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001414 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001415 layer.name = "60Hz ExplicitExactOrMultiple";
1416 layer.focused = true;
1417
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001418 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001419
Dominik Laskowski0c252702021-12-20 20:32:09 -08001420 configs.setCurrentModeId(kModeId120);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001421 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001422}
1423
1424TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001425 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001426
1427 // Allow group switching.
1428 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001429 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001430 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001431 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001432
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001433 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1434 .vote = LayerVoteType::ExplicitDefault,
1435 .desiredRefreshRate = 60_Hz,
1436 .seamlessness = Seamlessness::SeamedAndSeamless,
1437 .weight = 0.5f,
1438 .focused = false},
1439 {.name = "25Hz ExplicitExactOrMultiple",
1440 .vote = LayerVoteType::ExplicitExactOrMultiple,
1441 .desiredRefreshRate = 25_Hz,
1442 .seamlessness = Seamlessness::OnlySeamless,
1443 .weight = 1.f,
1444 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001445
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001446 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001447
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001448 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001449 seamedLayer.desiredRefreshRate = 30_Hz;
1450 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowski0c252702021-12-20 20:32:09 -08001451 configs.setCurrentModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001452
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001453 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers).getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001454}
1455
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001456TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001457 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001458
1459 // Allow group switching.
1460 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001461 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001462 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001463 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001464
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001465 std::vector<LayerRequirement> layers = {
1466 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001467
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001468 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers).getModeId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001469}
1470
Steven Thomasf734df42020-04-13 21:09:28 -07001471TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001472 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001473
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001474 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001475 layers[0].name = "Test layer";
1476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001477 struct Args {
1478 bool touch = false;
1479 bool focused = true;
1480 };
1481
Steven Thomasbb374322020-04-28 22:47:16 -07001482 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001483 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001484 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001485 layers[0].vote = voteType;
1486 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001487 layers[0].focused = args.focused;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001488 return configs.getBestRefreshRate(layers, {.touch = args.touch}).getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001489 };
1490
Dominik Laskowski0c252702021-12-20 20:32:09 -08001491 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1492
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001493 EXPECT_EQ(kModeId60, configs.getBestRefreshRate().getModeId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001494 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1495 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1496 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1497 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1498 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1499 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001500
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001501 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001502 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1503 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001504 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001505
Steven Thomasf734df42020-04-13 21:09:28 -07001506 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001507 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1508
Steven Thomasf734df42020-04-13 21:09:28 -07001509 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1510 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001511 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1512 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001513 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001514
Dominik Laskowski0c252702021-12-20 20:32:09 -08001515 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1516
1517 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1518 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1519 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1520 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1521 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1522 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001523}
1524
Steven Thomasbb374322020-04-28 22:47:16 -07001525TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001526 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001527
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001528 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001529 layers[0].name = "Test layer";
1530
Marin Shalamanov23c44202020-12-22 19:09:20 +01001531 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001532 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001533 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001534
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001535 const auto [refreshRate, signals] =
1536 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1537
1538 // Refresh rate will be chosen by either touch state or idle state.
1539 EXPECT_EQ(!touchActive, signals.idle);
1540 return refreshRate.getModeId();
Steven Thomasbb374322020-04-28 22:47:16 -07001541 };
1542
Dominik Laskowski0c252702021-12-20 20:32:09 -08001543 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001544
1545 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001546 {
1547 constexpr bool kTouchActive = true;
1548 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1549 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1550 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1551 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1552 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1553 EXPECT_EQ(kModeId90,
1554 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1555 }
Steven Thomasbb374322020-04-28 22:47:16 -07001556
1557 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001558 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001559
1560 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001561 configs.setCurrentModeId(kModeId90);
1562
1563 {
1564 constexpr bool kTouchActive = false;
1565 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1566 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1567 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1568 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1569 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1570 EXPECT_EQ(kModeId60,
1571 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1572 }
Steven Thomasbb374322020-04-28 22:47:16 -07001573
1574 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001575 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001576}
1577
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001578TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001579 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001580
1581 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001582 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1583 const Fps expectedFrameRate = [fps] {
1584 if (fps < 26.91f) return 24_Hz;
1585 if (fps < 37.51f) return 30_Hz;
1586 if (fps < 52.51f) return 45_Hz;
1587 if (fps < 66.01f) return 60_Hz;
1588 if (fps < 81.01f) return 72_Hz;
1589 return 90_Hz;
1590 }();
1591
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001592 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001593 }
1594}
1595
1596TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001597 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001598
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001599 struct Expectation {
1600 Fps fps;
1601 const RefreshRate& refreshRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001602 };
1603
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001604 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001605 {24_Hz, asRefreshRate(kMode60)}, {30_Hz, asRefreshRate(kMode60)},
1606 {45_Hz, asRefreshRate(kMode90)}, {60_Hz, asRefreshRate(kMode60)},
1607 {72_Hz, asRefreshRate(kMode90)}, {90_Hz, asRefreshRate(kMode90)},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001608 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001609
1610 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001611 const auto& knownFrameRates = configs.knownFrameRates();
1612 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001613 knownFrameRatesExpectations.begin(),
1614 [](Fps fps, const Expectation& expected) {
1615 return isApproxEqual(fps, expected.fps);
1616 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001617 EXPECT_TRUE(equal);
1618
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001619 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001620 auto& layer = layers[0];
1621 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001622
1623 for (const auto& [fps, refreshRate] : knownFrameRatesExpectations) {
1624 layer.desiredRefreshRate = fps;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001625 EXPECT_EQ(refreshRate, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001626 }
1627}
1628
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001629TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001630 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001631
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001632 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001633 auto& explicitExactLayer = layers[0];
1634 auto& explicitExactOrMultipleLayer = layers[1];
1635
1636 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1637 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001638 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001639
1640 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1641 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001642 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001643
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001644 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001645 EXPECT_EQ(asRefreshRate(kMode30), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001646
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001647 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1648 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001649 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001650
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001651 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001652 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001653
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001654 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001655 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001656
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001657 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001658 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001659}
1660
1661TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001662 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1663 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001664
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001665 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001666 auto& explicitExactLayer = layers[0];
1667 auto& explicitExactOrMultipleLayer = layers[1];
1668
1669 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1670 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001671 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001672
1673 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1674 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001675 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001676
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001677 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001678 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001679
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001680 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1681 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001682 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001683
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001684 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001685 EXPECT_EQ(asRefreshRate(kMode72), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001686
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001687 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001688 EXPECT_EQ(asRefreshRate(kMode90), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001689
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001690 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001691 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001692}
1693
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001694TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001695 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001696
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001697 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1698 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1699 GlobalSignals{.touch = true, .idle = true});
1700 const auto result = std::make_pair(asRefreshRate(kMode90), GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001701
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001702 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001703
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001704 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001705}
1706
1707TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001708 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1709
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001710 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001711
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001712 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001713 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001714
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001715 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001716
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001717 const auto& cache = configs.mutableGetBestRefreshRateCache();
1718 ASSERT_TRUE(cache);
1719
1720 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1721 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001722}
1723
Ady Abraham5e4e9832021-06-14 13:40:56 -07001724TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001725 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001726
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001727 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001728 auto& explicitExactLayer = layers[0];
1729 auto& explicitExactOrMultipleLayer = layers[1];
1730
1731 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1732 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001733 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001734
1735 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1736 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001737 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001738
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001739 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001740 EXPECT_EQ(asRefreshRate(kMode120), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001741
1742 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1743
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001744 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001745 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001746}
1747
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001748TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001749 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1750 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001751
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001752 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001753 auto& explicitDefaultLayer = layers[0];
1754 auto& explicitExactOrMultipleLayer = layers[1];
1755
1756 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1757 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001758 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001759
1760 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1761 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001762 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001763
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001764 EXPECT_EQ(asRefreshRate(kMode60), configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001765}
1766
Ady Abraham05243be2021-09-16 15:58:52 -07001767// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001768TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001769 constexpr int kMinRefreshRate = 10;
1770 constexpr int kMaxRefreshRate = 240;
1771
1772 DisplayModes displayModes;
1773 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Ady Abraham05243be2021-09-16 15:58:52 -07001774 displayModes.push_back(
Dominik Laskowski0c252702021-12-20 20:32:09 -08001775 createDisplayMode(DisplayModeId(fps), Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001776 }
1777
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001778 const TestableRefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham05243be2021-09-16 15:58:52 -07001779
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001780 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001781 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1782 layers[0].desiredRefreshRate = fps;
1783 layers[0].vote = vote;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001784 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers).getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001785 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001786 };
1787
1788 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001789 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001790 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1791 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1792 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1793 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1794 }
1795}
1796
Ady Abraham1c595502022-01-13 21:58:32 -08001797// b/190578904
1798TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
1799 const DisplayModes displayModes = {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001800 createDisplayMode(DisplayModeId(0), 43_Hz),
1801 createDisplayMode(DisplayModeId(1), 53_Hz),
1802 createDisplayMode(DisplayModeId(2), 55_Hz),
1803 createDisplayMode(DisplayModeId(3), 60_Hz),
Ady Abraham1c595502022-01-13 21:58:32 -08001804 };
1805
1806 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001807 const TestableRefreshRateConfigs configs(displayModes, displayModes[0]->getId());
Ady Abraham1c595502022-01-13 21:58:32 -08001808
Dominik Laskowski0c252702021-12-20 20:32:09 -08001809 const std::vector<LayerRequirement> layers = {
1810 {
Ady Abraham1c595502022-01-13 21:58:32 -08001811 .vote = LayerVoteType::ExplicitDefault,
1812 .desiredRefreshRate = 43_Hz,
1813 .seamlessness = Seamlessness::SeamedAndSeamless,
1814 .weight = 0.41f,
1815 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001816 {
Ady Abraham1c595502022-01-13 21:58:32 -08001817 .vote = LayerVoteType::ExplicitExactOrMultiple,
1818 .desiredRefreshRate = 53_Hz,
1819 .seamlessness = Seamlessness::SeamedAndSeamless,
1820 .weight = 0.41f,
1821 },
1822 };
1823
Dominik Laskowski0c252702021-12-20 20:32:09 -08001824 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals).getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001825}
1826
Ana Krulecb9afd792020-06-11 13:16:15 -07001827TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001828 EXPECT_TRUE(asRefreshRate(kMode60) < asRefreshRate(kMode90));
1829 EXPECT_FALSE(asRefreshRate(kMode60) < asRefreshRate(kMode60));
1830 EXPECT_FALSE(asRefreshRate(kMode90) < asRefreshRate(kMode90));
Ana Krulecb9afd792020-06-11 13:16:15 -07001831}
1832
1833TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001834 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001835
Dominik Laskowski0c252702021-12-20 20:32:09 -08001836 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1837
Ana Krulecb9afd792020-06-11 13:16:15 -07001838 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001839 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001840
1841 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001842 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1843 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001844
Ady Abrahama91605e2021-06-18 11:41:47 -07001845 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001846 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1847 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001848
1849 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001850 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1851 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001852}
1853
TreeHugger Robot758ab612021-06-22 19:17:29 +00001854TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001855 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001856
Dominik Laskowski0c252702021-12-20 20:32:09 -08001857 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1858
TreeHugger Robot758ab612021-06-22 19:17:29 +00001859 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001860 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1861 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001862
1863 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001864 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1865 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001866
1867 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001868 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1869 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001870
1871 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001872 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1873 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001874}
1875
Ady Abrahamcc315492022-02-17 17:06:39 -08001876TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001877 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001878
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001879 const auto frameRate = 30_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001880 Fps displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001881 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001882
Dominik Laskowski0c252702021-12-20 20:32:09 -08001883 configs.setCurrentModeId(kModeId60);
1884 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001885 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001886
Dominik Laskowski0c252702021-12-20 20:32:09 -08001887 configs.setCurrentModeId(kModeId72);
1888 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001889 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001890
Dominik Laskowski0c252702021-12-20 20:32:09 -08001891 configs.setCurrentModeId(kModeId90);
1892 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001893 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001894
Dominik Laskowski0c252702021-12-20 20:32:09 -08001895 configs.setCurrentModeId(kModeId120);
1896 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001897 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001898
Dominik Laskowski0c252702021-12-20 20:32:09 -08001899 configs.setCurrentModeId(kModeId90);
1900 displayRefreshRate = configs.getCurrentRefreshRate().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001901 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001902
Ady Abrahamcc315492022-02-17 17:06:39 -08001903 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
1904 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
1905 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
1906 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001907}
1908
1909TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001910 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1911 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001912
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001913 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1914 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001915
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001916 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1917 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001918
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001919 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1920 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001921
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001922 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1923 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001924
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001925 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 +02001926 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001927 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001928 }
1929
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001930 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1931 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1932 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001933}
1934
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001935TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001936 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001937
Dominik Laskowski0c252702021-12-20 20:32:09 -08001938 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001939}
1940
1941TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001942 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1943 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001944
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001945 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001946 layers[0].name = "Test layer";
1947 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001948 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001949 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001950
1951 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1952 EXPECT_EQ(1u, frameRateOverrides.size());
1953 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1954 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001955
1956 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001957 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1958 EXPECT_EQ(1u, frameRateOverrides.size());
1959 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1960 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001961
1962 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001963 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1964 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001965
1966 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001967 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1968 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001969
1970 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001971 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1972 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001973
1974 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001975 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1976 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001977}
1978
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001979TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001980 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1981 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001982
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001983 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
1984 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001985
1986 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001987 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001988 layers[0].vote = LayerVoteType::ExplicitDefault;
1989
1990 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001991 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001992 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001993 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08001994
Dominik Laskowski0c252702021-12-20 20:32:09 -08001995 EXPECT_EQ(2u, frameRateOverrides.size());
1996 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1997 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
1998 ASSERT_EQ(1u, frameRateOverrides.count(5678));
1999 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002000
2001 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002002 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2003 EXPECT_EQ(1u, frameRateOverrides.size());
2004 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2005 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002006
2007 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002008 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2009 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002010}
2011
2012TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002013 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2014 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002015
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002016 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002017 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002018 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002019 layers[0].vote = LayerVoteType::ExplicitDefault;
2020
Dominik Laskowski0c252702021-12-20 20:32:09 -08002021 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2022 EXPECT_EQ(1u, frameRateOverrides.size());
2023 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2024 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002025
Dominik Laskowski0c252702021-12-20 20:32:09 -08002026 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2027 EXPECT_EQ(1u, frameRateOverrides.size());
2028 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2029 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002030
2031 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002032 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::ExplicitExactOrMultiple;
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_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002050}
2051
Alec Mouri0a1cc962019-03-14 12:33:02 -07002052} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002053} // namespace android::scheduler