blob: 1484bcd12b5b73b2745f7afe6bf780dcb366f339 [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "SchedulerUnittests"
19
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070020#include <ftl/enum.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#include <gmock/gmock.h>
22#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010023#include <ui/Size.h>
24
Alec Mouri0a1cc962019-03-14 12:33:02 -070025#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070026#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070027#include "Scheduler/RefreshRateConfigs.h"
Dominik Laskowskib0054a22022-03-03 09:03:06 -080028#include "mock/DisplayHardware/MockDisplayMode.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070029
30using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070031
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070032namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
Peiyong Line9d809e2020-04-14 13:10:48 -070034namespace hal = android::hardware::graphics::composer::hal;
35
Ady Abraham8a82ba62020-01-17 12:43:17 -080036using LayerVoteType = RefreshRateConfigs::LayerVoteType;
37using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070038
Dominik Laskowskib0054a22022-03-03 09:03:06 -080039using mock::createDisplayMode;
40
Dominik Laskowski0c252702021-12-20 20:32:09 -080041struct TestableRefreshRateConfigs : RefreshRateConfigs {
42 using RefreshRateConfigs::RefreshRateConfigs;
43
Dominik Laskowskib0054a22022-03-03 09:03:06 -080044 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080045 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080046 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080047 }
48
Dominik Laskowskib0054a22022-03-03 09:03:06 -080049 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080050 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080051 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080052 }
53
Dominik Laskowskib0054a22022-03-03 09:03:06 -080054 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080055 std::lock_guard lock(mLock);
56 return getMinRefreshRateByPolicyLocked();
57 }
58
59 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
60
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080061 using RefreshRateConfigs::GetBestRefreshRateCache;
62 auto& mutableGetBestRefreshRateCache() { return mGetBestRefreshRateCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080063
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080064 auto getBestRefreshRateAndSignals(const std::vector<LayerRequirement>& layers,
65 GlobalSignals signals) const {
66 return RefreshRateConfigs::getBestRefreshRate(layers, signals);
67 }
68
Dominik Laskowskib0054a22022-03-03 09:03:06 -080069 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
70 GlobalSignals signals = {}) const {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080071 return getBestRefreshRateAndSignals(layers, signals).first;
Dominik Laskowski0c252702021-12-20 20:32:09 -080072 }
73};
74
Alec Mouri0a1cc962019-03-14 12:33:02 -070075class RefreshRateConfigsTest : public testing::Test {
76protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070077 RefreshRateConfigsTest();
78 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070079
Dominik Laskowski0c252702021-12-20 20:32:09 -080080 static constexpr DisplayModeId kModeId60{0};
81 static constexpr DisplayModeId kModeId90{1};
82 static constexpr DisplayModeId kModeId72{2};
83 static constexpr DisplayModeId kModeId120{3};
84 static constexpr DisplayModeId kModeId30{4};
85 static constexpr DisplayModeId kModeId25{5};
86 static constexpr DisplayModeId kModeId50{6};
87 static constexpr DisplayModeId kModeId24{7};
88 static constexpr DisplayModeId kModeId24Frac{8};
89 static constexpr DisplayModeId kModeId30Frac{9};
90 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -070091
Dominik Laskowski0c252702021-12-20 20:32:09 -080092 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
93 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
94 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
95 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
96 static inline const DisplayModePtr kMode90_4K =
97 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
98 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
99 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
100 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
101 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
102 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
103 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
104 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
105 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
106 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
107 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
108 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
109 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700110
Dominik Laskowski0c252702021-12-20 20:32:09 -0800111 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800112 static inline const DisplayModes kModes_60 = makeModes(kMode60);
113 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
114 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
115 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
116 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
117 static inline const DisplayModes kModes_60_90_72_120 =
118 makeModes(kMode60, kMode90, kMode72, kMode120);
119 static inline const DisplayModes kModes_30_60_72_90_120 =
120 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100121
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800122 static inline const DisplayModes kModes_30_60 =
123 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
124 static inline const DisplayModes kModes_30_60_72_90 =
125 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
126 static inline const DisplayModes kModes_30_60_90 =
127 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
128 static inline const DisplayModes kModes_25_30_50_60 =
129 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
130 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700131
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200132 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800133 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
134 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
135 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700136};
137
138RefreshRateConfigsTest::RefreshRateConfigsTest() {
139 const ::testing::TestInfo* const test_info =
140 ::testing::UnitTest::GetInstance()->current_test_info();
141 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
142}
143
144RefreshRateConfigsTest::~RefreshRateConfigsTest() {
145 const ::testing::TestInfo* const test_info =
146 ::testing::UnitTest::GetInstance()->current_test_info();
147 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
148}
149
150namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700151
Dominik Laskowski0c252702021-12-20 20:32:09 -0800152TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
153 RefreshRateConfigs configs(kModes_60, kModeId60);
154 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700155}
156
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100157TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800158 RefreshRateConfigs configs(kModes_60, kModeId60);
159 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
160 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100161}
162
Dominik Laskowski0c252702021-12-20 20:32:09 -0800163TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
164 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700165
Dominik Laskowski0c252702021-12-20 20:32:09 -0800166 const auto minRate = configs.getMinSupportedRefreshRate();
167 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700168
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800169 EXPECT_EQ(kMode60, minRate);
170 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800171
Dominik Laskowski0c252702021-12-20 20:32:09 -0800172 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
173 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
174
175 EXPECT_EQ(minRateByPolicy, minRate);
176 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700177}
Ady Abraham2139f732019-11-13 18:56:40 -0800178
Dominik Laskowski0c252702021-12-20 20:32:09 -0800179TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
180 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800181
Dominik Laskowski0c252702021-12-20 20:32:09 -0800182 const auto minRate = configs.getMinRefreshRateByPolicy();
183 const auto performanceRate = configs.getMaxSupportedRefreshRate();
184 const auto minRate60 = configs.getMinRefreshRateByPolicy();
185 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800186
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800187 EXPECT_EQ(kMode60, minRate);
188 EXPECT_EQ(kMode60, minRate60);
189 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800190
Dominik Laskowski0c252702021-12-20 20:32:09 -0800191 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800192 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800193
Dominik Laskowski0c252702021-12-20 20:32:09 -0800194 const auto minRate90 = configs.getMinRefreshRateByPolicy();
195 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800196
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800197 EXPECT_EQ(kMode90_G1, performanceRate);
198 EXPECT_EQ(kMode90_G1, minRate90);
199 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700200}
201
Dominik Laskowski0c252702021-12-20 20:32:09 -0800202TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
203 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700204
Dominik Laskowski0c252702021-12-20 20:32:09 -0800205 const auto minRate = configs.getMinRefreshRateByPolicy();
206 const auto performanceRate = configs.getMaxSupportedRefreshRate();
207 const auto minRate60 = configs.getMinRefreshRateByPolicy();
208 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700209
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800210 EXPECT_EQ(kMode60, minRate);
211 EXPECT_EQ(kMode60, minRate60);
212 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700213
Dominik Laskowski0c252702021-12-20 20:32:09 -0800214 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800215 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700216
Dominik Laskowski0c252702021-12-20 20:32:09 -0800217 const auto minRate90 = configs.getMinRefreshRateByPolicy();
218 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700219
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800220 EXPECT_EQ(kMode90_4K, performanceRate);
221 EXPECT_EQ(kMode90_4K, minRate90);
222 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800223}
224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
226 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800227
Dominik Laskowski0c252702021-12-20 20:32:09 -0800228 const auto minRate = configs.getMinRefreshRateByPolicy();
229 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800230
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800231 EXPECT_EQ(kMode60, minRate);
232 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800233
Dominik Laskowski0c252702021-12-20 20:32:09 -0800234 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800235
Dominik Laskowski0c252702021-12-20 20:32:09 -0800236 const auto minRate60 = configs.getMinRefreshRateByPolicy();
237 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
238
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800239 EXPECT_EQ(kMode60, minRate60);
240 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800241}
242
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800243TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800244 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800245 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800246 const auto mode = configs.getActiveMode();
247 EXPECT_EQ(mode->getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800248 }
249
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800250 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800251 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800252 const auto mode = configs.getActiveMode();
253 EXPECT_EQ(mode->getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800254 }
255
Dominik Laskowski0c252702021-12-20 20:32:09 -0800256 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800257 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800258 const auto mode = configs.getActiveMode();
259 EXPECT_EQ(mode->getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800260 }
261}
262
Steven Thomasbb374322020-04-28 22:47:16 -0700263TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800264 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800265 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800266
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 // If there are no layers we select the default frame rate, which is the max of the primary
268 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800269 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800270
Dominik Laskowski0c252702021-12-20 20:32:09 -0800271 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800272 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800273 }
274 {
275 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800276 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800277 constexpr bool kAllowGroupSwitching = true;
278 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
279 NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800280 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800281 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800282}
283
Steven Thomasbb374322020-04-28 22:47:16 -0700284TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800285 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800286
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700287 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800288 auto& lr = layers[0];
289
290 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800291 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800292 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800293
294 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800295 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800296 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700298 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800300 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800301 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800302
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700303 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800304 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800305 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800306
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700307 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800308 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800309 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800310
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700311 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800312 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800313 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800314
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700315 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800316 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800317 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800318
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800319 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800320 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800321
322 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800323 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800324
325 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800326 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700328 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800330 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800331
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700332 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800333 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800334
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700335 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800336 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800337
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700338 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800339 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700341 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800342 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800343
Dominik Laskowski0c252702021-12-20 20:32:09 -0800344 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345
346 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800347 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348
349 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800350 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700352 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800353 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800354 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800355
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700356 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800357 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700359 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800360 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700362 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800363 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700365 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800366 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800367
Dominik Laskowski0c252702021-12-20 20:32:09 -0800368 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800370 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
372 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800373 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700375 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800377 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700379 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800380 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800383 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700385 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800386 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700388 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800389 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390}
391
rnlee3bd610662021-06-23 16:27:57 -0700392TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800393 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700394
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700395 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700396 auto& lr = layers[0];
397
398 lr.vote = LayerVoteType::Min;
399 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800400 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700401
402 lr.vote = LayerVoteType::Max;
403 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800404 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700407 lr.vote = LayerVoteType::Heuristic;
408 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800409 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700410
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700411 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700412 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800413 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700414
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700415 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700416 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800417 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700418
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700419 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700420 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800421 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700422
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700423 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700424 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800425 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700426}
427
Steven Thomasbb374322020-04-28 22:47:16 -0700428TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800429 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700431 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432 auto& lr = layers[0];
433
434 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800435 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
437 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800438 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700440 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800442 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700444 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800445 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700447 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800448 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700450 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800451 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700453 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800454 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455}
456
Steven Thomasbb374322020-04-28 22:47:16 -0700457TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800458 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700460 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461 auto& lr1 = layers[0];
462 auto& lr2 = layers[1];
463
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700464 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700466 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800468 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700470 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800471 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700472 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800474 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700476 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700478 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800480 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481}
482
Steven Thomasbb374322020-04-28 22:47:16 -0700483TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800484 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800485
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700486 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800487 auto& lr1 = layers[0];
488 auto& lr2 = layers[1];
489
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700490 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800491 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800492 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800494 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800495 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800496 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800497
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700498 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800499 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800500 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700501 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800502 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800503 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800504 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800505
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700506 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800507 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800508 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800510 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800511 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800512 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800513
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700514 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800515 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800516 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700517 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800518 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800519 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800520 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800521
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700522 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800523 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
524 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700525 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800526 lr2.vote = LayerVoteType::ExplicitDefault;
527 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800528 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800529
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700530 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800531 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800532 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700533 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800534 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800535 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800536 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800537
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700538 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800539 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800540 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700541 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800542 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800544 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800545
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700546 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800547 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800548 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800550 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800551 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800552 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800553
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700554 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800555 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800556 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700557 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800558 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800559 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800560 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800561}
562
rnlee3bd610662021-06-23 16:27:57 -0700563TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800564 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
565 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700566
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700567 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700568 auto& lr1 = layers[0];
569 auto& lr2 = layers[1];
570
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700571 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700572 lr1.vote = LayerVoteType::ExplicitDefault;
573 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700574 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700575 lr2.vote = LayerVoteType::Heuristic;
576 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800577 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700578
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700579 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700580 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
581 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700582 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700583 lr2.vote = LayerVoteType::Heuristic;
584 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800585 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700586
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700587 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700588 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
589 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700590 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700591 lr2.vote = LayerVoteType::ExplicitDefault;
592 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800593 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700595 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700596 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
597 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700598 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700599 lr2.vote = LayerVoteType::Heuristic;
600 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800601 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700602
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700603 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700604 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
605 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700606 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700607 lr2.vote = LayerVoteType::ExplicitDefault;
608 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800609 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700610
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700611 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700612 lr1.vote = LayerVoteType::ExplicitDefault;
613 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700614 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700615 lr2.vote = LayerVoteType::Heuristic;
616 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800617 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700618
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700619 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700620 lr1.vote = LayerVoteType::Heuristic;
621 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700622 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700623 lr2.vote = LayerVoteType::ExplicitDefault;
624 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800625 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700626
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700627 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700628 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
629 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700630 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700631 lr2.vote = LayerVoteType::ExplicitDefault;
632 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800633 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700634
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700635 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700636 lr1.vote = LayerVoteType::ExplicitDefault;
637 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700639 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
640 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800641 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000642
643 lr1.desiredRefreshRate = 24_Hz;
644 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
645 lr1.name = "24Hz ExplicitExactOrMultiple";
646 lr2.vote = LayerVoteType::Max;
647 lr2.name = "Max";
648 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
649
650 lr1.desiredRefreshRate = 24_Hz;
651 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
652 lr1.name = "24Hz ExplicitExactOrMultiple";
653 lr2.desiredRefreshRate = 120_Hz;
654 lr2.vote = LayerVoteType::ExplicitDefault;
655 lr2.name = "120Hz ExplicitDefault";
656 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
657
658 lr1.desiredRefreshRate = 24_Hz;
659 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
660 lr1.name = "24Hz ExplicitExactOrMultiple";
661 lr2.desiredRefreshRate = 120_Hz;
662 lr2.vote = LayerVoteType::ExplicitExact;
663 lr2.name = "120Hz ExplicitExact";
664 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700665}
666
Steven Thomasbb374322020-04-28 22:47:16 -0700667TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800668 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800669
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700670 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800671 auto& lr = layers[0];
672
673 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800674 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800675
676 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800677 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800678
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700679 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800680 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800681 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800682
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700683 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800684 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800685
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700686 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800687 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700689 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800690 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700692 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800693 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800694}
695
Steven Thomasbb374322020-04-28 22:47:16 -0700696TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800697 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800698
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700699 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800700 auto& lr = layers[0];
701
702 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800703 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800704 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800705
706 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800707 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800708 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800709
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700710 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800711 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800712 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800713 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800714
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700715 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800716 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800717 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
718 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800719
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700720 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800721 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800722 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
723 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800724
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700725 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800726 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800727 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
728 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700730 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800731 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800732 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
733 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800734
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700735 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800736 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
737 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800738 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
739 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800740}
741
Steven Thomasbb374322020-04-28 22:47:16 -0700742TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800743 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700745 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800746 auto& lr1 = layers[0];
747 auto& lr2 = layers[1];
748
749 lr1.vote = LayerVoteType::Min;
750 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800751 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752
753 lr1.vote = LayerVoteType::Min;
754 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700755 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800756 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800757
758 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800759 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700760 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800761 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800762
763 lr1.vote = LayerVoteType::Max;
764 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700765 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800766 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800767
768 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800769 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700770 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800771 EXPECT_EQ(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 = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700776 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800777 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800778
779 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700780 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800781 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700782 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800783 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800784}
785
Steven Thomasbb374322020-04-28 22:47:16 -0700786TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800787 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700789 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800790 auto& lr = layers[0];
791
Ady Abraham71c437d2020-01-31 15:56:57 -0800792 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800793 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700794 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800795 const auto mode = configs.getBestRefreshRate(layers);
796 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
797 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798 }
799}
800
rnlee3bd610662021-06-23 16:27:57 -0700801TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800802 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
803 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700804
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700805 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700806 auto& lr = layers[0];
807
808 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
809 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700810 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800811 const auto mode = configs.getBestRefreshRate(layers);
812 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
813 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700814 }
815}
816
Dominik Laskowski0c252702021-12-20 20:32:09 -0800817TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800818 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700820 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821 auto& lr1 = layers[0];
822 auto& lr2 = layers[1];
823
824 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800826 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700827 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800828 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800829
830 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700831 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800832 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700833 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800834 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
836 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700837 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800838 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700839 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800840 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800841}
842
Steven Thomasbb374322020-04-28 22:47:16 -0700843TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800844 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800845
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700846 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800847 auto& lr = layers[0];
848
Ady Abraham71c437d2020-01-31 15:56:57 -0800849 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800850 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800852 const auto mode = configs.getBestRefreshRate(layers, {});
853 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
854 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800855 }
856}
857
Steven Thomasbb374322020-04-28 22:47:16 -0700858TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800859 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800860
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700861 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800862 auto& lr1 = layers[0];
863 auto& lr2 = layers[1];
864
865 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700866 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800867 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800868 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700869 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800870 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800871 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800872
873 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700874 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800875 lr1.name = "60Hz ExplicitExactOrMultiple";
876 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700877 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800878 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800879 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800880
881 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700882 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800883 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800884 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800886 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800887
888 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800891 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700892 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800893 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800894 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800895
896 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700897 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800899 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800901 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902}
903
904TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800905 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800906
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700907 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800908 auto& lr1 = layers[0];
909 auto& lr2 = layers[1];
910
911 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700912 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800913 lr1.name = "60Hz ExplicitExactOrMultiple";
914 lr2.vote = LayerVoteType::NoVote;
915 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800916 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800917
918 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700919 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800920 lr1.name = "60Hz ExplicitExactOrMultiple";
921 lr2.vote = LayerVoteType::NoVote;
922 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800923 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800924
925 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700926 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800927 lr1.name = "60Hz ExplicitExactOrMultiple";
928 lr2.vote = LayerVoteType::Max;
929 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800930 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800931
932 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700933 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800934 lr1.name = "60Hz ExplicitExactOrMultiple";
935 lr2.vote = LayerVoteType::Max;
936 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800937 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800938
939 // The other layer starts to provide buffers
940 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700941 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800942 lr1.name = "60Hz ExplicitExactOrMultiple";
943 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700944 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800946 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800947}
948
949TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800950 RefreshRateConfigs configs(kModes_60_90, kModeId60);
951
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800952 auto [_, signals] = configs.getBestRefreshRate({}, {});
953 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800954
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800955 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
956 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800957
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700958 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800959 auto& lr1 = layers[0];
960 auto& lr2 = layers[1];
961
962 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700963 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800964 lr1.name = "60Hz ExplicitExactOrMultiple";
965 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700966 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700967 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800968 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
969 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800970
971 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700972 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800973 lr1.name = "60Hz ExplicitExactOrMultiple";
974 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700975 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700976 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800977 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
978 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800979
980 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700981 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800982 lr1.name = "60Hz ExplicitExactOrMultiple";
983 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700984 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700985 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800986 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
987 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800988
989 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700990 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700991 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -0800992 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700993 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700994 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800995 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
996 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -0800997}
998
Steven Thomasbb374322020-04-28 22:47:16 -0700999TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001000 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001001
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001002 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001003 auto& lr = layers[0];
1004
1005 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001006 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1007 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001008
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001009 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001010
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001011 {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 -08001012
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001013 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001014
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001015 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001016
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001017 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001018
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001019 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001020
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001021 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001022 };
1023
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001024 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001025 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001026 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001027
1028 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001029 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001030 lr.name = ss.str();
1031
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001032 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001033 }
1034}
1035
1036TEST_F(RefreshRateConfigsTest,
1037 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001038 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001039 auto& lr = layers[0];
1040
1041 // Test that 23.976 will choose 24 if 23.976 is not supported
1042 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001043 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1044 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001045 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001046
1047 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001048 lr.desiredRefreshRate = 23.976_Hz;
1049 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001050 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001051 }
1052
1053 // Test that 24 will choose 23.976 if 24 is not supported
1054 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001055 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1056 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001057 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001058
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001059 lr.desiredRefreshRate = 24_Hz;
1060 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001061 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001062 }
1063
1064 // Test that 29.97 will prefer 59.94 over 60 and 30
1065 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001066 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1067 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001068 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001069
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001070 lr.desiredRefreshRate = 29.97_Hz;
1071 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001072 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001073 }
1074}
1075
1076TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001077 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001078 auto& lr = layers[0];
1079
1080 // Test that voting for supported refresh rate will select this refresh rate
1081 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001082 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001083
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001084 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 +02001085 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001086 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001087 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001088 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001089 lr.name = ss.str();
1090
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001091 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001092 }
1093 }
1094
1095 // Test that 23.976 will choose 24 if 23.976 is not supported
1096 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001097 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1098 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001099 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001100
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001101 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001102 lr.desiredRefreshRate = 23.976_Hz;
1103 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001104 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001105 }
1106
1107 // Test that 24 will choose 23.976 if 24 is not supported
1108 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001109 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1110 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001111 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001112
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001113 lr.desiredRefreshRate = 24_Hz;
1114 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001115 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001116 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001117}
1118
Alec Mouri11232a22020-05-14 18:06:25 -07001119TEST_F(RefreshRateConfigsTest,
1120 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001121 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001122
Dominik Laskowski0c252702021-12-20 20:32:09 -08001123 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001124
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001125 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001126 auto& lr = layers[0];
1127
Alec Mouri11232a22020-05-14 18:06:25 -07001128 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001129 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001130 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001131 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001132
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001133 const auto [mode, signals] = configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001134
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001135 EXPECT_EQ(mode, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001136 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001137}
1138
1139TEST_F(RefreshRateConfigsTest,
1140 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001141 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001142
Dominik Laskowski0c252702021-12-20 20:32:09 -08001143 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001144
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001145 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001146 auto& lr = layers[0];
1147
Alec Mouri11232a22020-05-14 18:06:25 -07001148 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001149 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001150 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001151 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001152 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001153}
1154
1155TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001156 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001157 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001158
Dominik Laskowski0c252702021-12-20 20:32:09 -08001159 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001160
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001161 const auto [mode, signals] = configs.getBestRefreshRateAndSignals({}, {});
1162 EXPECT_EQ(mode, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001163 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001164
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001165 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001166 auto& lr = layers[0];
1167
1168 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001169 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001170 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001171 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001172 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001173
1174 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001175 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001176
1177 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001178 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001179 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001180 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001181 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001182
1183 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001184 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001185
1186 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001187 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001188 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001189 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001190 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001191
1192 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001193 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001194
1195 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001196 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001197 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001198 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001199 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001200
1201 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001202 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001203
1204 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001205 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001206 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001207 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001208 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001209
1210 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001211 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001212}
1213
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001214TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001215 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001216
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001217 // The default policy doesn't allow group switching. Verify that no
1218 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001219 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001220 auto& layer = layers[0];
1221 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001222 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001223 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001224 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001225 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001226
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001227 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001228}
Steven Thomasd4071902020-03-24 16:02:53 -07001229
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001230TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001231 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1232
Steven Thomasd4071902020-03-24 16:02:53 -07001233 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001234 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001235 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001236 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001237
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001238 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001239 auto& layer = layers[0];
1240 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001241 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001242 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1243 layer.name = "90Hz ExplicitDefault";
1244 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001245 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001246}
1247
1248TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001249 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001250
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001251 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001252 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001253 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001254 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001255
1256 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001257 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001258 auto& layer = layers[0];
1259 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001260 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001261 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001262 layer.name = "90Hz ExplicitDefault";
1263 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001264 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001265}
1266
1267TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001268 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001269
Dominik Laskowski0c252702021-12-20 20:32:09 -08001270 RefreshRateConfigs::Policy policy;
1271 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1272 policy.allowGroupSwitching = true;
1273 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1274
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001275 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001276
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001277 // 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 -07001278 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001279 auto& layer = layers[0];
1280 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001281 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001282 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001283 layer.name = "60Hz ExplicitDefault";
1284 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001285 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001286}
1287
1288TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001289 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001290
Dominik Laskowski0c252702021-12-20 20:32:09 -08001291 RefreshRateConfigs::Policy policy;
1292 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1293 policy.allowGroupSwitching = true;
1294 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1295
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001296 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001297
1298 // Verify that if the current config is in another group and there are no layers with
1299 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001300
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001302 auto& layer = layers[0];
1303 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001304 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001305 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001306 layer.name = "60Hz ExplicitDefault";
1307 layer.focused = true;
1308
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001309 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001310}
1311
1312TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001313 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001314
Dominik Laskowski0c252702021-12-20 20:32:09 -08001315 RefreshRateConfigs::Policy policy;
1316 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1317 policy.allowGroupSwitching = true;
1318 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1319
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001320 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001321
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001322 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001323 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001324 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001325 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001326 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001327 layers[0].seamlessness = Seamlessness::OnlySeamless;
1328 layers[0].name = "60Hz ExplicitDefault";
1329 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001330
1331 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001332 layers[1].vote = LayerVoteType::ExplicitDefault;
1333 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001334 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001335 layers[1].name = "90Hz ExplicitDefault";
1336 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001337
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001338 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001339}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001340
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001341TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001342 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001343
Dominik Laskowski0c252702021-12-20 20:32:09 -08001344 RefreshRateConfigs::Policy policy;
1345 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1346 policy.allowGroupSwitching = true;
1347 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1348
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001349 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001350
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001351 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1352 // seamlessness=Default can't change the mode group back to the group of the default
1353 // mode.
1354 // For example, this may happen when a video playback requests and gets a seamed switch,
1355 // but another layer (with default seamlessness) starts animating. The animating layer
1356 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001357 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001358 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001359 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001360 layers[0].focused = true;
1361 layers[0].vote = LayerVoteType::ExplicitDefault;
1362 layers[0].name = "60Hz ExplicitDefault";
1363
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001364 layers.push_back(LayerRequirement{.weight = 0.1f});
1365 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001366 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001367 layers[1].focused = true;
1368 layers[1].vote = LayerVoteType::ExplicitDefault;
1369 layers[1].name = "90Hz ExplicitDefault";
1370
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001371 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001372}
1373
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001374TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001375 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001376
Dominik Laskowski0c252702021-12-20 20:32:09 -08001377 RefreshRateConfigs::Policy policy;
1378 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1379 policy.allowGroupSwitching = true;
1380 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1381
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001382 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001383
1384 // Layer with seamlessness=Default can change the mode group if there's a not
1385 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1386 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001387 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001388 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001389 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001390 layers[0].focused = true;
1391 layers[0].vote = LayerVoteType::ExplicitDefault;
1392 layers[0].name = "60Hz ExplicitDefault";
1393
1394 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001395 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001396 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001397 layers[1].focused = false;
1398 layers[1].vote = LayerVoteType::ExplicitDefault;
1399 layers[1].name = "90Hz ExplicitDefault";
1400
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001401 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001402}
1403
1404TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001405 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001406
1407 // Allow group switching.
1408 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001409 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001410 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001411 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001412
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001413 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001414 auto& layer = layers[0];
1415 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001416 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001417 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001418 layer.name = "60Hz ExplicitExactOrMultiple";
1419 layer.focused = true;
1420
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001421 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001422
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001423 configs.setActiveModeId(kModeId120);
1424 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001425}
1426
1427TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001428 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001429
1430 // Allow group switching.
1431 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001432 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001433 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001434 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001435
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001436 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1437 .vote = LayerVoteType::ExplicitDefault,
1438 .desiredRefreshRate = 60_Hz,
1439 .seamlessness = Seamlessness::SeamedAndSeamless,
1440 .weight = 0.5f,
1441 .focused = false},
1442 {.name = "25Hz ExplicitExactOrMultiple",
1443 .vote = LayerVoteType::ExplicitExactOrMultiple,
1444 .desiredRefreshRate = 25_Hz,
1445 .seamlessness = Seamlessness::OnlySeamless,
1446 .weight = 1.f,
1447 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001448
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001449 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001450
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001451 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001452 seamedLayer.desiredRefreshRate = 30_Hz;
1453 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001454 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001455
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001456 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001457}
1458
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001459TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001460 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001461
1462 // Allow group switching.
1463 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001464 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001465 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001466 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001467
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001468 std::vector<LayerRequirement> layers = {
1469 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001470
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001471 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001472}
1473
Steven Thomasf734df42020-04-13 21:09:28 -07001474TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001475 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001477 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001478 layers[0].name = "Test layer";
1479
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001480 struct Args {
1481 bool touch = false;
1482 bool focused = true;
1483 };
1484
Steven Thomasbb374322020-04-28 22:47:16 -07001485 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001486 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001487 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001488 layers[0].vote = voteType;
1489 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001490 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001491 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001492 };
1493
Dominik Laskowski0c252702021-12-20 20:32:09 -08001494 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1495
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001496 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001497 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1498 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1499 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1500 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1501 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1502 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001503
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001504 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001505 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1506 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001507 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001508
Steven Thomasf734df42020-04-13 21:09:28 -07001509 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001510 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1511
Steven Thomasf734df42020-04-13 21:09:28 -07001512 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1513 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001514 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1515 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001516 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001517
Dominik Laskowski0c252702021-12-20 20:32:09 -08001518 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1519
1520 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1521 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1522 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1523 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1524 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1525 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001526}
1527
Steven Thomasbb374322020-04-28 22:47:16 -07001528TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001529 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001530
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001531 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001532 layers[0].name = "Test layer";
1533
Marin Shalamanov23c44202020-12-22 19:09:20 +01001534 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001535 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001536 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001537
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001538 const auto [refreshRate, signals] =
1539 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1540
1541 // Refresh rate will be chosen by either touch state or idle state.
1542 EXPECT_EQ(!touchActive, signals.idle);
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001543 return refreshRate->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001544 };
1545
Dominik Laskowski0c252702021-12-20 20:32:09 -08001546 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001547
1548 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001549 {
1550 constexpr bool kTouchActive = true;
1551 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1552 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1553 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1554 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1555 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1556 EXPECT_EQ(kModeId90,
1557 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1558 }
Steven Thomasbb374322020-04-28 22:47:16 -07001559
1560 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001561 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001562
1563 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001564 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001565
1566 {
1567 constexpr bool kTouchActive = false;
1568 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1569 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1570 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1571 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1572 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1573 EXPECT_EQ(kModeId60,
1574 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1575 }
Steven Thomasbb374322020-04-28 22:47:16 -07001576
1577 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001578 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001579}
1580
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001581TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001582 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001583
1584 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001585 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1586 const Fps expectedFrameRate = [fps] {
1587 if (fps < 26.91f) return 24_Hz;
1588 if (fps < 37.51f) return 30_Hz;
1589 if (fps < 52.51f) return 45_Hz;
1590 if (fps < 66.01f) return 60_Hz;
1591 if (fps < 81.01f) return 72_Hz;
1592 return 90_Hz;
1593 }();
1594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001595 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001596 }
1597}
1598
1599TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001600 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001601
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001602 struct Expectation {
1603 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001604 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001605 };
1606
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001607 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001608 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1609 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001610 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001611
1612 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001613 const auto& knownFrameRates = configs.knownFrameRates();
1614 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 knownFrameRatesExpectations.begin(),
1616 [](Fps fps, const Expectation& expected) {
1617 return isApproxEqual(fps, expected.fps);
1618 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001619 EXPECT_TRUE(equal);
1620
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001621 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001622 auto& layer = layers[0];
1623 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001624
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001625 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001626 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001627 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001628 }
1629}
1630
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001631TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001632 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001633
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001634 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001635 auto& explicitExactLayer = layers[0];
1636 auto& explicitExactOrMultipleLayer = layers[1];
1637
1638 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1639 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001640 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001641
1642 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1643 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001644 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001645
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001646 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
1647 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001648
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001649 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1650 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001651 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001652
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001653 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001654 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001655
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001656 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001657 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001658
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001659 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001660 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001661}
1662
1663TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001664 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1665 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001666
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001667 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001668 auto& explicitExactLayer = layers[0];
1669 auto& explicitExactOrMultipleLayer = layers[1];
1670
1671 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1672 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001673 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001674
1675 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1676 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001677 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001678
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001679 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1680 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001681
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001682 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1683 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001684 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001685
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001686 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001687 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001688
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001689 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001690 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001692 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001693 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001694}
1695
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001696TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001697 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001698
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001699 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1700 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1701 GlobalSignals{.touch = true, .idle = true});
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001702 const auto result = std::make_pair(kMode90, GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001703
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001704 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001705
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001706 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001707}
1708
1709TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001710 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1711
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001712 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001713
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001714 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001715 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001716
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001717 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001718
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001719 const auto& cache = configs.mutableGetBestRefreshRateCache();
1720 ASSERT_TRUE(cache);
1721
1722 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1723 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001724}
1725
Ady Abraham5e4e9832021-06-14 13:40:56 -07001726TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001727 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001728
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001729 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001730 auto& explicitExactLayer = layers[0];
1731 auto& explicitExactOrMultipleLayer = layers[1];
1732
1733 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1734 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001735 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001736
1737 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1738 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001739 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001740
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001741 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1742 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001743
1744 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1745
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001746 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1747 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001748}
1749
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001750TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001751 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1752 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001753
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001754 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001755 auto& explicitDefaultLayer = layers[0];
1756 auto& explicitExactOrMultipleLayer = layers[1];
1757
1758 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1759 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001760 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001761
1762 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1763 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001764 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001765
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001766 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001767}
1768
Ady Abraham05243be2021-09-16 15:58:52 -07001769// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001770TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001771 constexpr int kMinRefreshRate = 10;
1772 constexpr int kMaxRefreshRate = 240;
1773
1774 DisplayModes displayModes;
1775 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001776 const DisplayModeId modeId(fps);
1777 displayModes.try_emplace(modeId,
1778 createDisplayMode(modeId,
1779 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001780 }
1781
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001782 const TestableRefreshRateConfigs configs(std::move(displayModes),
1783 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07001784
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001785 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001786 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1787 layers[0].desiredRefreshRate = fps;
1788 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001789 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001790 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001791 };
1792
1793 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001794 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001795 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1796 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1797 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1798 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1799 }
1800}
1801
Ady Abraham1c595502022-01-13 21:58:32 -08001802// b/190578904
1803TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001804 constexpr DisplayModeId kActiveModeId{0};
1805 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
1806 createDisplayMode(DisplayModeId(1), 53_Hz),
1807 createDisplayMode(DisplayModeId(2), 55_Hz),
1808 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08001809
1810 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001811 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08001812
Dominik Laskowski0c252702021-12-20 20:32:09 -08001813 const std::vector<LayerRequirement> layers = {
1814 {
Ady Abraham1c595502022-01-13 21:58:32 -08001815 .vote = LayerVoteType::ExplicitDefault,
1816 .desiredRefreshRate = 43_Hz,
1817 .seamlessness = Seamlessness::SeamedAndSeamless,
1818 .weight = 0.41f,
1819 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001820 {
Ady Abraham1c595502022-01-13 21:58:32 -08001821 .vote = LayerVoteType::ExplicitExactOrMultiple,
1822 .desiredRefreshRate = 53_Hz,
1823 .seamlessness = Seamlessness::SeamedAndSeamless,
1824 .weight = 0.41f,
1825 },
1826 };
1827
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001828 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001829}
1830
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001831TEST_F(RefreshRateConfigsTest, modeComparison) {
1832 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
1833 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
1834 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07001835}
1836
1837TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001838 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001839
Dominik Laskowski0c252702021-12-20 20:32:09 -08001840 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1841
Ana Krulecb9afd792020-06-11 13:16:15 -07001842 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001843 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001844
1845 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001846 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1847 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001848
Ady Abrahama91605e2021-06-18 11:41:47 -07001849 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001850 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1851 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001852
1853 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001854 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1855 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001856}
1857
TreeHugger Robot758ab612021-06-22 19:17:29 +00001858TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001859 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001860
Dominik Laskowski0c252702021-12-20 20:32:09 -08001861 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1862
TreeHugger Robot758ab612021-06-22 19:17:29 +00001863 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001864 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1865 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001866
1867 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001868 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1869 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001870
1871 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001872 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1873 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001874
1875 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001876 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1877 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001878}
1879
Ady Abrahamcc315492022-02-17 17:06:39 -08001880TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001881 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001882
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001883 const auto frameRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001884 Fps displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001885 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001886
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001887 configs.setActiveModeId(kModeId60);
1888 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001889 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001890
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001891 configs.setActiveModeId(kModeId72);
1892 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001893 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001894
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001895 configs.setActiveModeId(kModeId90);
1896 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001897 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001898
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001899 configs.setActiveModeId(kModeId120);
1900 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001901 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001902
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001903 configs.setActiveModeId(kModeId90);
1904 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001905 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001906
Ady Abrahamcc315492022-02-17 17:06:39 -08001907 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
1908 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
1909 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
1910 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001911}
1912
1913TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001914 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1915 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001916
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001917 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1918 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001919
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001920 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1921 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001922
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001923 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1924 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001925
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001926 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1927 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001928
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001929 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 +02001930 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001931 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001932 }
1933
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001934 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1935 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1936 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001937}
1938
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001939TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001940 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001941
Dominik Laskowski0c252702021-12-20 20:32:09 -08001942 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001943}
1944
1945TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001946 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1947 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001948
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001949 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001950 layers[0].name = "Test layer";
1951 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001952 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001953 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001954
1955 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1956 EXPECT_EQ(1u, frameRateOverrides.size());
1957 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1958 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001959
1960 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001961 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1962 EXPECT_EQ(1u, frameRateOverrides.size());
1963 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1964 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001965
1966 layers[0].vote = LayerVoteType::NoVote;
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::Min;
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::Max;
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 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001979 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1980 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001981}
1982
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001983TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001984 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1985 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001986
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001987 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
1988 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001989
1990 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001991 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001992 layers[0].vote = LayerVoteType::ExplicitDefault;
1993
1994 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001995 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001996 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001997 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08001998
Dominik Laskowski0c252702021-12-20 20:32:09 -08001999 EXPECT_EQ(2u, frameRateOverrides.size());
2000 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2001 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2002 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2003 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002004
2005 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002006 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2007 EXPECT_EQ(1u, frameRateOverrides.size());
2008 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2009 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002010
2011 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002012 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2013 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002014}
2015
2016TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002017 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2018 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002019
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002020 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002021 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002022 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002023 layers[0].vote = LayerVoteType::ExplicitDefault;
2024
Dominik Laskowski0c252702021-12-20 20:32:09 -08002025 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2026 EXPECT_EQ(1u, frameRateOverrides.size());
2027 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2028 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002029
Dominik Laskowski0c252702021-12-20 20:32:09 -08002030 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2031 EXPECT_EQ(1u, frameRateOverrides.size());
2032 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2033 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002034
2035 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002036 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2037 EXPECT_EQ(1u, frameRateOverrides.size());
2038 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2039 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002040
Dominik Laskowski0c252702021-12-20 20:32:09 -08002041 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2042 EXPECT_EQ(1u, frameRateOverrides.size());
2043 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2044 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002045
2046 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002047 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2048 EXPECT_EQ(1u, frameRateOverrides.size());
2049 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2050 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002051
Dominik Laskowski0c252702021-12-20 20:32:09 -08002052 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2053 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002054}
2055
Alec Mouri0a1cc962019-03-14 12:33:02 -07002056} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002057} // namespace android::scheduler