blob: 188fd58deae793970f7e46a34ea7f4d7f78c6d71 [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
Ady Abraham62f51d92022-08-24 22:20:22 +0000567 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700568 auto& lr1 = layers[0];
569 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000570 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700571
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700572 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700573 lr1.vote = LayerVoteType::ExplicitDefault;
574 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700575 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700576 lr2.vote = LayerVoteType::Heuristic;
577 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800578 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700579
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700580 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700581 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
582 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700583 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700584 lr2.vote = LayerVoteType::Heuristic;
585 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800586 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700587
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700588 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700589 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
590 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700591 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700592 lr2.vote = LayerVoteType::ExplicitDefault;
593 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800594 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700595
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700596 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700597 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
598 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700599 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700600 lr2.vote = LayerVoteType::Heuristic;
601 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800602 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700603
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700604 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700605 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
606 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700607 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700608 lr2.vote = LayerVoteType::ExplicitDefault;
609 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800610 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700611
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700612 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700613 lr1.vote = LayerVoteType::ExplicitDefault;
614 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700615 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700616 lr2.vote = LayerVoteType::Heuristic;
617 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800618 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700619
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700620 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700621 lr1.vote = LayerVoteType::Heuristic;
622 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700623 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700624 lr2.vote = LayerVoteType::ExplicitDefault;
625 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800626 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700627
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700628 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700629 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
630 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700631 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700632 lr2.vote = LayerVoteType::ExplicitDefault;
633 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800634 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700635
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700636 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700637 lr1.vote = LayerVoteType::ExplicitDefault;
638 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700639 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700640 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
641 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800642 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000643
644 lr1.desiredRefreshRate = 24_Hz;
645 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
646 lr1.name = "24Hz ExplicitExactOrMultiple";
647 lr2.vote = LayerVoteType::Max;
648 lr2.name = "Max";
649 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
650
651 lr1.desiredRefreshRate = 24_Hz;
652 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
653 lr1.name = "24Hz ExplicitExactOrMultiple";
654 lr2.desiredRefreshRate = 120_Hz;
655 lr2.vote = LayerVoteType::ExplicitDefault;
656 lr2.name = "120Hz ExplicitDefault";
657 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
658
659 lr1.desiredRefreshRate = 24_Hz;
660 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
661 lr1.name = "24Hz ExplicitExactOrMultiple";
662 lr2.desiredRefreshRate = 120_Hz;
663 lr2.vote = LayerVoteType::ExplicitExact;
664 lr2.name = "120Hz ExplicitExact";
665 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000666
667 lr1.desiredRefreshRate = 10_Hz;
668 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
669 lr1.name = "30Hz ExplicitExactOrMultiple";
670 lr2.desiredRefreshRate = 120_Hz;
671 lr2.vote = LayerVoteType::Heuristic;
672 lr2.name = "120Hz ExplicitExact";
673 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
674
675 lr1.desiredRefreshRate = 30_Hz;
676 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
677 lr1.name = "30Hz ExplicitExactOrMultiple";
678 lr2.desiredRefreshRate = 30_Hz;
679 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
680 lr2.name = "30Hz ExplicitExactOrMultiple";
681 lr3.vote = LayerVoteType::Heuristic;
682 lr3.desiredRefreshRate = 120_Hz;
683 lr3.name = "120Hz Heuristic";
684 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700685}
686
Steven Thomasbb374322020-04-28 22:47:16 -0700687TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800688 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800689
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700690 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691 auto& lr = layers[0];
692
693 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800694 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800695
696 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800697 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800698
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700699 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800700 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800701 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800702
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700703 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800704 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800705
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700706 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800707 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800708
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700709 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800710 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800711
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700712 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800713 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800714}
715
Steven Thomasbb374322020-04-28 22:47:16 -0700716TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800717 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800718
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700719 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800720 auto& lr = layers[0];
721
722 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800723 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800724 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800725
726 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800727 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800728 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700730 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800731 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800732 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800733 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700735 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800736 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800737 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
738 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800739
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700740 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800741 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800742 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
743 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700745 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800746 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800747 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
748 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800749
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700750 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800751 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800752 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
753 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800754
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700755 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800756 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
757 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800758 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
759 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800760}
761
Steven Thomasbb374322020-04-28 22:47:16 -0700762TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800763 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800764
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700765 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800766 auto& lr1 = layers[0];
767 auto& lr2 = layers[1];
768
769 lr1.vote = LayerVoteType::Min;
770 lr2.vote = LayerVoteType::Max;
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::Min;
774 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700775 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800776 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777
778 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800779 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700780 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800781 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800782
783 lr1.vote = LayerVoteType::Max;
784 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700785 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800786 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800787
788 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800789 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700790 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800791 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800792
793 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700794 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700796 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800797 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
799 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700800 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800801 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700802 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800803 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800804}
805
Steven Thomasbb374322020-04-28 22:47:16 -0700806TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800807 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700809 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810 auto& lr = layers[0];
811
Ady Abraham71c437d2020-01-31 15:56:57 -0800812 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700814 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800815 const auto mode = configs.getBestRefreshRate(layers);
816 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
817 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800818 }
819}
820
rnlee3bd610662021-06-23 16:27:57 -0700821TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800822 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
823 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700824
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700826 auto& lr = layers[0];
827
828 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
829 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700830 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800831 const auto mode = configs.getBestRefreshRate(layers);
832 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
833 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700834 }
835}
836
Dominik Laskowski0c252702021-12-20 20:32:09 -0800837TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800838 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800839
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700840 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841 auto& lr1 = layers[0];
842 auto& lr2 = layers[1];
843
844 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700845 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800846 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700847 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800848 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800849
850 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800852 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700853 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800854 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800855
856 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700857 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800858 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700859 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800860 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800861}
862
Steven Thomasbb374322020-04-28 22:47:16 -0700863TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800864 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800865
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700866 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800867 auto& lr = layers[0];
868
Ady Abraham71c437d2020-01-31 15:56:57 -0800869 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800870 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700871 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800872 const auto mode = configs.getBestRefreshRate(layers, {});
873 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
874 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800875 }
876}
877
Steven Thomasbb374322020-04-28 22:47:16 -0700878TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800879 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800880
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700881 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800882 auto& lr1 = layers[0];
883 auto& lr2 = layers[1];
884
885 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700886 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800887 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800888 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800891 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800892
893 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700894 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800895 lr1.name = "60Hz ExplicitExactOrMultiple";
896 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700897 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800899 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900
901 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700902 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800903 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800904 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800906 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800907
908 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700909 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800910 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800911 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700912 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800913 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800914 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800915
916 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700917 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800918 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800919 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800920 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800921 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800922}
923
924TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800925 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800926
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700927 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800928 auto& lr1 = layers[0];
929 auto& lr2 = layers[1];
930
931 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700932 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800933 lr1.name = "60Hz ExplicitExactOrMultiple";
934 lr2.vote = LayerVoteType::NoVote;
935 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800936 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800937
938 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700939 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800940 lr1.name = "60Hz ExplicitExactOrMultiple";
941 lr2.vote = LayerVoteType::NoVote;
942 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800943 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800944
945 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700946 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800947 lr1.name = "60Hz ExplicitExactOrMultiple";
948 lr2.vote = LayerVoteType::Max;
949 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800950 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951
952 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700953 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800954 lr1.name = "60Hz ExplicitExactOrMultiple";
955 lr2.vote = LayerVoteType::Max;
956 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800957 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958
959 // The other layer starts to provide buffers
960 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700961 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800962 lr1.name = "60Hz ExplicitExactOrMultiple";
963 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700964 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800965 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800966 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800967}
968
969TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800970 RefreshRateConfigs configs(kModes_60_90, kModeId60);
971
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800972 auto [_, signals] = configs.getBestRefreshRate({}, {});
973 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800974
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800975 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
976 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800977
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700978 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800979 auto& lr1 = layers[0];
980 auto& lr2 = layers[1];
981
982 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700983 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800984 lr1.name = "60Hz ExplicitExactOrMultiple";
985 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700986 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700987 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800988 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
989 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800990
991 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700992 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800993 lr1.name = "60Hz ExplicitExactOrMultiple";
994 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700995 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700996 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800997 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
998 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800999
1000 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001001 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001002 lr1.name = "60Hz ExplicitExactOrMultiple";
1003 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001004 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001005 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001006 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1007 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001008
1009 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001010 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001011 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001012 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001013 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001014 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001015 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1016 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001017}
1018
Steven Thomasbb374322020-04-28 22:47:16 -07001019TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001020 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001021
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001022 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001023 auto& lr = layers[0];
1024
1025 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001026 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1027 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001028
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001029 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001030
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001031 {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 -08001032
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001033 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001034
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001035 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001036
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001037 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001038
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001039 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001040
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001041 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001042 };
1043
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001044 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001045 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001046 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001047
1048 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001049 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001050 lr.name = ss.str();
1051
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001052 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001053 }
1054}
1055
1056TEST_F(RefreshRateConfigsTest,
1057 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001058 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001059 auto& lr = layers[0];
1060
1061 // Test that 23.976 will choose 24 if 23.976 is not supported
1062 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001063 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1064 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001065 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001066
1067 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001068 lr.desiredRefreshRate = 23.976_Hz;
1069 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001070 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001071 }
1072
1073 // Test that 24 will choose 23.976 if 24 is not supported
1074 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001075 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1076 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001077 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001078
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001079 lr.desiredRefreshRate = 24_Hz;
1080 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001081 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001082 }
1083
1084 // Test that 29.97 will prefer 59.94 over 60 and 30
1085 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001086 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1087 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001088 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 lr.desiredRefreshRate = 29.97_Hz;
1091 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001092 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001093 }
1094}
1095
1096TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001097 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001098 auto& lr = layers[0];
1099
1100 // Test that voting for supported refresh rate will select this refresh rate
1101 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001102 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001103
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001104 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 +02001105 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001106 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001107 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001108 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001109 lr.name = ss.str();
1110
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001111 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001112 }
1113 }
1114
1115 // Test that 23.976 will choose 24 if 23.976 is not supported
1116 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001117 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1118 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001119 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001120
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001121 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001122 lr.desiredRefreshRate = 23.976_Hz;
1123 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001124 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001125 }
1126
1127 // Test that 24 will choose 23.976 if 24 is not supported
1128 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001129 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1130 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001131 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001132
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001133 lr.desiredRefreshRate = 24_Hz;
1134 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001135 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001136 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001137}
1138
Alec Mouri11232a22020-05-14 18:06:25 -07001139TEST_F(RefreshRateConfigsTest,
1140 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001141 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001142
Dominik Laskowski0c252702021-12-20 20:32:09 -08001143 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_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 = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001150 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001151 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001152
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001153 const auto [mode, signals] = configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001154
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001155 EXPECT_EQ(mode, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001156 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001157}
1158
1159TEST_F(RefreshRateConfigsTest,
1160 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001161 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001162
Dominik Laskowski0c252702021-12-20 20:32:09 -08001163 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
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
Alec Mouri11232a22020-05-14 18:06:25 -07001168 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001169 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001170 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001171 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001172 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001173}
1174
1175TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001176 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001177 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001178
Dominik Laskowski0c252702021-12-20 20:32:09 -08001179 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001180
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001181 const auto [mode, signals] = configs.getBestRefreshRateAndSignals({}, {});
1182 EXPECT_EQ(mode, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001183 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001184
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001185 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001186 auto& lr = layers[0];
1187
1188 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001189 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001190 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001191 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001192 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001193
1194 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001195 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001196
1197 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001198 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001199 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001200 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001201 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001202
1203 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001204 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001205
1206 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001207 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001208 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001209 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001210 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001211
1212 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001213 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001214
1215 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001216 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001217 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001218 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001219 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001220
1221 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001222 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001223
1224 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001225 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001226 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001227 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001228 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001229
1230 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001231 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001232}
1233
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001234TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001235 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001236
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001237 // The default policy doesn't allow group switching. Verify that no
1238 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001239 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001240 auto& layer = layers[0];
1241 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001242 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001243 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001244 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001245 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001246
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001247 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001248}
Steven Thomasd4071902020-03-24 16:02:53 -07001249
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001250TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001251 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1252
Steven Thomasd4071902020-03-24 16:02:53 -07001253 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001254 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001255 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001256 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001257
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001258 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001259 auto& layer = layers[0];
1260 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001261 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001262 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1263 layer.name = "90Hz ExplicitDefault";
1264 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001265 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001266}
1267
1268TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001269 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001270
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001271 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001272 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001273 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001274 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001275
1276 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001277 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001278 auto& layer = layers[0];
1279 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001280 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001281 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001282 layer.name = "90Hz ExplicitDefault";
1283 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001284 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001285}
1286
1287TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001288 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001289
Dominik Laskowski0c252702021-12-20 20:32:09 -08001290 RefreshRateConfigs::Policy policy;
1291 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1292 policy.allowGroupSwitching = true;
1293 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1294
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001295 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001296
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001297 // 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 -07001298 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001299 auto& layer = layers[0];
1300 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001302 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001303 layer.name = "60Hz ExplicitDefault";
1304 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001305 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001306}
1307
1308TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001309 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001310
Dominik Laskowski0c252702021-12-20 20:32:09 -08001311 RefreshRateConfigs::Policy policy;
1312 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1313 policy.allowGroupSwitching = true;
1314 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1315
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001316 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001317
1318 // Verify that if the current config is in another group and there are no layers with
1319 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001320
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001321 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001322 auto& layer = layers[0];
1323 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001324 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001325 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001326 layer.name = "60Hz ExplicitDefault";
1327 layer.focused = true;
1328
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001329 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001330}
1331
1332TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001333 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001334
Dominik Laskowski0c252702021-12-20 20:32:09 -08001335 RefreshRateConfigs::Policy policy;
1336 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1337 policy.allowGroupSwitching = true;
1338 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1339
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001340 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001341
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001342 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001343 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001344 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001345 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001346 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001347 layers[0].seamlessness = Seamlessness::OnlySeamless;
1348 layers[0].name = "60Hz ExplicitDefault";
1349 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001350
1351 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001352 layers[1].vote = LayerVoteType::ExplicitDefault;
1353 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001354 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001355 layers[1].name = "90Hz ExplicitDefault";
1356 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001357
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001358 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001359}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001360
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001361TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001362 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001363
Dominik Laskowski0c252702021-12-20 20:32:09 -08001364 RefreshRateConfigs::Policy policy;
1365 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1366 policy.allowGroupSwitching = true;
1367 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1368
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001369 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001370
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001371 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1372 // seamlessness=Default can't change the mode group back to the group of the default
1373 // mode.
1374 // For example, this may happen when a video playback requests and gets a seamed switch,
1375 // but another layer (with default seamlessness) starts animating. The animating layer
1376 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001377 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001378 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001379 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001380 layers[0].focused = true;
1381 layers[0].vote = LayerVoteType::ExplicitDefault;
1382 layers[0].name = "60Hz ExplicitDefault";
1383
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001384 layers.push_back(LayerRequirement{.weight = 0.1f});
1385 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001386 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001387 layers[1].focused = true;
1388 layers[1].vote = LayerVoteType::ExplicitDefault;
1389 layers[1].name = "90Hz ExplicitDefault";
1390
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001391 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001392}
1393
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001394TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001395 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001396
Dominik Laskowski0c252702021-12-20 20:32:09 -08001397 RefreshRateConfigs::Policy policy;
1398 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1399 policy.allowGroupSwitching = true;
1400 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1401
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001402 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001403
1404 // Layer with seamlessness=Default can change the mode group if there's a not
1405 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1406 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001407 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001408 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001409 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001410 layers[0].focused = true;
1411 layers[0].vote = LayerVoteType::ExplicitDefault;
1412 layers[0].name = "60Hz ExplicitDefault";
1413
1414 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001415 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001416 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001417 layers[1].focused = false;
1418 layers[1].vote = LayerVoteType::ExplicitDefault;
1419 layers[1].name = "90Hz ExplicitDefault";
1420
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001421 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001422}
1423
1424TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001425 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001426
1427 // Allow group switching.
1428 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001429 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001430 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001431 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001432
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001433 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001434 auto& layer = layers[0];
1435 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001436 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001437 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001438 layer.name = "60Hz ExplicitExactOrMultiple";
1439 layer.focused = true;
1440
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001441 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001442
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001443 configs.setActiveModeId(kModeId120);
1444 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001445}
1446
1447TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001448 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001449
1450 // Allow group switching.
1451 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001452 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001453 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001454 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001455
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001456 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1457 .vote = LayerVoteType::ExplicitDefault,
1458 .desiredRefreshRate = 60_Hz,
1459 .seamlessness = Seamlessness::SeamedAndSeamless,
1460 .weight = 0.5f,
1461 .focused = false},
1462 {.name = "25Hz ExplicitExactOrMultiple",
1463 .vote = LayerVoteType::ExplicitExactOrMultiple,
1464 .desiredRefreshRate = 25_Hz,
1465 .seamlessness = Seamlessness::OnlySeamless,
1466 .weight = 1.f,
1467 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001468
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001469 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001470
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001471 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001472 seamedLayer.desiredRefreshRate = 30_Hz;
1473 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001474 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001475
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001476 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001477}
1478
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001479TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001480 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001481
1482 // Allow group switching.
1483 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001484 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001485 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001486 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001487
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001488 std::vector<LayerRequirement> layers = {
1489 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001490
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001491 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001492}
1493
Steven Thomasf734df42020-04-13 21:09:28 -07001494TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001495 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001496
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001497 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001498 layers[0].name = "Test layer";
1499
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001500 struct Args {
1501 bool touch = false;
1502 bool focused = true;
1503 };
1504
Steven Thomasbb374322020-04-28 22:47:16 -07001505 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001506 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001507 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001508 layers[0].vote = voteType;
1509 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001510 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001511 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001512 };
1513
Dominik Laskowski0c252702021-12-20 20:32:09 -08001514 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1515
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001516 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001517 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1518 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1519 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1520 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1521 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1522 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001523
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001524 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001525 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1526 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001527 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001528
Steven Thomasf734df42020-04-13 21:09:28 -07001529 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001530 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1531
Steven Thomasf734df42020-04-13 21:09:28 -07001532 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1533 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001534 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1535 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001536 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001537
Dominik Laskowski0c252702021-12-20 20:32:09 -08001538 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1539
1540 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1541 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1542 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1543 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1544 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1545 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001546}
1547
Steven Thomasbb374322020-04-28 22:47:16 -07001548TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001549 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001550
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001551 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001552 layers[0].name = "Test layer";
1553
Marin Shalamanov23c44202020-12-22 19:09:20 +01001554 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001555 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001556 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001557
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001558 const auto [refreshRate, signals] =
1559 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1560
1561 // Refresh rate will be chosen by either touch state or idle state.
1562 EXPECT_EQ(!touchActive, signals.idle);
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001563 return refreshRate->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001564 };
1565
Dominik Laskowski0c252702021-12-20 20:32:09 -08001566 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001567
1568 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001569 {
1570 constexpr bool kTouchActive = true;
1571 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1572 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1573 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1574 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1575 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1576 EXPECT_EQ(kModeId90,
1577 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1578 }
Steven Thomasbb374322020-04-28 22:47:16 -07001579
1580 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001581 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001582
1583 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001584 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001585
1586 {
1587 constexpr bool kTouchActive = false;
1588 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1589 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1590 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1591 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1592 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1593 EXPECT_EQ(kModeId60,
1594 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1595 }
Steven Thomasbb374322020-04-28 22:47:16 -07001596
1597 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001598 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001599}
1600
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001601TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001602 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001603
1604 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001605 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1606 const Fps expectedFrameRate = [fps] {
1607 if (fps < 26.91f) return 24_Hz;
1608 if (fps < 37.51f) return 30_Hz;
1609 if (fps < 52.51f) return 45_Hz;
1610 if (fps < 66.01f) return 60_Hz;
1611 if (fps < 81.01f) return 72_Hz;
1612 return 90_Hz;
1613 }();
1614
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001616 }
1617}
1618
1619TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001620 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001621
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001622 struct Expectation {
1623 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001624 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001625 };
1626
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001627 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001628 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1629 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001630 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001631
1632 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001633 const auto& knownFrameRates = configs.knownFrameRates();
1634 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001635 knownFrameRatesExpectations.begin(),
1636 [](Fps fps, const Expectation& expected) {
1637 return isApproxEqual(fps, expected.fps);
1638 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001639 EXPECT_TRUE(equal);
1640
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001641 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001642 auto& layer = layers[0];
1643 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001644
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001645 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001646 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001647 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001648 }
1649}
1650
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001651TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001652 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001653
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001654 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001655 auto& explicitExactLayer = layers[0];
1656 auto& explicitExactOrMultipleLayer = layers[1];
1657
1658 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1659 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001660 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001661
1662 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1663 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001664 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001665
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001666 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
1667 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001668
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001669 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1670 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001671 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001672
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001673 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001674 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001675
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001676 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001677 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001678
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001679 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001680 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001681}
1682
1683TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001684 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1685 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001686
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001687 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001688 auto& explicitExactLayer = layers[0];
1689 auto& explicitExactOrMultipleLayer = layers[1];
1690
1691 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1692 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001693 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001694
1695 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1696 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001697 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001698
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001699 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1700 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001701
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001702 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1703 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001704 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001705
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001706 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001707 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001708
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001709 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001710 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001711
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001712 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001713 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001714}
1715
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001716TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001717 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001718
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001719 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1720 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1721 GlobalSignals{.touch = true, .idle = true});
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001722 const auto result = std::make_pair(kMode90, GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001723
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001724 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001725
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001726 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001727}
1728
1729TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001730 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1731
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001732 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001733
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001734 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001735 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001736
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001737 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001738
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001739 const auto& cache = configs.mutableGetBestRefreshRateCache();
1740 ASSERT_TRUE(cache);
1741
1742 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1743 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001744}
1745
Ady Abraham5e4e9832021-06-14 13:40:56 -07001746TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001747 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001748
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001749 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001750 auto& explicitExactLayer = layers[0];
1751 auto& explicitExactOrMultipleLayer = layers[1];
1752
1753 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1754 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001755 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001756
1757 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1758 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001759 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001760
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001761 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1762 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001763
1764 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1765
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001766 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1767 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001768}
1769
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001770TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001771 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1772 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001773
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001774 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001775 auto& explicitDefaultLayer = layers[0];
1776 auto& explicitExactOrMultipleLayer = layers[1];
1777
1778 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1779 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001780 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001781
1782 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1783 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001784 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001785
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001786 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001787}
1788
Ady Abraham05243be2021-09-16 15:58:52 -07001789// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001790TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001791 constexpr int kMinRefreshRate = 10;
1792 constexpr int kMaxRefreshRate = 240;
1793
1794 DisplayModes displayModes;
1795 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001796 const DisplayModeId modeId(fps);
1797 displayModes.try_emplace(modeId,
1798 createDisplayMode(modeId,
1799 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001800 }
1801
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001802 const TestableRefreshRateConfigs configs(std::move(displayModes),
1803 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07001804
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001805 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001806 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1807 layers[0].desiredRefreshRate = fps;
1808 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001809 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001810 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001811 };
1812
1813 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001814 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001815 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1816 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1817 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1818 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1819 }
1820}
1821
Ady Abraham1c595502022-01-13 21:58:32 -08001822// b/190578904
1823TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001824 constexpr DisplayModeId kActiveModeId{0};
1825 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
1826 createDisplayMode(DisplayModeId(1), 53_Hz),
1827 createDisplayMode(DisplayModeId(2), 55_Hz),
1828 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08001829
1830 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001831 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08001832
Dominik Laskowski0c252702021-12-20 20:32:09 -08001833 const std::vector<LayerRequirement> layers = {
1834 {
Ady Abraham1c595502022-01-13 21:58:32 -08001835 .vote = LayerVoteType::ExplicitDefault,
1836 .desiredRefreshRate = 43_Hz,
1837 .seamlessness = Seamlessness::SeamedAndSeamless,
1838 .weight = 0.41f,
1839 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001840 {
Ady Abraham1c595502022-01-13 21:58:32 -08001841 .vote = LayerVoteType::ExplicitExactOrMultiple,
1842 .desiredRefreshRate = 53_Hz,
1843 .seamlessness = Seamlessness::SeamedAndSeamless,
1844 .weight = 0.41f,
1845 },
1846 };
1847
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001848 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001849}
1850
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001851TEST_F(RefreshRateConfigsTest, modeComparison) {
1852 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
1853 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
1854 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07001855}
1856
1857TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001858 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001859
Dominik Laskowski0c252702021-12-20 20:32:09 -08001860 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1861
Ana Krulecb9afd792020-06-11 13:16:15 -07001862 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001863 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001864
1865 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001866 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1867 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001868
Ady Abrahama91605e2021-06-18 11:41:47 -07001869 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001870 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1871 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001872
1873 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001874 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1875 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001876}
1877
TreeHugger Robot758ab612021-06-22 19:17:29 +00001878TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001879 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001880
Dominik Laskowski0c252702021-12-20 20:32:09 -08001881 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1882
TreeHugger Robot758ab612021-06-22 19:17:29 +00001883 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001884 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1885 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001886
1887 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001888 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1889 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001890
1891 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001892 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1893 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001894
1895 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001896 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1897 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001898}
1899
Ady Abrahamcc315492022-02-17 17:06:39 -08001900TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001901 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001902
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001903 const auto frameRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001904 Fps displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001905 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001906
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001907 configs.setActiveModeId(kModeId60);
1908 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001909 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001910
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001911 configs.setActiveModeId(kModeId72);
1912 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001913 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001914
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001915 configs.setActiveModeId(kModeId90);
1916 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001917 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001918
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001919 configs.setActiveModeId(kModeId120);
1920 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001921 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001922
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001923 configs.setActiveModeId(kModeId90);
1924 displayRefreshRate = configs.getActiveMode()->getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001925 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001926
Ady Abrahamcc315492022-02-17 17:06:39 -08001927 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
1928 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
1929 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
1930 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001931}
1932
1933TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001934 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1935 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001936
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001937 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1938 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001939
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001940 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1941 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001942
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001943 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1944 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001945
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001946 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1947 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001948
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001949 const auto refreshRates = {23.976_Hz, 24_Hz, 25_Hz, 29.97_Hz, 30_Hz, 50_Hz, 59.94_Hz, 60_Hz};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001950 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001951 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001952 }
1953
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001954 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1955 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1956 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001957}
1958
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001959TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001960 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001961
Dominik Laskowski0c252702021-12-20 20:32:09 -08001962 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001963}
1964
1965TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001966 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1967 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001968
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001969 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001970 layers[0].name = "Test layer";
1971 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001972 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001973 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001974
1975 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1976 EXPECT_EQ(1u, frameRateOverrides.size());
1977 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1978 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001979
1980 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001981 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1982 EXPECT_EQ(1u, frameRateOverrides.size());
1983 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1984 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001985
1986 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001987 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1988 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001989
1990 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001991 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1992 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001993
1994 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001995 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1996 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001997
1998 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001999 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2000 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002001}
2002
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002003TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002004 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2005 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002006
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002007 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2008 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002009
2010 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002011 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002012 layers[0].vote = LayerVoteType::ExplicitDefault;
2013
2014 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002015 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002016 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002017 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002018
Dominik Laskowski0c252702021-12-20 20:32:09 -08002019 EXPECT_EQ(2u, frameRateOverrides.size());
2020 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2021 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2022 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2023 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002024
2025 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002026 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2027 EXPECT_EQ(1u, frameRateOverrides.size());
2028 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2029 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002030
2031 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002032 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2033 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002034}
2035
2036TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002037 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2038 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002039
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002040 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002041 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002042 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002043 layers[0].vote = LayerVoteType::ExplicitDefault;
2044
Dominik Laskowski0c252702021-12-20 20:32:09 -08002045 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2046 EXPECT_EQ(1u, frameRateOverrides.size());
2047 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2048 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002049
Dominik Laskowski0c252702021-12-20 20:32:09 -08002050 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2051 EXPECT_EQ(1u, frameRateOverrides.size());
2052 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2053 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002054
2055 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002056 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2057 EXPECT_EQ(1u, frameRateOverrides.size());
2058 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2059 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002060
Dominik Laskowski0c252702021-12-20 20:32:09 -08002061 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2062 EXPECT_EQ(1u, frameRateOverrides.size());
2063 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2064 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002065
2066 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002067 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2068 EXPECT_EQ(1u, frameRateOverrides.size());
2069 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2070 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002071
Dominik Laskowski0c252702021-12-20 20:32:09 -08002072 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2073 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002074}
2075
Alec Mouri0a1cc962019-03-14 12:33:02 -07002076} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002077} // namespace android::scheduler