blob: 620825f066e1f558f104247c2c36f3c43262c11f [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>
Dominik Laskowskif8734e02022-08-26 09:06:59 -070021#include <ftl/fake_guard.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070022#include <gmock/gmock.h>
23#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010024#include <ui/Size.h>
25
Alec Mouri0a1cc962019-03-14 12:33:02 -070026#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070027#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070028#include "Scheduler/RefreshRateConfigs.h"
Dominik Laskowskib0054a22022-03-03 09:03:06 -080029#include "mock/DisplayHardware/MockDisplayMode.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070030
31using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070032
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070033namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070034
Peiyong Line9d809e2020-04-14 13:10:48 -070035namespace hal = android::hardware::graphics::composer::hal;
36
Dominik Laskowski36dced82022-09-02 09:24:00 -070037using SetPolicyResult = RefreshRateConfigs::SetPolicyResult;
Ady Abraham8a82ba62020-01-17 12:43:17 -080038using LayerVoteType = RefreshRateConfigs::LayerVoteType;
39using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070040
Dominik Laskowskib0054a22022-03-03 09:03:06 -080041using mock::createDisplayMode;
42
Dominik Laskowski0c252702021-12-20 20:32:09 -080043struct TestableRefreshRateConfigs : RefreshRateConfigs {
44 using RefreshRateConfigs::RefreshRateConfigs;
ramindanid72ba162022-09-09 21:33:40 +000045 using RefreshRateConfigs::RefreshRateOrder;
Dominik Laskowski0c252702021-12-20 20:32:09 -080046
Dominik Laskowskif8734e02022-08-26 09:06:59 -070047 void setActiveModeId(DisplayModeId modeId) {
48 ftl::FakeGuard guard(kMainThreadContext);
49 return RefreshRateConfigs::setActiveModeId(modeId);
50 }
51
52 const DisplayMode& getActiveMode() const {
53 ftl::FakeGuard guard(kMainThreadContext);
54 return RefreshRateConfigs::getActiveMode();
55 }
56
Dominik Laskowskib0054a22022-03-03 09:03:06 -080057 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080058 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080059 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080060 }
61
Dominik Laskowskib0054a22022-03-03 09:03:06 -080062 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080063 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080064 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080065 }
66
Dominik Laskowskib0054a22022-03-03 09:03:06 -080067 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080068 std::lock_guard lock(mLock);
69 return getMinRefreshRateByPolicyLocked();
70 }
71
ramindanid72ba162022-09-09 21:33:40 +000072 DisplayModePtr getMaxRefreshRateByPolicy() const {
73 std::lock_guard lock(mLock);
74 return getMaxRefreshRateByPolicyLocked(getActiveModeItLocked()->second->getGroup());
75 }
76
77 std::vector<RefreshRateRanking> getRefreshRatesByPolicy(
78 std::optional<int> anchorGroupOpt, RefreshRateOrder refreshRateOrder) const {
79 std::lock_guard lock(mLock);
Ady Abraham37d46922022-10-05 13:08:51 -070080 return RefreshRateConfigs::
81 getRefreshRatesByPolicyLocked(anchorGroupOpt, refreshRateOrder,
82 /*preferredDisplayModeOpt*/ std::nullopt);
ramindanid72ba162022-09-09 21:33:40 +000083 }
84
Dominik Laskowski0c252702021-12-20 20:32:09 -080085 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
86
ramindanid72ba162022-09-09 21:33:40 +000087 using RefreshRateConfigs::GetRankedRefreshRatesCache;
88 auto& mutableGetRankedRefreshRatesCache() { return mGetRankedRefreshRatesCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080089
ramindanid72ba162022-09-09 21:33:40 +000090 auto getRankedRefreshRatesAndSignals(const std::vector<LayerRequirement>& layers,
91 GlobalSignals signals) const {
92 return RefreshRateConfigs::getRankedRefreshRates(layers, signals);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080093 }
94
Dominik Laskowskib0054a22022-03-03 09:03:06 -080095 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
96 GlobalSignals signals = {}) const {
ramindanid72ba162022-09-09 21:33:40 +000097 return getRankedRefreshRatesAndSignals(layers, signals).first.front().displayModePtr;
Dominik Laskowski0c252702021-12-20 20:32:09 -080098 }
Dominik Laskowski36dced82022-09-02 09:24:00 -070099
100 SetPolicyResult setPolicy(const PolicyVariant& policy) {
101 ftl::FakeGuard guard(kMainThreadContext);
102 return RefreshRateConfigs::setPolicy(policy);
103 }
104
105 SetPolicyResult setDisplayManagerPolicy(const DisplayManagerPolicy& policy) {
106 return setPolicy(policy);
107 }
Dominik Laskowski0c252702021-12-20 20:32:09 -0800108};
109
Alec Mouri0a1cc962019-03-14 12:33:02 -0700110class RefreshRateConfigsTest : public testing::Test {
111protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -0700112 RefreshRateConfigsTest();
113 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -0700114
Dominik Laskowski0c252702021-12-20 20:32:09 -0800115 static constexpr DisplayModeId kModeId60{0};
116 static constexpr DisplayModeId kModeId90{1};
117 static constexpr DisplayModeId kModeId72{2};
118 static constexpr DisplayModeId kModeId120{3};
119 static constexpr DisplayModeId kModeId30{4};
120 static constexpr DisplayModeId kModeId25{5};
121 static constexpr DisplayModeId kModeId50{6};
122 static constexpr DisplayModeId kModeId24{7};
123 static constexpr DisplayModeId kModeId24Frac{8};
124 static constexpr DisplayModeId kModeId30Frac{9};
125 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700126
Dominik Laskowski0c252702021-12-20 20:32:09 -0800127 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
128 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
129 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
130 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
131 static inline const DisplayModePtr kMode90_4K =
132 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
133 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
134 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
135 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
136 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
137 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
138 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
139 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
140 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
141 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
142 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
143 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
144 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700145
Dominik Laskowski0c252702021-12-20 20:32:09 -0800146 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800147 static inline const DisplayModes kModes_60 = makeModes(kMode60);
148 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
149 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
150 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
151 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
152 static inline const DisplayModes kModes_60_90_72_120 =
153 makeModes(kMode60, kMode90, kMode72, kMode120);
154 static inline const DisplayModes kModes_30_60_72_90_120 =
155 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100156
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800157 static inline const DisplayModes kModes_30_60 =
158 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
159 static inline const DisplayModes kModes_30_60_72_90 =
160 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
161 static inline const DisplayModes kModes_30_60_90 =
162 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
163 static inline const DisplayModes kModes_25_30_50_60 =
164 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
165 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700166
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200167 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800168 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
169 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
170 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700171};
172
173RefreshRateConfigsTest::RefreshRateConfigsTest() {
174 const ::testing::TestInfo* const test_info =
175 ::testing::UnitTest::GetInstance()->current_test_info();
176 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
177}
178
179RefreshRateConfigsTest::~RefreshRateConfigsTest() {
180 const ::testing::TestInfo* const test_info =
181 ::testing::UnitTest::GetInstance()->current_test_info();
182 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
183}
184
185namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700186
Dominik Laskowski0c252702021-12-20 20:32:09 -0800187TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
188 RefreshRateConfigs configs(kModes_60, kModeId60);
189 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700190}
191
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100192TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski36dced82022-09-02 09:24:00 -0700193 TestableRefreshRateConfigs configs(kModes_60, kModeId60);
194
195 EXPECT_EQ(SetPolicyResult::Invalid,
196 configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}));
197 EXPECT_EQ(SetPolicyResult::Invalid,
198 configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}));
199}
200
201TEST_F(RefreshRateConfigsTest, unchangedPolicy) {
202 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
203
204 EXPECT_EQ(SetPolicyResult::Changed,
205 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
206
207 EXPECT_EQ(SetPolicyResult::Unchanged,
208 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
209
210 // Override to the same policy.
211 EXPECT_EQ(SetPolicyResult::Unchanged,
212 configs.setPolicy(RefreshRateConfigs::OverridePolicy{kModeId90, {60_Hz, 90_Hz}}));
213
214 // Clear override to restore DisplayManagerPolicy.
215 EXPECT_EQ(SetPolicyResult::Unchanged,
216 configs.setPolicy(RefreshRateConfigs::NoOverridePolicy{}));
217
218 EXPECT_EQ(SetPolicyResult::Changed,
219 configs.setDisplayManagerPolicy({kModeId90, {30_Hz, 90_Hz}}));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100220}
221
Dominik Laskowski0c252702021-12-20 20:32:09 -0800222TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
223 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225 const auto minRate = configs.getMinSupportedRefreshRate();
226 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700227
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800228 EXPECT_EQ(kMode60, minRate);
229 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800230
Dominik Laskowski0c252702021-12-20 20:32:09 -0800231 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
232 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
233
234 EXPECT_EQ(minRateByPolicy, minRate);
235 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700236}
Ady Abraham2139f732019-11-13 18:56:40 -0800237
Dominik Laskowski0c252702021-12-20 20:32:09 -0800238TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
239 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800240
Dominik Laskowski0c252702021-12-20 20:32:09 -0800241 const auto minRate = configs.getMinRefreshRateByPolicy();
242 const auto performanceRate = configs.getMaxSupportedRefreshRate();
243 const auto minRate60 = configs.getMinRefreshRateByPolicy();
244 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800245
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800246 EXPECT_EQ(kMode60, minRate);
247 EXPECT_EQ(kMode60, minRate60);
248 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800249
Dominik Laskowski36dced82022-09-02 09:24:00 -0700250 EXPECT_EQ(SetPolicyResult::Changed,
251 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800252 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800253
Dominik Laskowski0c252702021-12-20 20:32:09 -0800254 const auto minRate90 = configs.getMinRefreshRateByPolicy();
255 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800257 EXPECT_EQ(kMode90_G1, performanceRate);
258 EXPECT_EQ(kMode90_G1, minRate90);
259 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700260}
261
Dominik Laskowski0c252702021-12-20 20:32:09 -0800262TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
263 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700264
Dominik Laskowski0c252702021-12-20 20:32:09 -0800265 const auto minRate = configs.getMinRefreshRateByPolicy();
266 const auto performanceRate = configs.getMaxSupportedRefreshRate();
267 const auto minRate60 = configs.getMinRefreshRateByPolicy();
268 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700269
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800270 EXPECT_EQ(kMode60, minRate);
271 EXPECT_EQ(kMode60, minRate60);
272 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700273
Dominik Laskowski36dced82022-09-02 09:24:00 -0700274 EXPECT_EQ(SetPolicyResult::Changed,
275 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800276 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700277
Dominik Laskowski0c252702021-12-20 20:32:09 -0800278 const auto minRate90 = configs.getMinRefreshRateByPolicy();
279 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700280
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800281 EXPECT_EQ(kMode90_4K, performanceRate);
282 EXPECT_EQ(kMode90_4K, minRate90);
283 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800284}
285
Dominik Laskowski0c252702021-12-20 20:32:09 -0800286TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
287 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800288
Dominik Laskowski0c252702021-12-20 20:32:09 -0800289 const auto minRate = configs.getMinRefreshRateByPolicy();
290 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800291
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800292 EXPECT_EQ(kMode60, minRate);
293 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800294
Dominik Laskowski36dced82022-09-02 09:24:00 -0700295 EXPECT_EQ(SetPolicyResult::Changed,
296 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800297
Dominik Laskowski0c252702021-12-20 20:32:09 -0800298 const auto minRate60 = configs.getMinRefreshRateByPolicy();
299 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
300
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800301 EXPECT_EQ(kMode60, minRate60);
302 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800303}
304
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800305TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800306 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800307 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700308 const auto& mode = configs.getActiveMode();
309 EXPECT_EQ(mode.getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800310 }
311
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800312 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800313 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700314 const auto& mode = configs.getActiveMode();
315 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800316 }
317
Dominik Laskowski36dced82022-09-02 09:24:00 -0700318 EXPECT_EQ(SetPolicyResult::Changed,
319 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800320 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700321 const auto& mode = configs.getActiveMode();
322 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800323 }
324}
325
Steven Thomasbb374322020-04-28 22:47:16 -0700326TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800327 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800328 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800329
Dominik Laskowski0c252702021-12-20 20:32:09 -0800330 // If there are no layers we select the default frame rate, which is the max of the primary
331 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800332 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800333
Dominik Laskowski36dced82022-09-02 09:24:00 -0700334 EXPECT_EQ(SetPolicyResult::Changed,
335 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800336 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800337 }
338 {
339 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800340 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800341 constexpr bool kAllowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -0700342 EXPECT_EQ(SetPolicyResult::Changed,
343 configs.setDisplayManagerPolicy(
344 {kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800345 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800346 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800347}
348
Ady Abraham37d46922022-10-05 13:08:51 -0700349TEST_F(RefreshRateConfigsTest, getBestRefreshRate_exactDontChangeRefreshRateWhenNotInPolicy) {
350 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId72);
351
352 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
353 layers[0].vote = LayerVoteType::ExplicitExact;
354 layers[0].desiredRefreshRate = 120_Hz;
355
356 EXPECT_EQ(SetPolicyResult::Changed,
357 configs.setDisplayManagerPolicy({kModeId72, {0_Hz, 90_Hz}}));
358 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
359}
360
Steven Thomasbb374322020-04-28 22:47:16 -0700361TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800362 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800363
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700364 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365 auto& lr = layers[0];
366
367 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800368 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800369 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
371 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800372 lr.name = "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;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800377 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800378 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700380 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800382 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700384 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800385 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800386 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700388 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800389 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800390 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700392 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800393 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800394 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800396 lr.name = "";
Dominik Laskowski36dced82022-09-02 09:24:00 -0700397 EXPECT_EQ(SetPolicyResult::Changed,
398 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
400 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800401 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
403 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800404 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800408 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800409
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700410 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800411 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700413 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800414 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700416 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800417 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700419 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800420 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
Dominik Laskowski36dced82022-09-02 09:24:00 -0700422 EXPECT_EQ(SetPolicyResult::Changed,
423 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
425 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800426 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
428 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800429 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700431 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800433 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700435 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800436 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700438 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800439 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800440
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700441 lr.desiredRefreshRate = 30_Hz;
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 = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800445 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Dominik Laskowski36dced82022-09-02 09:24:00 -0700447 EXPECT_EQ(SetPolicyResult::Changed,
448 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800450 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
452 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800453 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700455 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800457 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800458
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700459 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800460 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700462 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800463 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700465 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800466 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700468 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800469 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470}
471
rnlee3bd610662021-06-23 16:27:57 -0700472TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800473 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700474
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700475 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700476 auto& lr = layers[0];
477
478 lr.vote = LayerVoteType::Min;
479 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800480 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700481
482 lr.vote = LayerVoteType::Max;
483 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800484 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700485
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700486 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700487 lr.vote = LayerVoteType::Heuristic;
488 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800489 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700490
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700491 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700492 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800493 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700494
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700495 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700496 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800497 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700498
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700499 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700500 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800501 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700502
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700503 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700504 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800505 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700506}
507
Steven Thomasbb374322020-04-28 22:47:16 -0700508TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800509 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800510
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700511 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800512 auto& lr = layers[0];
513
514 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800515 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800516
517 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800518 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800519
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700520 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800521 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800522 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800523
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700524 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800525 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800526
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700527 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800528 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700530 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800531 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700533 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800534 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800535}
536
Steven Thomasbb374322020-04-28 22:47:16 -0700537TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800538 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800539
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700540 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541 auto& lr1 = layers[0];
542 auto& lr2 = layers[1];
543
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700544 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700546 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800548 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800549
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700550 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800551 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700552 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800554 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700556 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700558 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800559 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800560 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561}
562
Steven Thomasbb374322020-04-28 22:47:16 -0700563TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800564 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800565
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700566 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800567 auto& lr1 = layers[0];
568 auto& lr2 = layers[1];
569
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700570 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800572 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700573 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800574 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800575 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800576 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800577
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700578 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800579 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800580 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700581 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800582 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800583 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800584 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800585
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700586 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800587 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800588 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700589 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800590 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800591 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800592 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800593
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700594 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800595 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800596 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700597 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800598 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800600 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800601
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700602 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800603 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
604 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700605 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800606 lr2.vote = LayerVoteType::ExplicitDefault;
607 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800608 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800609
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700610 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800611 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700613 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800614 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800615 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800616 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800617
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700618 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800620 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700621 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800622 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800623 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800624 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800625
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700626 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700629 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800630 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800631 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800632 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800633
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700634 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800635 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700637 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800638 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800640 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800641}
642
rnlee3bd610662021-06-23 16:27:57 -0700643TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800644 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
645 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700646
Ady Abraham62f51d92022-08-24 22:20:22 +0000647 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700648 auto& lr1 = layers[0];
649 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000650 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700651
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700652 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700653 lr1.vote = LayerVoteType::ExplicitDefault;
654 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700655 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700656 lr2.vote = LayerVoteType::Heuristic;
657 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800658 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700659
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700660 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700661 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
662 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700663 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700664 lr2.vote = LayerVoteType::Heuristic;
665 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800666 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700667
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700668 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700669 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
670 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700671 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700672 lr2.vote = LayerVoteType::ExplicitDefault;
673 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800674 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700675
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700676 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700677 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
678 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700679 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700680 lr2.vote = LayerVoteType::Heuristic;
681 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800682 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700683
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700684 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700685 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
686 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700687 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700688 lr2.vote = LayerVoteType::ExplicitDefault;
689 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800690 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700692 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700693 lr1.vote = LayerVoteType::ExplicitDefault;
694 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700695 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700696 lr2.vote = LayerVoteType::Heuristic;
697 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800698 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700699
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700700 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700701 lr1.vote = LayerVoteType::Heuristic;
702 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700703 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700704 lr2.vote = LayerVoteType::ExplicitDefault;
705 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800706 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700707
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700708 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700709 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
710 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700711 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700712 lr2.vote = LayerVoteType::ExplicitDefault;
713 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800714 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700715
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700716 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700717 lr1.vote = LayerVoteType::ExplicitDefault;
718 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700719 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700720 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
721 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800722 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000723
724 lr1.desiredRefreshRate = 24_Hz;
725 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
726 lr1.name = "24Hz ExplicitExactOrMultiple";
727 lr2.vote = LayerVoteType::Max;
728 lr2.name = "Max";
729 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
730
731 lr1.desiredRefreshRate = 24_Hz;
732 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
733 lr1.name = "24Hz ExplicitExactOrMultiple";
734 lr2.desiredRefreshRate = 120_Hz;
735 lr2.vote = LayerVoteType::ExplicitDefault;
736 lr2.name = "120Hz ExplicitDefault";
737 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
738
739 lr1.desiredRefreshRate = 24_Hz;
740 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
741 lr1.name = "24Hz ExplicitExactOrMultiple";
742 lr2.desiredRefreshRate = 120_Hz;
743 lr2.vote = LayerVoteType::ExplicitExact;
744 lr2.name = "120Hz ExplicitExact";
745 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000746
747 lr1.desiredRefreshRate = 10_Hz;
748 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
749 lr1.name = "30Hz ExplicitExactOrMultiple";
750 lr2.desiredRefreshRate = 120_Hz;
751 lr2.vote = LayerVoteType::Heuristic;
752 lr2.name = "120Hz ExplicitExact";
753 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
754
755 lr1.desiredRefreshRate = 30_Hz;
756 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
757 lr1.name = "30Hz ExplicitExactOrMultiple";
758 lr2.desiredRefreshRate = 30_Hz;
759 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
760 lr2.name = "30Hz ExplicitExactOrMultiple";
761 lr3.vote = LayerVoteType::Heuristic;
762 lr3.desiredRefreshRate = 120_Hz;
763 lr3.name = "120Hz Heuristic";
764 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700765}
766
Steven Thomasbb374322020-04-28 22:47:16 -0700767TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800768 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800769
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700770 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771 auto& lr = layers[0];
772
773 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800774 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
776 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800777 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800778
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700779 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800781 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800782
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700783 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800784 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700786 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800787 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700789 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800790 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800791
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700792 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800793 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800794}
795
Steven Thomasbb374322020-04-28 22:47:16 -0700796TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800797 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700799 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800800 auto& lr = layers[0];
801
802 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800803 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800804 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
806 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800807 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800808 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700810 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800811 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800812 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800813 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700815 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800816 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800817 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
818 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700820 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800821 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800822 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
823 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800826 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800827 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
828 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700830 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800831 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800832 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
833 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800834
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700835 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800836 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
837 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800838 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
839 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840}
841
Steven Thomasbb374322020-04-28 22:47:16 -0700842TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800843 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700845 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800846 auto& lr1 = layers[0];
847 auto& lr2 = layers[1];
848
849 lr1.vote = LayerVoteType::Min;
850 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800851 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
853 lr1.vote = LayerVoteType::Min;
854 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700855 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800856 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800857
858 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800859 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700860 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800861 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862
863 lr1.vote = LayerVoteType::Max;
864 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700865 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800866 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800867
868 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800869 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700870 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800871 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800872
873 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700874 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800875 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700876 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800877 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800878
879 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700880 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800881 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700882 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800883 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884}
885
Steven Thomasbb374322020-04-28 22:47:16 -0700886TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800887 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800888
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800890 auto& lr = layers[0];
891
Ady Abraham71c437d2020-01-31 15:56:57 -0800892 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800893 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700894 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800895 const auto mode = configs.getBestRefreshRate(layers);
896 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
897 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800898 }
899}
900
rnlee3bd610662021-06-23 16:27:57 -0700901TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800902 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
903 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700904
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700905 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700906 auto& lr = layers[0];
907
908 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
909 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700910 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800911 const auto mode = configs.getBestRefreshRate(layers);
912 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
913 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700914 }
915}
916
Dominik Laskowski0c252702021-12-20 20:32:09 -0800917TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800918 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800919
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700920 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921 auto& lr1 = layers[0];
922 auto& lr2 = layers[1];
923
924 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700925 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800926 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700927 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800928 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800929
930 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700931 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800932 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700933 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800934 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800935
936 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700937 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800938 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700939 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800940 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800941}
942
Steven Thomasbb374322020-04-28 22:47:16 -0700943TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800944 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800945
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700946 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800947 auto& lr = layers[0];
948
Ady Abraham71c437d2020-01-31 15:56:57 -0800949 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800950 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700951 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800952 const auto mode = configs.getBestRefreshRate(layers, {});
953 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
954 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800955 }
956}
957
Steven Thomasbb374322020-04-28 22:47:16 -0700958TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800959 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800960
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700961 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800962 auto& lr1 = layers[0];
963 auto& lr2 = layers[1];
964
965 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700966 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800967 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800968 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700969 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800970 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800971 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800972
973 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700974 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800975 lr1.name = "60Hz ExplicitExactOrMultiple";
976 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700977 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800978 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800979 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800980
981 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700982 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800983 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800984 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800985 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800986 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800987
988 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700989 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800990 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800991 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700992 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800993 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800994 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800995
996 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700997 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800998 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800999 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001000 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001001 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001002}
1003
1004TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001005 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001007 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001008 auto& lr1 = layers[0];
1009 auto& lr2 = layers[1];
1010
1011 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001012 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001013 lr1.name = "60Hz ExplicitExactOrMultiple";
1014 lr2.vote = LayerVoteType::NoVote;
1015 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001016 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001017
1018 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001019 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001020 lr1.name = "60Hz ExplicitExactOrMultiple";
1021 lr2.vote = LayerVoteType::NoVote;
1022 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001023 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001024
1025 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001026 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001027 lr1.name = "60Hz ExplicitExactOrMultiple";
1028 lr2.vote = LayerVoteType::Max;
1029 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001030 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001031
1032 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001033 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001034 lr1.name = "60Hz ExplicitExactOrMultiple";
1035 lr2.vote = LayerVoteType::Max;
1036 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001037 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001038
1039 // The other layer starts to provide buffers
1040 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001041 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001042 lr1.name = "60Hz ExplicitExactOrMultiple";
1043 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001044 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001045 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001046 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001047}
1048
ramindanid72ba162022-09-09 21:33:40 +00001049TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicy) {
1050 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1051 // different group.
1052 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
1053 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
1054 RefreshRateRanking{kMode60},
1055 RefreshRateRanking{kMode30}};
1056
1057 const std::vector<RefreshRateRanking>& refreshRates =
1058 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1059 TestableRefreshRateConfigs::RefreshRateOrder::
1060 Descending);
1061
1062 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1063 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1064 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1065 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1066 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1067 }
1068}
1069
1070TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicy) {
1071 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1072 // different group.
1073 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
1074 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1075 RefreshRateRanking{kMode60},
1076 RefreshRateRanking{kMode90}};
1077
1078 const std::vector<RefreshRateRanking>& refreshRates =
1079 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1080 TestableRefreshRateConfigs::RefreshRateOrder::
1081 Ascending);
1082
1083 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1084 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1085 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1086 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1087 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1088 }
1089}
1090
1091TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicyOutsideTheGroup) {
1092 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1093 // different group.
1094 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1095 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1096 RefreshRateRanking{kMode60},
1097 RefreshRateRanking{kMode90}};
1098
Dominik Laskowski36dced82022-09-02 09:24:00 -07001099 EXPECT_EQ(SetPolicyResult::Changed,
1100 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001101
1102 const std::vector<RefreshRateRanking>& refreshRates =
1103 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1104 TestableRefreshRateConfigs::RefreshRateOrder::
1105 Ascending);
1106
1107 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1108 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1109 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1110 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1111 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1112 }
1113}
1114
1115TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicyOutsideTheGroup) {
1116 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1117 // different group.
1118 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1119 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
1120 RefreshRateRanking{kMode60},
1121 RefreshRateRanking{kMode30}};
1122
Dominik Laskowski36dced82022-09-02 09:24:00 -07001123 EXPECT_EQ(SetPolicyResult::Changed,
1124 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001125
1126 const std::vector<RefreshRateRanking>& refreshRates =
1127 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1128 TestableRefreshRateConfigs::RefreshRateOrder::
1129 Descending);
1130
1131 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1132 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1133 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1134 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1135 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1136 }
1137}
1138
ramindani38c84982022-08-29 18:02:57 +00001139TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) {
1140 RefreshRateConfigs configs(kModes_60_90, kModeId60);
ramindanid72ba162022-09-09 21:33:40 +00001141 std::vector<RefreshRateRanking> expectedRefreshRates = {RefreshRateRanking{kMode90},
1142 RefreshRateRanking{kMode60}};
ramindani38c84982022-08-29 18:02:57 +00001143
ramindanid72ba162022-09-09 21:33:40 +00001144 auto [refreshRates, signals] = configs.getRankedRefreshRates({}, {});
ramindani38c84982022-08-29 18:02:57 +00001145 EXPECT_FALSE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001146 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1147 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1148 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1149 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1150 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1151 }
ramindani38c84982022-08-29 18:02:57 +00001152
ramindanid72ba162022-09-09 21:33:40 +00001153 std::tie(refreshRates, signals) = configs.getRankedRefreshRates({}, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001154 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001155 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1156 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1157 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1158 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1159 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1160 }
ramindani38c84982022-08-29 18:02:57 +00001161
1162 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
1163 auto& lr1 = layers[0];
1164 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1165 lr1.desiredRefreshRate = 60_Hz;
1166 lr1.name = "60Hz ExplicitExactOrMultiple";
1167
ramindanid72ba162022-09-09 21:33:40 +00001168 std::tie(refreshRates, signals) =
1169 configs.getRankedRefreshRates(layers, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001170 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001171 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1172 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1173 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1174 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1175 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1176 }
1177
1178 expectedRefreshRates = {RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90}};
1179 std::tie(refreshRates, signals) =
1180 configs.getRankedRefreshRates(layers, {.powerOnImminent = false});
1181 EXPECT_FALSE(signals.powerOnImminent);
1182 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1183 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1184 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1185 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1186 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1187 }
ramindani38c84982022-08-29 18:02:57 +00001188}
1189
Ady Abraham6fb599b2020-03-05 13:48:22 -08001190TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001191 RefreshRateConfigs configs(kModes_60_90, kModeId60);
1192
ramindanid72ba162022-09-09 21:33:40 +00001193 auto [_, signals] = configs.getRankedRefreshRates({}, {});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001194 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001195
ramindanid72ba162022-09-09 21:33:40 +00001196 std::tie(std::ignore, signals) = configs.getRankedRefreshRates({}, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001197 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001198
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001199 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001200 auto& lr1 = layers[0];
1201 auto& lr2 = layers[1];
1202
1203 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001204 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001205 lr1.name = "60Hz ExplicitExactOrMultiple";
1206 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001207 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001208 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001209 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001210 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001211
1212 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001213 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001214 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001215 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001216 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001217 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001218 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001219 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001220
1221 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001222 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001223 lr1.name = "60Hz ExplicitExactOrMultiple";
1224 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001225 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001226 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001227 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001228 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001229
1230 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001231 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001232 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001233 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001234 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001235 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001236 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001237 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001238}
1239
Steven Thomasbb374322020-04-28 22:47:16 -07001240TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001241 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001242
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001243 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001244 auto& lr = layers[0];
1245
1246 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001247 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1248 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001249
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001250 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001251
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001252 {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 -08001253
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001254 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001255
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001256 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001257
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001258 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001259
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001260 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001261
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001262 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001263 };
1264
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001265 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001266 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001267 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001268
1269 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001270 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001271 lr.name = ss.str();
1272
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001273 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001274 }
1275}
1276
1277TEST_F(RefreshRateConfigsTest,
1278 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001279 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001280 auto& lr = layers[0];
1281
1282 // Test that 23.976 will choose 24 if 23.976 is not supported
1283 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001284 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1285 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001286 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001287
1288 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001289 lr.desiredRefreshRate = 23.976_Hz;
1290 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001291 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001292 }
1293
1294 // Test that 24 will choose 23.976 if 24 is not supported
1295 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001296 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1297 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001298 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001299
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001300 lr.desiredRefreshRate = 24_Hz;
1301 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001302 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001303 }
1304
1305 // Test that 29.97 will prefer 59.94 over 60 and 30
1306 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001307 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1308 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001309 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001310
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001311 lr.desiredRefreshRate = 29.97_Hz;
1312 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001313 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001314 }
1315}
1316
1317TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001318 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001319 auto& lr = layers[0];
1320
1321 // Test that voting for supported refresh rate will select this refresh rate
1322 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001323 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001324
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001325 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 +02001326 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001327 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001328 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001329 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001330 lr.name = ss.str();
1331
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001332 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001333 }
1334 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001335}
1336
Alec Mouri11232a22020-05-14 18:06:25 -07001337TEST_F(RefreshRateConfigsTest,
1338 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski36dced82022-09-02 09:24:00 -07001339 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001340
Dominik Laskowski36dced82022-09-02 09:24:00 -07001341 EXPECT_EQ(SetPolicyResult::Changed,
1342 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001343
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001344 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001345 auto& lr = layers[0];
1346
Alec Mouri11232a22020-05-14 18:06:25 -07001347 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001348 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001349 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001350 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001351
ramindanid72ba162022-09-09 21:33:40 +00001352 const auto [mode, signals] =
1353 configs.getRankedRefreshRates(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001354
ramindanid72ba162022-09-09 21:33:40 +00001355 EXPECT_EQ(mode.begin()->displayModePtr, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001356 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001357}
1358
1359TEST_F(RefreshRateConfigsTest,
1360 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001361 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001362
Dominik Laskowski36dced82022-09-02 09:24:00 -07001363 EXPECT_EQ(SetPolicyResult::Changed,
1364 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001365
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001366 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001367 auto& lr = layers[0];
1368
Alec Mouri11232a22020-05-14 18:06:25 -07001369 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001370 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001371 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001372 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001373 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001374}
1375
ramindanid72ba162022-09-09 21:33:40 +00001376TEST_F(RefreshRateConfigsTest, testDisplayModeOrdering) {
1377 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1378
1379 std::vector<LayerRequirement> layers = {{.weight = 1.f},
1380 {.weight = 1.f},
1381 {.weight = 1.f},
1382 {.weight = 1.f},
1383 {.weight = 1.f}};
1384 auto& lr1 = layers[0];
1385 auto& lr2 = layers[1];
1386 auto& lr3 = layers[2];
1387 auto& lr4 = layers[3];
1388 auto& lr5 = layers[4];
1389
1390 lr1.desiredRefreshRate = 90_Hz;
1391 lr1.name = "90Hz";
1392 lr1.focused = true;
1393
1394 lr2.desiredRefreshRate = 60_Hz;
1395 lr2.name = "60Hz";
1396 lr2.focused = true;
1397
1398 lr3.desiredRefreshRate = 72_Hz;
1399 lr3.name = "72Hz";
1400 lr3.focused = true;
1401
1402 lr4.desiredRefreshRate = 120_Hz;
1403 lr4.name = "120Hz";
1404 lr4.focused = true;
1405
1406 lr5.desiredRefreshRate = 30_Hz;
1407 lr5.name = "30Hz";
1408 lr5.focused = true;
1409
1410 std::vector<RefreshRateRanking> expectedRankings = {
1411 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1412 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1413 };
1414
1415 std::vector<RefreshRateRanking> actualOrder =
1416 configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1417 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1418 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1419 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1420 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1421 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1422 }
1423
1424 lr1.vote = LayerVoteType::Max;
1425 lr1.name = "Max";
1426
1427 lr2.desiredRefreshRate = 60_Hz;
1428 lr2.name = "60Hz";
1429
1430 lr3.desiredRefreshRate = 72_Hz;
1431 lr3.name = "72Hz";
1432
1433 lr4.desiredRefreshRate = 90_Hz;
1434 lr4.name = "90Hz";
1435
1436 lr5.desiredRefreshRate = 120_Hz;
1437 lr5.name = "120Hz";
1438
1439 expectedRankings = {
1440 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1441 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1442 };
1443
1444 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1445
1446 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1447 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1448 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1449 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1450 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1451 }
1452
1453 lr1.vote = LayerVoteType::Heuristic;
1454 lr1.desiredRefreshRate = 30_Hz;
1455 lr1.name = "30Hz";
1456
1457 lr2.desiredRefreshRate = 120_Hz;
1458 lr2.name = "120Hz";
1459
1460 lr3.desiredRefreshRate = 60_Hz;
1461 lr3.name = "60Hz";
1462
1463 lr5.desiredRefreshRate = 72_Hz;
1464 lr5.name = "72Hz";
1465
1466 expectedRankings = {
1467 RefreshRateRanking{kMode30}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90},
1468 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode72},
1469 };
1470
1471 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1472 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1473 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1474 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1475 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1476 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1477 }
1478
1479 lr1.desiredRefreshRate = 120_Hz;
1480 lr1.name = "120Hz";
1481 lr1.weight = 0.0f;
1482
1483 lr2.desiredRefreshRate = 60_Hz;
1484 lr2.name = "60Hz";
1485 lr2.vote = LayerVoteType::NoVote;
1486
1487 lr3.name = "60Hz-2";
1488 lr3.vote = LayerVoteType::Heuristic;
1489
1490 lr4.vote = LayerVoteType::ExplicitExact;
1491
1492 lr5.desiredRefreshRate = 120_Hz;
1493 lr5.name = "120Hz-2";
1494
1495 expectedRankings = {
1496 RefreshRateRanking{kMode90}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode120},
1497 RefreshRateRanking{kMode72}, RefreshRateRanking{kMode30},
1498 };
1499
1500 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1501 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1502 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1503 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1504 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1505 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1506 }
1507}
1508
Alec Mouri11232a22020-05-14 18:06:25 -07001509TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001510 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001511 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001512
Dominik Laskowski36dced82022-09-02 09:24:00 -07001513 EXPECT_EQ(SetPolicyResult::Changed,
1514 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001515
ramindanid72ba162022-09-09 21:33:40 +00001516 const auto [mode, signals] = configs.getRankedRefreshRatesAndSignals({}, {});
1517 EXPECT_EQ(mode.front().displayModePtr, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001518 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001519
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001520 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001521 auto& lr = layers[0];
1522
1523 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001524 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001525 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001526 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001527 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001528
1529 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001530 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001531
1532 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001533 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001534 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001535 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001536 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001537
1538 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001539 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001540
1541 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001542 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001543 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001544 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001545 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001546
1547 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001548 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001549
1550 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001551 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001552 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001553 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001554 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001555
1556 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001557 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001558
1559 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001560 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001561 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001562 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001563 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001564
1565 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001566 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001567}
1568
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001569TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001570 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001571
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001572 // The default policy doesn't allow group switching. Verify that no
1573 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001574 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001575 auto& layer = layers[0];
1576 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001577 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001578 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001579 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001580 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001581
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001582 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001583}
Steven Thomasd4071902020-03-24 16:02:53 -07001584
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001585TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001586 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1587
Dominik Laskowski36dced82022-09-02 09:24:00 -07001588 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001589 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001590 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001591 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001592
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001593 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001594 auto& layer = layers[0];
1595 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001596 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001597 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1598 layer.name = "90Hz ExplicitDefault";
1599 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001600 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001601}
1602
1603TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001604 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001605
Dominik Laskowski36dced82022-09-02 09:24:00 -07001606 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001607 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001608 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001609 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001610
1611 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001612 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001613 auto& layer = layers[0];
1614 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001616 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001617 layer.name = "90Hz ExplicitDefault";
1618 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001619 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001620}
1621
1622TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001623 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001624
Dominik Laskowski36dced82022-09-02 09:24:00 -07001625 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001626 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1627 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001628 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001629
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001630 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001631
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001632 // 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 -07001633 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001634 auto& layer = layers[0];
1635 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001636 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001637 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001638 layer.name = "60Hz ExplicitDefault";
1639 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001640 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001641}
1642
1643TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001644 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001645
Dominik Laskowski36dced82022-09-02 09:24:00 -07001646 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001647 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1648 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001649 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001650
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001651 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001652
1653 // Verify that if the current config is in another group and there are no layers with
1654 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001655
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001656 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001657 auto& layer = layers[0];
1658 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001659 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001660 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001661 layer.name = "60Hz ExplicitDefault";
1662 layer.focused = true;
1663
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001664 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001665}
1666
1667TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001668 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001669
Dominik Laskowski36dced82022-09-02 09:24:00 -07001670 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001671 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1672 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001673 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001674
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001675 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001676
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001677 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001678 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001679 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001680 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001681 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001682 layers[0].seamlessness = Seamlessness::OnlySeamless;
1683 layers[0].name = "60Hz ExplicitDefault";
1684 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001685
1686 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001687 layers[1].vote = LayerVoteType::ExplicitDefault;
1688 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001689 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001690 layers[1].name = "90Hz ExplicitDefault";
1691 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001692
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001693 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001694}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001695
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001696TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001697 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001698
Dominik Laskowski36dced82022-09-02 09:24:00 -07001699 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001700 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1701 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001702 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001703
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001704 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001705
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001706 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1707 // seamlessness=Default can't change the mode group back to the group of the default
1708 // mode.
1709 // For example, this may happen when a video playback requests and gets a seamed switch,
1710 // but another layer (with default seamlessness) starts animating. The animating layer
1711 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001712 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001713 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001714 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001715 layers[0].focused = true;
1716 layers[0].vote = LayerVoteType::ExplicitDefault;
1717 layers[0].name = "60Hz ExplicitDefault";
1718
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001719 layers.push_back(LayerRequirement{.weight = 0.1f});
1720 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001721 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001722 layers[1].focused = true;
1723 layers[1].vote = LayerVoteType::ExplicitDefault;
1724 layers[1].name = "90Hz ExplicitDefault";
1725
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001726 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001727}
1728
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001729TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001730 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001731
Dominik Laskowski36dced82022-09-02 09:24:00 -07001732 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001733 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1734 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001735 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001736
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001737 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001738
1739 // Layer with seamlessness=Default can change the mode group if there's a not
1740 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1741 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001742 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001743 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001744 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001745 layers[0].focused = true;
1746 layers[0].vote = LayerVoteType::ExplicitDefault;
1747 layers[0].name = "60Hz ExplicitDefault";
1748
1749 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001750 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001751 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001752 layers[1].focused = false;
1753 layers[1].vote = LayerVoteType::ExplicitDefault;
1754 layers[1].name = "90Hz ExplicitDefault";
1755
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001756 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001757}
1758
1759TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001760 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001761
1762 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001763 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001764 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001765 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001766 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001767
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001768 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001769 auto& layer = layers[0];
1770 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001771 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001772 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001773 layer.name = "60Hz ExplicitExactOrMultiple";
1774 layer.focused = true;
1775
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001776 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001777
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001778 configs.setActiveModeId(kModeId120);
1779 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001780}
1781
1782TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001783 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001784
1785 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001786 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001787 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001788 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001789 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001790
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001791 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1792 .vote = LayerVoteType::ExplicitDefault,
1793 .desiredRefreshRate = 60_Hz,
1794 .seamlessness = Seamlessness::SeamedAndSeamless,
1795 .weight = 0.5f,
1796 .focused = false},
1797 {.name = "25Hz ExplicitExactOrMultiple",
1798 .vote = LayerVoteType::ExplicitExactOrMultiple,
1799 .desiredRefreshRate = 25_Hz,
1800 .seamlessness = Seamlessness::OnlySeamless,
1801 .weight = 1.f,
1802 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001803
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001804 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001805
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001806 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001807 seamedLayer.desiredRefreshRate = 30_Hz;
1808 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001809 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001810
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001811 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001812}
1813
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001814TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001815 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001816
1817 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001818 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001819 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001820 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001821 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001822
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001823 std::vector<LayerRequirement> layers = {
1824 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001825
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001826 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001827}
1828
Steven Thomasf734df42020-04-13 21:09:28 -07001829TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001830 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001831
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001832 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001833 layers[0].name = "Test layer";
1834
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001835 struct Args {
1836 bool touch = false;
1837 bool focused = true;
1838 };
1839
Steven Thomasbb374322020-04-28 22:47:16 -07001840 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001841 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001842 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001843 layers[0].vote = voteType;
1844 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001845 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001846 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001847 };
1848
Dominik Laskowski36dced82022-09-02 09:24:00 -07001849 EXPECT_EQ(SetPolicyResult::Changed,
1850 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001851
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001852 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001853 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1854 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1855 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1856 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1857 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1858 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001859
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001860 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001861 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1862 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001863 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001864
Steven Thomasf734df42020-04-13 21:09:28 -07001865 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001866 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1867
Steven Thomasf734df42020-04-13 21:09:28 -07001868 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1869 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001870 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1871 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001872 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001873
Dominik Laskowski36dced82022-09-02 09:24:00 -07001874 EXPECT_EQ(SetPolicyResult::Changed,
1875 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001876
1877 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1878 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1879 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1880 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1881 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1882 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001883}
1884
Steven Thomasbb374322020-04-28 22:47:16 -07001885TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001886 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001887
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001888 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001889 layers[0].name = "Test layer";
1890
Marin Shalamanov23c44202020-12-22 19:09:20 +01001891 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001892 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001893 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001894
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001895 const auto [refreshRate, signals] =
ramindanid72ba162022-09-09 21:33:40 +00001896 configs.getRankedRefreshRatesAndSignals(layers,
1897 {.touch = touchActive, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001898
1899 // Refresh rate will be chosen by either touch state or idle state.
1900 EXPECT_EQ(!touchActive, signals.idle);
ramindanid72ba162022-09-09 21:33:40 +00001901 return refreshRate.front().displayModePtr->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001902 };
1903
Dominik Laskowski36dced82022-09-02 09:24:00 -07001904 EXPECT_EQ(SetPolicyResult::Changed,
1905 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Steven Thomasbb374322020-04-28 22:47:16 -07001906
1907 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001908 {
1909 constexpr bool kTouchActive = true;
1910 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1911 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1912 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1913 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1914 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1915 EXPECT_EQ(kModeId90,
1916 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1917 }
Steven Thomasbb374322020-04-28 22:47:16 -07001918
1919 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001920 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001921
1922 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001923 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001924
1925 {
1926 constexpr bool kTouchActive = false;
1927 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1928 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1929 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1930 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1931 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1932 EXPECT_EQ(kModeId60,
1933 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1934 }
Steven Thomasbb374322020-04-28 22:47:16 -07001935
1936 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001937 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001938}
1939
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001940TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001941 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001942
1943 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001944 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1945 const Fps expectedFrameRate = [fps] {
1946 if (fps < 26.91f) return 24_Hz;
1947 if (fps < 37.51f) return 30_Hz;
1948 if (fps < 52.51f) return 45_Hz;
1949 if (fps < 66.01f) return 60_Hz;
1950 if (fps < 81.01f) return 72_Hz;
1951 return 90_Hz;
1952 }();
1953
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001954 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001955 }
1956}
1957
1958TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001959 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001960
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001961 struct Expectation {
1962 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001963 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001964 };
1965
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001966 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001967 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1968 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001969 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001970
1971 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001972 const auto& knownFrameRates = configs.knownFrameRates();
1973 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001974 knownFrameRatesExpectations.begin(),
1975 [](Fps fps, const Expectation& expected) {
1976 return isApproxEqual(fps, expected.fps);
1977 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001978 EXPECT_TRUE(equal);
1979
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001980 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001981 auto& layer = layers[0];
1982 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001983
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001984 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001985 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001986 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001987 }
1988}
1989
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001990TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001991 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001992
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001993 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001994 auto& explicitExactLayer = layers[0];
1995 auto& explicitExactOrMultipleLayer = layers[1];
1996
1997 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1998 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001999 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002000
2001 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2002 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002003 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002004
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002005 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
2006 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002007
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002008 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2009 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002010 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002011
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002012 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002013 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002014
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002015 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002016 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002017
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002018 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002019 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002020}
2021
2022TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002023 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
2024 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002025
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002026 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002027 auto& explicitExactLayer = layers[0];
2028 auto& explicitExactOrMultipleLayer = layers[1];
2029
2030 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2031 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002032 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002033
2034 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2035 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002036 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002037
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002038 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2039 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002040
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002041 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2042 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002043 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002044
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002045 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002046 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002047
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002048 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002049 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002050
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002051 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002052 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002053}
2054
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002055TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002056 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002057
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002058 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2059 const auto args = std::make_pair(std::vector<LayerRequirement>{},
2060 GlobalSignals{.touch = true, .idle = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002061
ramindanid72ba162022-09-09 21:33:40 +00002062 const auto result = std::make_pair(std::vector<RefreshRateRanking>{RefreshRateRanking{kMode90}},
2063 GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002064
ramindanid72ba162022-09-09 21:33:40 +00002065 configs.mutableGetRankedRefreshRatesCache() = {args, result};
2066
2067 EXPECT_EQ(result, configs.getRankedRefreshRatesAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002068}
2069
2070TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002071 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
2072
ramindanid72ba162022-09-09 21:33:40 +00002073 EXPECT_FALSE(configs.mutableGetRankedRefreshRatesCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002074
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002075 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002076 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002077
ramindanid72ba162022-09-09 21:33:40 +00002078 const auto result = configs.getRankedRefreshRatesAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002079
ramindanid72ba162022-09-09 21:33:40 +00002080 const auto& cache = configs.mutableGetRankedRefreshRatesCache();
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002081 ASSERT_TRUE(cache);
2082
2083 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
2084 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002085}
2086
Ady Abraham5e4e9832021-06-14 13:40:56 -07002087TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002088 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07002089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002090 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002091 auto& explicitExactLayer = layers[0];
2092 auto& explicitExactOrMultipleLayer = layers[1];
2093
2094 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2095 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002096 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002097
2098 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2099 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002100 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002101
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002102 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2103 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002104
2105 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2106
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002107 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2108 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002109}
2110
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002111TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002112 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
2113 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002114
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002115 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002116 auto& explicitDefaultLayer = layers[0];
2117 auto& explicitExactOrMultipleLayer = layers[1];
2118
2119 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2120 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002121 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002122
2123 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2124 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002125 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002126
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002127 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002128}
2129
Ady Abraham05243be2021-09-16 15:58:52 -07002130// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08002131TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07002132 constexpr int kMinRefreshRate = 10;
2133 constexpr int kMaxRefreshRate = 240;
2134
2135 DisplayModes displayModes;
2136 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002137 const DisplayModeId modeId(fps);
2138 displayModes.try_emplace(modeId,
2139 createDisplayMode(modeId,
2140 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07002141 }
2142
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002143 const TestableRefreshRateConfigs configs(std::move(displayModes),
2144 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07002145
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002146 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07002147 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2148 layers[0].desiredRefreshRate = fps;
2149 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002150 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07002151 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07002152 };
2153
2154 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002155 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07002156 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2157 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2158 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2159 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2160 }
2161}
2162
Ady Abraham1c595502022-01-13 21:58:32 -08002163// b/190578904
2164TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002165 constexpr DisplayModeId kActiveModeId{0};
2166 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
2167 createDisplayMode(DisplayModeId(1), 53_Hz),
2168 createDisplayMode(DisplayModeId(2), 55_Hz),
2169 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08002170
2171 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002172 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08002173
Dominik Laskowski0c252702021-12-20 20:32:09 -08002174 const std::vector<LayerRequirement> layers = {
2175 {
Ady Abraham1c595502022-01-13 21:58:32 -08002176 .vote = LayerVoteType::ExplicitDefault,
2177 .desiredRefreshRate = 43_Hz,
2178 .seamlessness = Seamlessness::SeamedAndSeamless,
2179 .weight = 0.41f,
2180 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08002181 {
Ady Abraham1c595502022-01-13 21:58:32 -08002182 .vote = LayerVoteType::ExplicitExactOrMultiple,
2183 .desiredRefreshRate = 53_Hz,
2184 .seamlessness = Seamlessness::SeamedAndSeamless,
2185 .weight = 0.41f,
2186 },
2187 };
2188
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002189 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08002190}
2191
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002192TEST_F(RefreshRateConfigsTest, modeComparison) {
2193 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
2194 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
2195 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07002196}
2197
2198TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002199 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07002200
Dominik Laskowski36dced82022-09-02 09:24:00 -07002201 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002202
Dominik Laskowski36dced82022-09-02 09:24:00 -07002203 // setPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002204 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002205
Dominik Laskowski36dced82022-09-02 09:24:00 -07002206 // setPolicy(60, 90), current 60Hz => TurnOn.
2207 EXPECT_EQ(SetPolicyResult::Changed,
2208 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002209 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002210
Dominik Laskowski36dced82022-09-02 09:24:00 -07002211 // setPolicy(60, 60), current 60Hz => TurnOff
2212 EXPECT_EQ(SetPolicyResult::Changed,
2213 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002214 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002215
Dominik Laskowski36dced82022-09-02 09:24:00 -07002216 // setPolicy(90, 90), current 90Hz => TurnOff.
2217 EXPECT_EQ(SetPolicyResult::Changed,
2218 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002219 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002220}
2221
TreeHugger Robot758ab612021-06-22 19:17:29 +00002222TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002223 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00002224
Dominik Laskowski36dced82022-09-02 09:24:00 -07002225 TestableRefreshRateConfigs configs(kModes_60_120, kModeId120);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002226
Dominik Laskowski36dced82022-09-02 09:24:00 -07002227 // setPolicy(0, 60), current 60Hz => TurnOn.
2228 EXPECT_EQ(SetPolicyResult::Changed,
2229 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002230 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002231
Dominik Laskowski36dced82022-09-02 09:24:00 -07002232 // setPolicy(60, 60), current 60Hz => TurnOff.
2233 EXPECT_EQ(SetPolicyResult::Changed,
2234 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002235 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002236
Dominik Laskowski36dced82022-09-02 09:24:00 -07002237 // setPolicy(60, 120), current 60Hz => TurnOn.
2238 EXPECT_EQ(SetPolicyResult::Changed,
2239 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002240 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002241
Dominik Laskowski36dced82022-09-02 09:24:00 -07002242 // setPolicy(120, 120), current 120Hz => TurnOff.
2243 EXPECT_EQ(SetPolicyResult::Changed,
2244 configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002245 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002246}
2247
Ady Abrahamcc315492022-02-17 17:06:39 -08002248TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002249 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002250
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002251 const auto frameRate = 30_Hz;
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002252 Fps displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002253 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002254
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002255 configs.setActiveModeId(kModeId60);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002256 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002257 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002258
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002259 configs.setActiveModeId(kModeId72);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002260 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002261 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002262
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002263 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002264 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002265 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002266
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002267 configs.setActiveModeId(kModeId120);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002268 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002269 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002270
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002271 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002272 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002273 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002274
Ady Abrahamcc315492022-02-17 17:06:39 -08002275 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
2276 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
2277 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
2278 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002279}
2280
2281TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002282 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2283 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002284
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002285 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2286 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002287
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002288 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2289 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002290
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002291 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2292 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002293
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002294 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2295 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002296
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002297 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 +02002298 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002299 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002300 }
2301
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002302 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2303 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2304 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002305}
2306
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002307TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002308 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08002309
Dominik Laskowski0c252702021-12-20 20:32:09 -08002310 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002311}
2312
2313TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002314 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2315 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002316
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002317 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002318 layers[0].name = "Test layer";
2319 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002320 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002321 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002322
2323 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2324 EXPECT_EQ(1u, frameRateOverrides.size());
2325 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2326 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002327
2328 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002329 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2330 EXPECT_EQ(1u, frameRateOverrides.size());
2331 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2332 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002333
2334 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002335 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2336 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002337
2338 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002339 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2340 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002341
2342 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002343 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2344 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002345
2346 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002347 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2348 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002349}
2350
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002351TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002352 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2353 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002354
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002355 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2356 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002357
2358 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002359 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002360 layers[0].vote = LayerVoteType::ExplicitDefault;
2361
2362 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002363 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002364 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002365 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002366
Dominik Laskowski0c252702021-12-20 20:32:09 -08002367 EXPECT_EQ(2u, frameRateOverrides.size());
2368 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2369 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2370 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2371 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002372
2373 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002374 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2375 EXPECT_EQ(1u, frameRateOverrides.size());
2376 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2377 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002378
2379 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002380 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2381 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002382}
2383
2384TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002385 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2386 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002387
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002388 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002389 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002390 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002391 layers[0].vote = LayerVoteType::ExplicitDefault;
2392
Dominik Laskowski0c252702021-12-20 20:32:09 -08002393 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2394 EXPECT_EQ(1u, frameRateOverrides.size());
2395 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2396 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002397
Dominik Laskowski0c252702021-12-20 20:32:09 -08002398 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2399 EXPECT_EQ(1u, frameRateOverrides.size());
2400 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2401 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002402
2403 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002404 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2405 EXPECT_EQ(1u, frameRateOverrides.size());
2406 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2407 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002408
Dominik Laskowski0c252702021-12-20 20:32:09 -08002409 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2410 EXPECT_EQ(1u, frameRateOverrides.size());
2411 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2412 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002413
2414 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002415 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2416 EXPECT_EQ(1u, frameRateOverrides.size());
2417 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2418 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002419
Dominik Laskowski0c252702021-12-20 20:32:09 -08002420 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2421 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002422}
2423
Alec Mouri0a1cc962019-03-14 12:33:02 -07002424} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002425} // namespace android::scheduler