blob: 00f1b089e57de07f02ca64e2b5893125a5c1a839 [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);
80 return RefreshRateConfigs::getRefreshRatesByPolicyLocked(anchorGroupOpt, refreshRateOrder);
81 }
82
Dominik Laskowski0c252702021-12-20 20:32:09 -080083 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
84
ramindanid72ba162022-09-09 21:33:40 +000085 using RefreshRateConfigs::GetRankedRefreshRatesCache;
86 auto& mutableGetRankedRefreshRatesCache() { return mGetRankedRefreshRatesCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080087
ramindanid72ba162022-09-09 21:33:40 +000088 auto getRankedRefreshRatesAndSignals(const std::vector<LayerRequirement>& layers,
89 GlobalSignals signals) const {
90 return RefreshRateConfigs::getRankedRefreshRates(layers, signals);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080091 }
92
Dominik Laskowskib0054a22022-03-03 09:03:06 -080093 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
94 GlobalSignals signals = {}) const {
ramindanid72ba162022-09-09 21:33:40 +000095 return getRankedRefreshRatesAndSignals(layers, signals).first.front().displayModePtr;
Dominik Laskowski0c252702021-12-20 20:32:09 -080096 }
Dominik Laskowski36dced82022-09-02 09:24:00 -070097
98 SetPolicyResult setPolicy(const PolicyVariant& policy) {
99 ftl::FakeGuard guard(kMainThreadContext);
100 return RefreshRateConfigs::setPolicy(policy);
101 }
102
103 SetPolicyResult setDisplayManagerPolicy(const DisplayManagerPolicy& policy) {
104 return setPolicy(policy);
105 }
Dominik Laskowski0c252702021-12-20 20:32:09 -0800106};
107
Alec Mouri0a1cc962019-03-14 12:33:02 -0700108class RefreshRateConfigsTest : public testing::Test {
109protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -0700110 RefreshRateConfigsTest();
111 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -0700112
Dominik Laskowski0c252702021-12-20 20:32:09 -0800113 static constexpr DisplayModeId kModeId60{0};
114 static constexpr DisplayModeId kModeId90{1};
115 static constexpr DisplayModeId kModeId72{2};
116 static constexpr DisplayModeId kModeId120{3};
117 static constexpr DisplayModeId kModeId30{4};
118 static constexpr DisplayModeId kModeId25{5};
119 static constexpr DisplayModeId kModeId50{6};
120 static constexpr DisplayModeId kModeId24{7};
121 static constexpr DisplayModeId kModeId24Frac{8};
122 static constexpr DisplayModeId kModeId30Frac{9};
123 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700124
Dominik Laskowski0c252702021-12-20 20:32:09 -0800125 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
126 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
127 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
128 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
129 static inline const DisplayModePtr kMode90_4K =
130 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
131 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
132 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
133 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
134 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
135 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
136 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
137 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
138 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
139 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
140 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
141 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
142 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700143
Dominik Laskowski0c252702021-12-20 20:32:09 -0800144 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800145 static inline const DisplayModes kModes_60 = makeModes(kMode60);
146 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
147 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
148 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
149 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
150 static inline const DisplayModes kModes_60_90_72_120 =
151 makeModes(kMode60, kMode90, kMode72, kMode120);
152 static inline const DisplayModes kModes_30_60_72_90_120 =
153 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100154
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800155 static inline const DisplayModes kModes_30_60 =
156 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
157 static inline const DisplayModes kModes_30_60_72_90 =
158 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
159 static inline const DisplayModes kModes_30_60_90 =
160 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
161 static inline const DisplayModes kModes_25_30_50_60 =
162 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
163 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700164
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200165 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800166 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
167 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
168 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700169};
170
171RefreshRateConfigsTest::RefreshRateConfigsTest() {
172 const ::testing::TestInfo* const test_info =
173 ::testing::UnitTest::GetInstance()->current_test_info();
174 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
175}
176
177RefreshRateConfigsTest::~RefreshRateConfigsTest() {
178 const ::testing::TestInfo* const test_info =
179 ::testing::UnitTest::GetInstance()->current_test_info();
180 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
181}
182
183namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700184
Dominik Laskowski0c252702021-12-20 20:32:09 -0800185TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
186 RefreshRateConfigs configs(kModes_60, kModeId60);
187 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188}
189
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100190TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski36dced82022-09-02 09:24:00 -0700191 TestableRefreshRateConfigs configs(kModes_60, kModeId60);
192
193 EXPECT_EQ(SetPolicyResult::Invalid,
194 configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}));
195 EXPECT_EQ(SetPolicyResult::Invalid,
196 configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}));
197}
198
199TEST_F(RefreshRateConfigsTest, unchangedPolicy) {
200 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
201
202 EXPECT_EQ(SetPolicyResult::Changed,
203 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
204
205 EXPECT_EQ(SetPolicyResult::Unchanged,
206 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
207
208 // Override to the same policy.
209 EXPECT_EQ(SetPolicyResult::Unchanged,
210 configs.setPolicy(RefreshRateConfigs::OverridePolicy{kModeId90, {60_Hz, 90_Hz}}));
211
212 // Clear override to restore DisplayManagerPolicy.
213 EXPECT_EQ(SetPolicyResult::Unchanged,
214 configs.setPolicy(RefreshRateConfigs::NoOverridePolicy{}));
215
216 EXPECT_EQ(SetPolicyResult::Changed,
217 configs.setDisplayManagerPolicy({kModeId90, {30_Hz, 90_Hz}}));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100218}
219
Dominik Laskowski0c252702021-12-20 20:32:09 -0800220TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
221 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700222
Dominik Laskowski0c252702021-12-20 20:32:09 -0800223 const auto minRate = configs.getMinSupportedRefreshRate();
224 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700225
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800226 EXPECT_EQ(kMode60, minRate);
227 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800228
Dominik Laskowski0c252702021-12-20 20:32:09 -0800229 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
230 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
231
232 EXPECT_EQ(minRateByPolicy, minRate);
233 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700234}
Ady Abraham2139f732019-11-13 18:56:40 -0800235
Dominik Laskowski0c252702021-12-20 20:32:09 -0800236TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
237 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800238
Dominik Laskowski0c252702021-12-20 20:32:09 -0800239 const auto minRate = configs.getMinRefreshRateByPolicy();
240 const auto performanceRate = configs.getMaxSupportedRefreshRate();
241 const auto minRate60 = configs.getMinRefreshRateByPolicy();
242 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800243
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800244 EXPECT_EQ(kMode60, minRate);
245 EXPECT_EQ(kMode60, minRate60);
246 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800247
Dominik Laskowski36dced82022-09-02 09:24:00 -0700248 EXPECT_EQ(SetPolicyResult::Changed,
249 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800250 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800251
Dominik Laskowski0c252702021-12-20 20:32:09 -0800252 const auto minRate90 = configs.getMinRefreshRateByPolicy();
253 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800254
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800255 EXPECT_EQ(kMode90_G1, performanceRate);
256 EXPECT_EQ(kMode90_G1, minRate90);
257 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700258}
259
Dominik Laskowski0c252702021-12-20 20:32:09 -0800260TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
261 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700262
Dominik Laskowski0c252702021-12-20 20:32:09 -0800263 const auto minRate = configs.getMinRefreshRateByPolicy();
264 const auto performanceRate = configs.getMaxSupportedRefreshRate();
265 const auto minRate60 = configs.getMinRefreshRateByPolicy();
266 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700267
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800268 EXPECT_EQ(kMode60, minRate);
269 EXPECT_EQ(kMode60, minRate60);
270 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700271
Dominik Laskowski36dced82022-09-02 09:24:00 -0700272 EXPECT_EQ(SetPolicyResult::Changed,
273 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800274 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700275
Dominik Laskowski0c252702021-12-20 20:32:09 -0800276 const auto minRate90 = configs.getMinRefreshRateByPolicy();
277 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700278
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800279 EXPECT_EQ(kMode90_4K, performanceRate);
280 EXPECT_EQ(kMode90_4K, minRate90);
281 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800282}
283
Dominik Laskowski0c252702021-12-20 20:32:09 -0800284TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
285 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800286
Dominik Laskowski0c252702021-12-20 20:32:09 -0800287 const auto minRate = configs.getMinRefreshRateByPolicy();
288 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800289
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800290 EXPECT_EQ(kMode60, minRate);
291 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800292
Dominik Laskowski36dced82022-09-02 09:24:00 -0700293 EXPECT_EQ(SetPolicyResult::Changed,
294 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800295
Dominik Laskowski0c252702021-12-20 20:32:09 -0800296 const auto minRate60 = configs.getMinRefreshRateByPolicy();
297 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
298
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800299 EXPECT_EQ(kMode60, minRate60);
300 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800301}
302
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800303TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800304 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800305 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700306 const auto& mode = configs.getActiveMode();
307 EXPECT_EQ(mode.getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800308 }
309
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800310 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800311 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700312 const auto& mode = configs.getActiveMode();
313 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800314 }
315
Dominik Laskowski36dced82022-09-02 09:24:00 -0700316 EXPECT_EQ(SetPolicyResult::Changed,
317 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800318 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700319 const auto& mode = configs.getActiveMode();
320 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800321 }
322}
323
Steven Thomasbb374322020-04-28 22:47:16 -0700324TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800325 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800326 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800327
Dominik Laskowski0c252702021-12-20 20:32:09 -0800328 // If there are no layers we select the default frame rate, which is the max of the primary
329 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800330 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800331
Dominik Laskowski36dced82022-09-02 09:24:00 -0700332 EXPECT_EQ(SetPolicyResult::Changed,
333 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800334 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800335 }
336 {
337 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800338 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800339 constexpr bool kAllowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -0700340 EXPECT_EQ(SetPolicyResult::Changed,
341 configs.setDisplayManagerPolicy(
342 {kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800343 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800344 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800345}
346
Steven Thomasbb374322020-04-28 22:47:16 -0700347TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800348 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800349
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700350 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351 auto& lr = layers[0];
352
353 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800354 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800355 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800356
357 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800358 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800359 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800360
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700361 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800363 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800364 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700366 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800367 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800368 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700370 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800371 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800372 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800373
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700374 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800375 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800376 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700378 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800379 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800380 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800382 lr.name = "";
Dominik Laskowski36dced82022-09-02 09:24:00 -0700383 EXPECT_EQ(SetPolicyResult::Changed,
384 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
386 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800387 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800388
389 lr.vote = LayerVoteType::Max;
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 = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800393 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800394 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700396 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800397 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700399 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800400 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700402 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800403 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700405 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800406 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Dominik Laskowski36dced82022-09-02 09:24:00 -0700408 EXPECT_EQ(SetPolicyResult::Changed,
409 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800410
411 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800412 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
414 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800415 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700417 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800419 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700421 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800422 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700424 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800425 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700427 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800428 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700430 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800431 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
Dominik Laskowski36dced82022-09-02 09:24:00 -0700433 EXPECT_EQ(SetPolicyResult::Changed,
434 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800435 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800436 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
438 lr.vote = LayerVoteType::Max;
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 = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800443 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800444
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700445 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800446 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700448 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800449 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700451 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800452 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700454 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800455 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456}
457
rnlee3bd610662021-06-23 16:27:57 -0700458TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800459 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700460
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700461 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700462 auto& lr = layers[0];
463
464 lr.vote = LayerVoteType::Min;
465 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800466 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700467
468 lr.vote = LayerVoteType::Max;
469 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800470 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700471
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700472 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700473 lr.vote = LayerVoteType::Heuristic;
474 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800475 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700477 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700478 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800479 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700481 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700482 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800483 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700484
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700485 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700486 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800487 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700488
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700489 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700490 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800491 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700492}
493
Steven Thomasbb374322020-04-28 22:47:16 -0700494TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800495 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800496
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700497 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498 auto& lr = layers[0];
499
500 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800501 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800502
503 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800504 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800505
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700506 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800507 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800508 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800509
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700510 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800511 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800512
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700513 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800514 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800515
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700516 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800517 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800518
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700519 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800520 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800521}
522
Steven Thomasbb374322020-04-28 22:47:16 -0700523TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800524 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800525
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700526 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800527 auto& lr1 = layers[0];
528 auto& lr2 = layers[1];
529
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700530 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800531 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700532 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800533 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800534 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800535
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700536 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800537 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700538 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800539 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800540 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700542 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800543 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700544 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800546 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547}
548
Steven Thomasbb374322020-04-28 22:47:16 -0700549TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800550 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800551
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700552 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800553 auto& lr1 = layers[0];
554 auto& lr2 = layers[1];
555
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700556 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800557 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800558 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700559 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800560 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800561 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800562 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800563
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700564 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800565 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800566 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700567 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800568 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800569 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800570 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800571
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700572 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800573 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800574 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700575 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800576 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800577 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800578 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800579
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700580 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800581 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800582 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700583 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800584 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800585 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800586 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800587
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700588 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800589 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
590 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700591 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800592 lr2.vote = LayerVoteType::ExplicitDefault;
593 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800594 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800595
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700596 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800597 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800598 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700599 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800600 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800601 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800602 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800603
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700604 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800605 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800606 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700607 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800608 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800609 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800610 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800611
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700612 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800613 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800614 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700615 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800616 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800617 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800618 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800619
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700620 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800621 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800622 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700623 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800624 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800625 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800626 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800627}
628
rnlee3bd610662021-06-23 16:27:57 -0700629TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800630 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
631 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700632
Ady Abraham62f51d92022-08-24 22:20:22 +0000633 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700634 auto& lr1 = layers[0];
635 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000636 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700637
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700639 lr1.vote = LayerVoteType::ExplicitDefault;
640 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700641 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700642 lr2.vote = LayerVoteType::Heuristic;
643 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800644 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700645
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700646 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700647 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
648 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700649 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700650 lr2.vote = LayerVoteType::Heuristic;
651 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800652 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700653
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700654 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700655 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
656 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700657 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700658 lr2.vote = LayerVoteType::ExplicitDefault;
659 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800660 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700661
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700662 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700663 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
664 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700665 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700666 lr2.vote = LayerVoteType::Heuristic;
667 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800668 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700669
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700670 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700671 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
672 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700673 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700674 lr2.vote = LayerVoteType::ExplicitDefault;
675 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800676 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700677
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700678 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700679 lr1.vote = LayerVoteType::ExplicitDefault;
680 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700681 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700682 lr2.vote = LayerVoteType::Heuristic;
683 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800684 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700685
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700686 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700687 lr1.vote = LayerVoteType::Heuristic;
688 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700689 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700690 lr2.vote = LayerVoteType::ExplicitDefault;
691 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800692 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700693
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700694 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700695 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
696 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700697 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700698 lr2.vote = LayerVoteType::ExplicitDefault;
699 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800700 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700701
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700702 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700703 lr1.vote = LayerVoteType::ExplicitDefault;
704 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700705 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700706 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
707 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800708 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000709
710 lr1.desiredRefreshRate = 24_Hz;
711 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
712 lr1.name = "24Hz ExplicitExactOrMultiple";
713 lr2.vote = LayerVoteType::Max;
714 lr2.name = "Max";
715 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
716
717 lr1.desiredRefreshRate = 24_Hz;
718 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
719 lr1.name = "24Hz ExplicitExactOrMultiple";
720 lr2.desiredRefreshRate = 120_Hz;
721 lr2.vote = LayerVoteType::ExplicitDefault;
722 lr2.name = "120Hz ExplicitDefault";
723 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
724
725 lr1.desiredRefreshRate = 24_Hz;
726 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
727 lr1.name = "24Hz ExplicitExactOrMultiple";
728 lr2.desiredRefreshRate = 120_Hz;
729 lr2.vote = LayerVoteType::ExplicitExact;
730 lr2.name = "120Hz ExplicitExact";
731 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000732
733 lr1.desiredRefreshRate = 10_Hz;
734 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
735 lr1.name = "30Hz ExplicitExactOrMultiple";
736 lr2.desiredRefreshRate = 120_Hz;
737 lr2.vote = LayerVoteType::Heuristic;
738 lr2.name = "120Hz ExplicitExact";
739 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
740
741 lr1.desiredRefreshRate = 30_Hz;
742 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
743 lr1.name = "30Hz ExplicitExactOrMultiple";
744 lr2.desiredRefreshRate = 30_Hz;
745 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
746 lr2.name = "30Hz ExplicitExactOrMultiple";
747 lr3.vote = LayerVoteType::Heuristic;
748 lr3.desiredRefreshRate = 120_Hz;
749 lr3.name = "120Hz Heuristic";
750 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700751}
752
Steven Thomasbb374322020-04-28 22:47:16 -0700753TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800754 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700756 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800757 auto& lr = layers[0];
758
759 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800760 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800761
762 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800763 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800764
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700765 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800766 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800767 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800768
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700769 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800770 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700772 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800773 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800774
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700775 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800776 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700778 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800779 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780}
781
Steven Thomasbb374322020-04-28 22:47:16 -0700782TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800783 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800784
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700785 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800786 auto& lr = layers[0];
787
788 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800789 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800790 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800791
792 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800793 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800794 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700796 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800797 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800798 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800799 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800800
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700801 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800802 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800803 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
804 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700806 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800807 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800808 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
809 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700811 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800812 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800813 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
814 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700816 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800817 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800818 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
819 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800820
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700821 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800822 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
823 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800824 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
825 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826}
827
Steven Thomasbb374322020-04-28 22:47:16 -0700828TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800829 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800830
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700831 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800832 auto& lr1 = layers[0];
833 auto& lr2 = layers[1];
834
835 lr1.vote = LayerVoteType::Min;
836 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800837 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800838
839 lr1.vote = LayerVoteType::Min;
840 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700841 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800842 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800843
844 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800845 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700846 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800847 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800848
849 lr1.vote = LayerVoteType::Max;
850 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800852 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853
854 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800855 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700856 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800857 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858
859 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700860 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800861 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700862 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800863 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800864
865 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700866 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800867 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700868 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800869 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800870}
871
Steven Thomasbb374322020-04-28 22:47:16 -0700872TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800873 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800874
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700875 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800876 auto& lr = layers[0];
877
Ady Abraham71c437d2020-01-31 15:56:57 -0800878 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800879 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700880 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800881 const auto mode = configs.getBestRefreshRate(layers);
882 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
883 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884 }
885}
886
rnlee3bd610662021-06-23 16:27:57 -0700887TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800888 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
889 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700890
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700891 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700892 auto& lr = layers[0];
893
894 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
895 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700896 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800897 const auto mode = configs.getBestRefreshRate(layers);
898 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
899 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700900 }
901}
902
Dominik Laskowski0c252702021-12-20 20:32:09 -0800903TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800904 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800905
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700906 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800907 auto& lr1 = layers[0];
908 auto& lr2 = layers[1];
909
910 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700911 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800912 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700913 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800914 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800915
916 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700917 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800918 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700919 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800920 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921
922 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700923 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800924 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700925 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800926 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800927}
928
Steven Thomasbb374322020-04-28 22:47:16 -0700929TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800930 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800931
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700932 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800933 auto& lr = layers[0];
934
Ady Abraham71c437d2020-01-31 15:56:57 -0800935 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800936 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700937 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800938 const auto mode = configs.getBestRefreshRate(layers, {});
939 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
940 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800941 }
942}
943
Steven Thomasbb374322020-04-28 22:47:16 -0700944TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800945 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800946
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700947 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800948 auto& lr1 = layers[0];
949 auto& lr2 = layers[1];
950
951 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700952 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800953 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800954 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700955 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800956 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800957 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800958
959 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700960 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800961 lr1.name = "60Hz ExplicitExactOrMultiple";
962 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700963 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800964 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800965 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800966
967 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700968 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800969 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800970 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800971 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800972 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800973
974 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700975 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800976 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800977 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700978 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800979 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800980 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800981
982 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700983 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800984 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800985 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800986 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800987 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800988}
989
990TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800991 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800992
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700993 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800994 auto& lr1 = layers[0];
995 auto& lr2 = layers[1];
996
997 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700998 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800999 lr1.name = "60Hz ExplicitExactOrMultiple";
1000 lr2.vote = LayerVoteType::NoVote;
1001 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001002 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001003
1004 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001005 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006 lr1.name = "60Hz ExplicitExactOrMultiple";
1007 lr2.vote = LayerVoteType::NoVote;
1008 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001009 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001010
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::Max;
1015 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001016 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
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::Max;
1022 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001023 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001024
1025 // The other layer starts to provide buffers
1026 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001027 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001028 lr1.name = "60Hz ExplicitExactOrMultiple";
1029 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001030 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001031 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001032 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001033}
1034
ramindanid72ba162022-09-09 21:33:40 +00001035TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicy) {
1036 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1037 // different group.
1038 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
1039 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
1040 RefreshRateRanking{kMode60},
1041 RefreshRateRanking{kMode30}};
1042
1043 const std::vector<RefreshRateRanking>& refreshRates =
1044 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1045 TestableRefreshRateConfigs::RefreshRateOrder::
1046 Descending);
1047
1048 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1049 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1050 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1051 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1052 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1053 }
1054}
1055
1056TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicy) {
1057 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1058 // different group.
1059 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
1060 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1061 RefreshRateRanking{kMode60},
1062 RefreshRateRanking{kMode90}};
1063
1064 const std::vector<RefreshRateRanking>& refreshRates =
1065 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1066 TestableRefreshRateConfigs::RefreshRateOrder::
1067 Ascending);
1068
1069 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1070 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1071 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1072 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1073 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1074 }
1075}
1076
1077TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicyOutsideTheGroup) {
1078 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1079 // different group.
1080 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1081 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1082 RefreshRateRanking{kMode60},
1083 RefreshRateRanking{kMode90}};
1084
Dominik Laskowski36dced82022-09-02 09:24:00 -07001085 EXPECT_EQ(SetPolicyResult::Changed,
1086 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001087
1088 const std::vector<RefreshRateRanking>& refreshRates =
1089 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1090 TestableRefreshRateConfigs::RefreshRateOrder::
1091 Ascending);
1092
1093 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1094 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1095 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1096 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1097 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1098 }
1099}
1100
1101TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicyOutsideTheGroup) {
1102 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1103 // different group.
1104 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1105 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
1106 RefreshRateRanking{kMode60},
1107 RefreshRateRanking{kMode30}};
1108
Dominik Laskowski36dced82022-09-02 09:24:00 -07001109 EXPECT_EQ(SetPolicyResult::Changed,
1110 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001111
1112 const std::vector<RefreshRateRanking>& refreshRates =
1113 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1114 TestableRefreshRateConfigs::RefreshRateOrder::
1115 Descending);
1116
1117 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1118 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1119 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1120 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1121 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1122 }
1123}
1124
ramindani38c84982022-08-29 18:02:57 +00001125TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) {
1126 RefreshRateConfigs configs(kModes_60_90, kModeId60);
ramindanid72ba162022-09-09 21:33:40 +00001127 std::vector<RefreshRateRanking> expectedRefreshRates = {RefreshRateRanking{kMode90},
1128 RefreshRateRanking{kMode60}};
ramindani38c84982022-08-29 18:02:57 +00001129
ramindanid72ba162022-09-09 21:33:40 +00001130 auto [refreshRates, signals] = configs.getRankedRefreshRates({}, {});
ramindani38c84982022-08-29 18:02:57 +00001131 EXPECT_FALSE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001132 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1133 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1134 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1135 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1136 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1137 }
ramindani38c84982022-08-29 18:02:57 +00001138
ramindanid72ba162022-09-09 21:33:40 +00001139 std::tie(refreshRates, signals) = configs.getRankedRefreshRates({}, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001140 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001141 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1142 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1143 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1144 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1145 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1146 }
ramindani38c84982022-08-29 18:02:57 +00001147
1148 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
1149 auto& lr1 = layers[0];
1150 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1151 lr1.desiredRefreshRate = 60_Hz;
1152 lr1.name = "60Hz ExplicitExactOrMultiple";
1153
ramindanid72ba162022-09-09 21:33:40 +00001154 std::tie(refreshRates, signals) =
1155 configs.getRankedRefreshRates(layers, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001156 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001157 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1158 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1159 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1160 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1161 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1162 }
1163
1164 expectedRefreshRates = {RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90}};
1165 std::tie(refreshRates, signals) =
1166 configs.getRankedRefreshRates(layers, {.powerOnImminent = false});
1167 EXPECT_FALSE(signals.powerOnImminent);
1168 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1169 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1170 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1171 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1172 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1173 }
ramindani38c84982022-08-29 18:02:57 +00001174}
1175
Ady Abraham6fb599b2020-03-05 13:48:22 -08001176TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001177 RefreshRateConfigs configs(kModes_60_90, kModeId60);
1178
ramindanid72ba162022-09-09 21:33:40 +00001179 auto [_, signals] = configs.getRankedRefreshRates({}, {});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001180 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001181
ramindanid72ba162022-09-09 21:33:40 +00001182 std::tie(std::ignore, signals) = configs.getRankedRefreshRates({}, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001183 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001184
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001185 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001186 auto& lr1 = layers[0];
1187 auto& lr2 = layers[1];
1188
1189 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001190 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001191 lr1.name = "60Hz ExplicitExactOrMultiple";
1192 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001193 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001194 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001195 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001196 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001197
1198 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001199 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001200 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001201 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001202 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001203 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001204 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001205 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001206
1207 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001208 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001209 lr1.name = "60Hz ExplicitExactOrMultiple";
1210 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001211 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001212 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001213 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001214 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001215
1216 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001217 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001218 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001219 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001220 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001221 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001222 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001223 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001224}
1225
Steven Thomasbb374322020-04-28 22:47:16 -07001226TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001227 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001228
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001229 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001230 auto& lr = layers[0];
1231
1232 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001233 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1234 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001235
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001236 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001237
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001238 {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 -08001239
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001240 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001241
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001242 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001243
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001244 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001245
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001246 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001247
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001248 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001249 };
1250
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001251 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001252 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001253 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001254
1255 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001256 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001257 lr.name = ss.str();
1258
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001259 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001260 }
1261}
1262
1263TEST_F(RefreshRateConfigsTest,
1264 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001265 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001266 auto& lr = layers[0];
1267
1268 // Test that 23.976 will choose 24 if 23.976 is not supported
1269 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001270 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1271 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001272 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001273
1274 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001275 lr.desiredRefreshRate = 23.976_Hz;
1276 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001277 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001278 }
1279
1280 // Test that 24 will choose 23.976 if 24 is not supported
1281 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001282 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1283 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001284 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001285
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001286 lr.desiredRefreshRate = 24_Hz;
1287 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001288 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001289 }
1290
1291 // Test that 29.97 will prefer 59.94 over 60 and 30
1292 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001293 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1294 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001295 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001296
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001297 lr.desiredRefreshRate = 29.97_Hz;
1298 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001299 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001300 }
1301}
1302
1303TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001304 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001305 auto& lr = layers[0];
1306
1307 // Test that voting for supported refresh rate will select this refresh rate
1308 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001309 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001310
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001311 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 +02001312 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001313 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001314 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001315 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001316 lr.name = ss.str();
1317
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001318 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001319 }
1320 }
1321
1322 // Test that 23.976 will choose 24 if 23.976 is not supported
1323 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001324 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1325 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001326 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001327
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001328 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001329 lr.desiredRefreshRate = 23.976_Hz;
1330 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001331 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001332 }
1333
1334 // Test that 24 will choose 23.976 if 24 is not supported
1335 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001336 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1337 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001338 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001339
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001340 lr.desiredRefreshRate = 24_Hz;
1341 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001342 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001343 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001344}
1345
Alec Mouri11232a22020-05-14 18:06:25 -07001346TEST_F(RefreshRateConfigsTest,
1347 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski36dced82022-09-02 09:24:00 -07001348 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001349
Dominik Laskowski36dced82022-09-02 09:24:00 -07001350 EXPECT_EQ(SetPolicyResult::Changed,
1351 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001352
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001353 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001354 auto& lr = layers[0];
1355
Alec Mouri11232a22020-05-14 18:06:25 -07001356 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001357 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001358 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001359 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001360
ramindanid72ba162022-09-09 21:33:40 +00001361 const auto [mode, signals] =
1362 configs.getRankedRefreshRates(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001363
ramindanid72ba162022-09-09 21:33:40 +00001364 EXPECT_EQ(mode.begin()->displayModePtr, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001365 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001366}
1367
1368TEST_F(RefreshRateConfigsTest,
1369 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001370 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001371
Dominik Laskowski36dced82022-09-02 09:24:00 -07001372 EXPECT_EQ(SetPolicyResult::Changed,
1373 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001374
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001375 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001376 auto& lr = layers[0];
1377
Alec Mouri11232a22020-05-14 18:06:25 -07001378 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001379 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001380 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001381 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001382 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001383}
1384
ramindanid72ba162022-09-09 21:33:40 +00001385TEST_F(RefreshRateConfigsTest, testDisplayModeOrdering) {
1386 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1387
1388 std::vector<LayerRequirement> layers = {{.weight = 1.f},
1389 {.weight = 1.f},
1390 {.weight = 1.f},
1391 {.weight = 1.f},
1392 {.weight = 1.f}};
1393 auto& lr1 = layers[0];
1394 auto& lr2 = layers[1];
1395 auto& lr3 = layers[2];
1396 auto& lr4 = layers[3];
1397 auto& lr5 = layers[4];
1398
1399 lr1.desiredRefreshRate = 90_Hz;
1400 lr1.name = "90Hz";
1401 lr1.focused = true;
1402
1403 lr2.desiredRefreshRate = 60_Hz;
1404 lr2.name = "60Hz";
1405 lr2.focused = true;
1406
1407 lr3.desiredRefreshRate = 72_Hz;
1408 lr3.name = "72Hz";
1409 lr3.focused = true;
1410
1411 lr4.desiredRefreshRate = 120_Hz;
1412 lr4.name = "120Hz";
1413 lr4.focused = true;
1414
1415 lr5.desiredRefreshRate = 30_Hz;
1416 lr5.name = "30Hz";
1417 lr5.focused = true;
1418
1419 std::vector<RefreshRateRanking> expectedRankings = {
1420 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1421 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1422 };
1423
1424 std::vector<RefreshRateRanking> actualOrder =
1425 configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1426 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1427 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1428 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1429 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1430 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1431 }
1432
1433 lr1.vote = LayerVoteType::Max;
1434 lr1.name = "Max";
1435
1436 lr2.desiredRefreshRate = 60_Hz;
1437 lr2.name = "60Hz";
1438
1439 lr3.desiredRefreshRate = 72_Hz;
1440 lr3.name = "72Hz";
1441
1442 lr4.desiredRefreshRate = 90_Hz;
1443 lr4.name = "90Hz";
1444
1445 lr5.desiredRefreshRate = 120_Hz;
1446 lr5.name = "120Hz";
1447
1448 expectedRankings = {
1449 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1450 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1451 };
1452
1453 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1454
1455 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1456 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1457 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1458 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1459 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1460 }
1461
1462 lr1.vote = LayerVoteType::Heuristic;
1463 lr1.desiredRefreshRate = 30_Hz;
1464 lr1.name = "30Hz";
1465
1466 lr2.desiredRefreshRate = 120_Hz;
1467 lr2.name = "120Hz";
1468
1469 lr3.desiredRefreshRate = 60_Hz;
1470 lr3.name = "60Hz";
1471
1472 lr5.desiredRefreshRate = 72_Hz;
1473 lr5.name = "72Hz";
1474
1475 expectedRankings = {
1476 RefreshRateRanking{kMode30}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90},
1477 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode72},
1478 };
1479
1480 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1481 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1482 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1483 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1484 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1485 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1486 }
1487
1488 lr1.desiredRefreshRate = 120_Hz;
1489 lr1.name = "120Hz";
1490 lr1.weight = 0.0f;
1491
1492 lr2.desiredRefreshRate = 60_Hz;
1493 lr2.name = "60Hz";
1494 lr2.vote = LayerVoteType::NoVote;
1495
1496 lr3.name = "60Hz-2";
1497 lr3.vote = LayerVoteType::Heuristic;
1498
1499 lr4.vote = LayerVoteType::ExplicitExact;
1500
1501 lr5.desiredRefreshRate = 120_Hz;
1502 lr5.name = "120Hz-2";
1503
1504 expectedRankings = {
1505 RefreshRateRanking{kMode90}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode120},
1506 RefreshRateRanking{kMode72}, RefreshRateRanking{kMode30},
1507 };
1508
1509 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1510 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1511 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1512 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1513 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1514 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1515 }
1516}
1517
Alec Mouri11232a22020-05-14 18:06:25 -07001518TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001519 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001520 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001521
Dominik Laskowski36dced82022-09-02 09:24:00 -07001522 EXPECT_EQ(SetPolicyResult::Changed,
1523 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001524
ramindanid72ba162022-09-09 21:33:40 +00001525 const auto [mode, signals] = configs.getRankedRefreshRatesAndSignals({}, {});
1526 EXPECT_EQ(mode.front().displayModePtr, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001527 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001528
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001529 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001530 auto& lr = layers[0];
1531
1532 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001533 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001534 lr.name = "60Hz ExplicitExactOrMultiple";
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(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001540
1541 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001542 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001543 lr.name = "60Hz ExplicitDefault";
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(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001549
1550 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001551 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001552 lr.name = "60Hz Heuristic";
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::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001560 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001561 lr.name = "60Hz Max";
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 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001569 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001570 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001571 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001572 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001573
1574 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001575 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001576}
1577
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001578TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001579 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001580
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001581 // The default policy doesn't allow group switching. Verify that no
1582 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001583 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001584 auto& layer = layers[0];
1585 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001586 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001587 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001588 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001589 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001590
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001591 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001592}
Steven Thomasd4071902020-03-24 16:02:53 -07001593
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001594TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001595 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1596
Dominik Laskowski36dced82022-09-02 09:24:00 -07001597 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001598 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001599 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001600 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001601
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001602 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001603 auto& layer = layers[0];
1604 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001605 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001606 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1607 layer.name = "90Hz ExplicitDefault";
1608 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001609 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001610}
1611
1612TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001613 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001614
Dominik Laskowski36dced82022-09-02 09:24:00 -07001615 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001616 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001617 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001618 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001619
1620 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001621 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001622 auto& layer = layers[0];
1623 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001624 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001625 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001626 layer.name = "90Hz ExplicitDefault";
1627 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001628 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001629}
1630
1631TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001632 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001633
Dominik Laskowski36dced82022-09-02 09:24:00 -07001634 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001635 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1636 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001637 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001638
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001639 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001640
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001641 // 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 -07001642 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001643 auto& layer = layers[0];
1644 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001645 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001646 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001647 layer.name = "60Hz ExplicitDefault";
1648 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001649 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001650}
1651
1652TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001653 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001654
Dominik Laskowski36dced82022-09-02 09:24:00 -07001655 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001656 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1657 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001658 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001659
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001660 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001661
1662 // Verify that if the current config is in another group and there are no layers with
1663 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001664
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001665 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001666 auto& layer = layers[0];
1667 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001668 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001669 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001670 layer.name = "60Hz ExplicitDefault";
1671 layer.focused = true;
1672
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001673 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001674}
1675
1676TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001677 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001678
Dominik Laskowski36dced82022-09-02 09:24:00 -07001679 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001680 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1681 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001682 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001683
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001684 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001685
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001686 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001687 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001688 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001689 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001690 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001691 layers[0].seamlessness = Seamlessness::OnlySeamless;
1692 layers[0].name = "60Hz ExplicitDefault";
1693 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001694
1695 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001696 layers[1].vote = LayerVoteType::ExplicitDefault;
1697 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001698 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001699 layers[1].name = "90Hz ExplicitDefault";
1700 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001701
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001702 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001703}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001704
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001705TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001706 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001707
Dominik Laskowski36dced82022-09-02 09:24:00 -07001708 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001709 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1710 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001711 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001712
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001713 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001714
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001715 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1716 // seamlessness=Default can't change the mode group back to the group of the default
1717 // mode.
1718 // For example, this may happen when a video playback requests and gets a seamed switch,
1719 // but another layer (with default seamlessness) starts animating. The animating layer
1720 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001721 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001722 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001723 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001724 layers[0].focused = true;
1725 layers[0].vote = LayerVoteType::ExplicitDefault;
1726 layers[0].name = "60Hz ExplicitDefault";
1727
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001728 layers.push_back(LayerRequirement{.weight = 0.1f});
1729 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001730 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001731 layers[1].focused = true;
1732 layers[1].vote = LayerVoteType::ExplicitDefault;
1733 layers[1].name = "90Hz ExplicitDefault";
1734
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001735 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001736}
1737
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001738TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001739 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001740
Dominik Laskowski36dced82022-09-02 09:24:00 -07001741 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001742 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1743 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001744 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001745
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001746 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001747
1748 // Layer with seamlessness=Default can change the mode group if there's a not
1749 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1750 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001751 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001752 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001753 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001754 layers[0].focused = true;
1755 layers[0].vote = LayerVoteType::ExplicitDefault;
1756 layers[0].name = "60Hz ExplicitDefault";
1757
1758 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001759 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001760 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001761 layers[1].focused = false;
1762 layers[1].vote = LayerVoteType::ExplicitDefault;
1763 layers[1].name = "90Hz ExplicitDefault";
1764
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001765 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001766}
1767
1768TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001769 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001770
1771 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001772 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001773 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001774 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001775 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001776
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001777 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001778 auto& layer = layers[0];
1779 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001780 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001781 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001782 layer.name = "60Hz ExplicitExactOrMultiple";
1783 layer.focused = true;
1784
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001785 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001786
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001787 configs.setActiveModeId(kModeId120);
1788 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001789}
1790
1791TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001792 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001793
1794 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001795 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001796 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001797 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001798 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001799
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001800 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1801 .vote = LayerVoteType::ExplicitDefault,
1802 .desiredRefreshRate = 60_Hz,
1803 .seamlessness = Seamlessness::SeamedAndSeamless,
1804 .weight = 0.5f,
1805 .focused = false},
1806 {.name = "25Hz ExplicitExactOrMultiple",
1807 .vote = LayerVoteType::ExplicitExactOrMultiple,
1808 .desiredRefreshRate = 25_Hz,
1809 .seamlessness = Seamlessness::OnlySeamless,
1810 .weight = 1.f,
1811 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001812
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001813 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001814
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001815 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001816 seamedLayer.desiredRefreshRate = 30_Hz;
1817 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001818 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001819
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001820 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001821}
1822
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001823TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001824 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001825
1826 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001827 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001828 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001829 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001830 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001831
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001832 std::vector<LayerRequirement> layers = {
1833 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001834
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001835 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001836}
1837
Steven Thomasf734df42020-04-13 21:09:28 -07001838TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001839 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001840
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001841 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001842 layers[0].name = "Test layer";
1843
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001844 struct Args {
1845 bool touch = false;
1846 bool focused = true;
1847 };
1848
Steven Thomasbb374322020-04-28 22:47:16 -07001849 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001850 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001851 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001852 layers[0].vote = voteType;
1853 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001854 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001855 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001856 };
1857
Dominik Laskowski36dced82022-09-02 09:24:00 -07001858 EXPECT_EQ(SetPolicyResult::Changed,
1859 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001860
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001861 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001862 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1863 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1864 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1865 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1866 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1867 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001868
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001869 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001870 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1871 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001872 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001873
Steven Thomasf734df42020-04-13 21:09:28 -07001874 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001875 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1876
Steven Thomasf734df42020-04-13 21:09:28 -07001877 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1878 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001879 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1880 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001881 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001882
Dominik Laskowski36dced82022-09-02 09:24:00 -07001883 EXPECT_EQ(SetPolicyResult::Changed,
1884 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001885
1886 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1887 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1888 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1889 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1890 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1891 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001892}
1893
Steven Thomasbb374322020-04-28 22:47:16 -07001894TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001895 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001896
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001897 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001898 layers[0].name = "Test layer";
1899
Marin Shalamanov23c44202020-12-22 19:09:20 +01001900 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001901 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001902 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001903
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001904 const auto [refreshRate, signals] =
ramindanid72ba162022-09-09 21:33:40 +00001905 configs.getRankedRefreshRatesAndSignals(layers,
1906 {.touch = touchActive, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001907
1908 // Refresh rate will be chosen by either touch state or idle state.
1909 EXPECT_EQ(!touchActive, signals.idle);
ramindanid72ba162022-09-09 21:33:40 +00001910 return refreshRate.front().displayModePtr->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001911 };
1912
Dominik Laskowski36dced82022-09-02 09:24:00 -07001913 EXPECT_EQ(SetPolicyResult::Changed,
1914 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Steven Thomasbb374322020-04-28 22:47:16 -07001915
1916 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001917 {
1918 constexpr bool kTouchActive = true;
1919 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1920 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1921 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1922 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1923 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1924 EXPECT_EQ(kModeId90,
1925 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1926 }
Steven Thomasbb374322020-04-28 22:47:16 -07001927
1928 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001929 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001930
1931 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001932 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001933
1934 {
1935 constexpr bool kTouchActive = false;
1936 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1937 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1938 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1939 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1940 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1941 EXPECT_EQ(kModeId60,
1942 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1943 }
Steven Thomasbb374322020-04-28 22:47:16 -07001944
1945 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001946 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001947}
1948
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001949TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001950 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001951
1952 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001953 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1954 const Fps expectedFrameRate = [fps] {
1955 if (fps < 26.91f) return 24_Hz;
1956 if (fps < 37.51f) return 30_Hz;
1957 if (fps < 52.51f) return 45_Hz;
1958 if (fps < 66.01f) return 60_Hz;
1959 if (fps < 81.01f) return 72_Hz;
1960 return 90_Hz;
1961 }();
1962
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001963 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001964 }
1965}
1966
1967TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001968 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001969
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001970 struct Expectation {
1971 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001972 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001973 };
1974
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001975 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001976 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1977 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001978 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001979
1980 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001981 const auto& knownFrameRates = configs.knownFrameRates();
1982 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001983 knownFrameRatesExpectations.begin(),
1984 [](Fps fps, const Expectation& expected) {
1985 return isApproxEqual(fps, expected.fps);
1986 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001987 EXPECT_TRUE(equal);
1988
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001989 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001990 auto& layer = layers[0];
1991 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001992
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001993 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001994 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001995 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001996 }
1997}
1998
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001999TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002000 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002001
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002002 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002003 auto& explicitExactLayer = layers[0];
2004 auto& explicitExactOrMultipleLayer = layers[1];
2005
2006 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2007 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002008 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002009
2010 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2011 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002012 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002013
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002014 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
2015 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002016
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002017 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2018 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002019 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002020
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002021 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002022 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002023
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002024 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002025 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002026
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002027 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002028 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002029}
2030
2031TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002032 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
2033 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002034
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002035 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002036 auto& explicitExactLayer = layers[0];
2037 auto& explicitExactOrMultipleLayer = layers[1];
2038
2039 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2040 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002041 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002042
2043 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2044 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002045 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002046
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002047 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2048 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002049
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002050 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2051 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002052 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002053
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002054 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002055 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002056
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002057 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002058 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002059
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002060 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002061 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002062}
2063
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002064TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002065 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002066
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002067 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2068 const auto args = std::make_pair(std::vector<LayerRequirement>{},
2069 GlobalSignals{.touch = true, .idle = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002070
ramindanid72ba162022-09-09 21:33:40 +00002071 const auto result = std::make_pair(std::vector<RefreshRateRanking>{RefreshRateRanking{kMode90}},
2072 GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002073
ramindanid72ba162022-09-09 21:33:40 +00002074 configs.mutableGetRankedRefreshRatesCache() = {args, result};
2075
2076 EXPECT_EQ(result, configs.getRankedRefreshRatesAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002077}
2078
2079TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002080 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
2081
ramindanid72ba162022-09-09 21:33:40 +00002082 EXPECT_FALSE(configs.mutableGetRankedRefreshRatesCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002083
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002084 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002085 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002086
ramindanid72ba162022-09-09 21:33:40 +00002087 const auto result = configs.getRankedRefreshRatesAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002088
ramindanid72ba162022-09-09 21:33:40 +00002089 const auto& cache = configs.mutableGetRankedRefreshRatesCache();
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002090 ASSERT_TRUE(cache);
2091
2092 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
2093 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002094}
2095
Ady Abraham5e4e9832021-06-14 13:40:56 -07002096TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002097 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07002098
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002099 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002100 auto& explicitExactLayer = layers[0];
2101 auto& explicitExactOrMultipleLayer = layers[1];
2102
2103 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2104 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002105 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002106
2107 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2108 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002109 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002110
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002111 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2112 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002113
2114 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2115
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002116 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2117 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002118}
2119
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002120TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002121 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
2122 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002123
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002124 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002125 auto& explicitDefaultLayer = layers[0];
2126 auto& explicitExactOrMultipleLayer = layers[1];
2127
2128 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2129 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002130 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002131
2132 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2133 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002134 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002135
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002136 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002137}
2138
Ady Abraham05243be2021-09-16 15:58:52 -07002139// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08002140TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07002141 constexpr int kMinRefreshRate = 10;
2142 constexpr int kMaxRefreshRate = 240;
2143
2144 DisplayModes displayModes;
2145 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002146 const DisplayModeId modeId(fps);
2147 displayModes.try_emplace(modeId,
2148 createDisplayMode(modeId,
2149 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07002150 }
2151
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002152 const TestableRefreshRateConfigs configs(std::move(displayModes),
2153 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07002154
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002155 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07002156 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2157 layers[0].desiredRefreshRate = fps;
2158 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002159 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07002160 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07002161 };
2162
2163 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002164 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07002165 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2166 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2167 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2168 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2169 }
2170}
2171
Ady Abraham1c595502022-01-13 21:58:32 -08002172// b/190578904
2173TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002174 constexpr DisplayModeId kActiveModeId{0};
2175 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
2176 createDisplayMode(DisplayModeId(1), 53_Hz),
2177 createDisplayMode(DisplayModeId(2), 55_Hz),
2178 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08002179
2180 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002181 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08002182
Dominik Laskowski0c252702021-12-20 20:32:09 -08002183 const std::vector<LayerRequirement> layers = {
2184 {
Ady Abraham1c595502022-01-13 21:58:32 -08002185 .vote = LayerVoteType::ExplicitDefault,
2186 .desiredRefreshRate = 43_Hz,
2187 .seamlessness = Seamlessness::SeamedAndSeamless,
2188 .weight = 0.41f,
2189 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08002190 {
Ady Abraham1c595502022-01-13 21:58:32 -08002191 .vote = LayerVoteType::ExplicitExactOrMultiple,
2192 .desiredRefreshRate = 53_Hz,
2193 .seamlessness = Seamlessness::SeamedAndSeamless,
2194 .weight = 0.41f,
2195 },
2196 };
2197
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002198 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08002199}
2200
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002201TEST_F(RefreshRateConfigsTest, modeComparison) {
2202 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
2203 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
2204 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07002205}
2206
2207TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002208 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07002209
Dominik Laskowski36dced82022-09-02 09:24:00 -07002210 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002211
Dominik Laskowski36dced82022-09-02 09:24:00 -07002212 // setPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002213 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002214
Dominik Laskowski36dced82022-09-02 09:24:00 -07002215 // setPolicy(60, 90), current 60Hz => TurnOn.
2216 EXPECT_EQ(SetPolicyResult::Changed,
2217 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002218 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002219
Dominik Laskowski36dced82022-09-02 09:24:00 -07002220 // setPolicy(60, 60), current 60Hz => TurnOff
2221 EXPECT_EQ(SetPolicyResult::Changed,
2222 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002223 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002224
Dominik Laskowski36dced82022-09-02 09:24:00 -07002225 // setPolicy(90, 90), current 90Hz => TurnOff.
2226 EXPECT_EQ(SetPolicyResult::Changed,
2227 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002228 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002229}
2230
TreeHugger Robot758ab612021-06-22 19:17:29 +00002231TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002232 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00002233
Dominik Laskowski36dced82022-09-02 09:24:00 -07002234 TestableRefreshRateConfigs configs(kModes_60_120, kModeId120);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002235
Dominik Laskowski36dced82022-09-02 09:24:00 -07002236 // setPolicy(0, 60), current 60Hz => TurnOn.
2237 EXPECT_EQ(SetPolicyResult::Changed,
2238 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002239 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002240
Dominik Laskowski36dced82022-09-02 09:24:00 -07002241 // setPolicy(60, 60), current 60Hz => TurnOff.
2242 EXPECT_EQ(SetPolicyResult::Changed,
2243 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002244 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002245
Dominik Laskowski36dced82022-09-02 09:24:00 -07002246 // setPolicy(60, 120), current 60Hz => TurnOn.
2247 EXPECT_EQ(SetPolicyResult::Changed,
2248 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002249 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002250
Dominik Laskowski36dced82022-09-02 09:24:00 -07002251 // setPolicy(120, 120), current 120Hz => TurnOff.
2252 EXPECT_EQ(SetPolicyResult::Changed,
2253 configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002254 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002255}
2256
Ady Abrahamcc315492022-02-17 17:06:39 -08002257TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002258 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002259
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002260 const auto frameRate = 30_Hz;
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002261 Fps displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002262 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002263
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002264 configs.setActiveModeId(kModeId60);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002265 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002266 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002267
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002268 configs.setActiveModeId(kModeId72);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002269 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002270 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002271
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002272 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002273 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002274 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002275
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002276 configs.setActiveModeId(kModeId120);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002277 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002278 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002279
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002280 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002281 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002282 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002283
Ady Abrahamcc315492022-02-17 17:06:39 -08002284 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
2285 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
2286 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
2287 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002288}
2289
2290TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002291 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2292 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002293
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002294 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2295 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002296
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002297 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2298 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002299
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002300 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2301 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002302
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002303 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2304 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002305
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002306 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 +02002307 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002308 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002309 }
2310
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002311 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2312 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2313 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002314}
2315
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002316TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002317 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08002318
Dominik Laskowski0c252702021-12-20 20:32:09 -08002319 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002320}
2321
2322TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002323 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2324 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002325
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002326 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002327 layers[0].name = "Test layer";
2328 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002329 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002330 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002331
2332 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2333 EXPECT_EQ(1u, frameRateOverrides.size());
2334 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2335 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002336
2337 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002338 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2339 EXPECT_EQ(1u, frameRateOverrides.size());
2340 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2341 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002342
2343 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002344 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2345 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002346
2347 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002348 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2349 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002350
2351 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002352 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2353 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002354
2355 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002356 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2357 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002358}
2359
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002360TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002361 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2362 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002363
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002364 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2365 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002366
2367 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002368 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002369 layers[0].vote = LayerVoteType::ExplicitDefault;
2370
2371 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002372 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002373 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002374 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002375
Dominik Laskowski0c252702021-12-20 20:32:09 -08002376 EXPECT_EQ(2u, frameRateOverrides.size());
2377 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2378 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2379 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2380 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002381
2382 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002383 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2384 EXPECT_EQ(1u, frameRateOverrides.size());
2385 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2386 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002387
2388 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002389 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2390 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002391}
2392
2393TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002394 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2395 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002396
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002397 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002398 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002399 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002400 layers[0].vote = LayerVoteType::ExplicitDefault;
2401
Dominik Laskowski0c252702021-12-20 20:32:09 -08002402 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2403 EXPECT_EQ(1u, frameRateOverrides.size());
2404 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2405 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002406
Dominik Laskowski0c252702021-12-20 20:32:09 -08002407 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2408 EXPECT_EQ(1u, frameRateOverrides.size());
2409 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2410 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002411
2412 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002413 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2414 EXPECT_EQ(1u, frameRateOverrides.size());
2415 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2416 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002417
Dominik Laskowski0c252702021-12-20 20:32:09 -08002418 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2419 EXPECT_EQ(1u, frameRateOverrides.size());
2420 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2421 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002422
2423 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002424 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2425 EXPECT_EQ(1u, frameRateOverrides.size());
2426 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2427 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002428
Dominik Laskowski0c252702021-12-20 20:32:09 -08002429 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2430 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002431}
2432
Alec Mouri0a1cc962019-03-14 12:33:02 -07002433} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002434} // namespace android::scheduler