blob: 924c5befde670ec2e64c216167c5d477a9917391 [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 Laskowski530d6bd2022-10-10 16:55:54 -040020#include <algorithm>
21#include <array>
22
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070023#include <ftl/enum.h>
Dominik Laskowskif8734e02022-08-26 09:06:59 -070024#include <ftl/fake_guard.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070025#include <gmock/gmock.h>
26#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010027#include <ui/Size.h>
28
Alec Mouri0a1cc962019-03-14 12:33:02 -070029#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070030#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "Scheduler/RefreshRateConfigs.h"
Dominik Laskowskib0054a22022-03-03 09:03:06 -080032#include "mock/DisplayHardware/MockDisplayMode.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070036namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070037
Peiyong Line9d809e2020-04-14 13:10:48 -070038namespace hal = android::hardware::graphics::composer::hal;
39
Ady Abraham8a82ba62020-01-17 12:43:17 -080040using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Dominik Laskowski530d6bd2022-10-10 16:55:54 -040041using LayerVoteType = RefreshRateConfigs::LayerVoteType;
42using SetPolicyResult = RefreshRateConfigs::SetPolicyResult;
Alec Mouri0a1cc962019-03-14 12:33:02 -070043
Dominik Laskowskib0054a22022-03-03 09:03:06 -080044using mock::createDisplayMode;
45
Dominik Laskowski0c252702021-12-20 20:32:09 -080046struct TestableRefreshRateConfigs : RefreshRateConfigs {
ramindanid72ba162022-09-09 21:33:40 +000047 using RefreshRateConfigs::RefreshRateOrder;
Dominik Laskowski530d6bd2022-10-10 16:55:54 -040048 using RefreshRateConfigs::RefreshRateRanking;
49
50 using RefreshRateConfigs::RefreshRateConfigs;
Dominik Laskowski0c252702021-12-20 20:32:09 -080051
Dominik Laskowskif8734e02022-08-26 09:06:59 -070052 void setActiveModeId(DisplayModeId modeId) {
53 ftl::FakeGuard guard(kMainThreadContext);
54 return RefreshRateConfigs::setActiveModeId(modeId);
55 }
56
57 const DisplayMode& getActiveMode() const {
58 ftl::FakeGuard guard(kMainThreadContext);
59 return RefreshRateConfigs::getActiveMode();
60 }
61
Dominik Laskowskib0054a22022-03-03 09:03:06 -080062 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080063 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080064 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080065 }
66
Dominik Laskowskib0054a22022-03-03 09:03:06 -080067 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080068 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080069 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080070 }
71
Dominik Laskowskib0054a22022-03-03 09:03:06 -080072 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080073 std::lock_guard lock(mLock);
74 return getMinRefreshRateByPolicyLocked();
75 }
76
ramindanid72ba162022-09-09 21:33:40 +000077 DisplayModePtr getMaxRefreshRateByPolicy() const {
78 std::lock_guard lock(mLock);
79 return getMaxRefreshRateByPolicyLocked(getActiveModeItLocked()->second->getGroup());
80 }
81
Dominik Laskowski530d6bd2022-10-10 16:55:54 -040082 RefreshRateRanking rankRefreshRates(std::optional<int> anchorGroupOpt,
83 RefreshRateOrder refreshRateOrder) const {
ramindanid72ba162022-09-09 21:33:40 +000084 std::lock_guard lock(mLock);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -040085 return RefreshRateConfigs::rankRefreshRates(anchorGroupOpt, refreshRateOrder);
ramindanid72ba162022-09-09 21:33:40 +000086 }
87
Dominik Laskowski0c252702021-12-20 20:32:09 -080088 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
89
ramindanid72ba162022-09-09 21:33:40 +000090 using RefreshRateConfigs::GetRankedRefreshRatesCache;
91 auto& mutableGetRankedRefreshRatesCache() { return mGetRankedRefreshRatesCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080092
Dominik Laskowski530d6bd2022-10-10 16:55:54 -040093 auto getRankedRefreshRates(const std::vector<LayerRequirement>& layers,
94 GlobalSignals signals) const {
95 const auto result = RefreshRateConfigs::getRankedRefreshRates(layers, signals);
96
97 EXPECT_TRUE(std::is_sorted(result.ranking.begin(), result.ranking.end(),
98 ScoredRefreshRate::DescendingScore{}));
99
100 return result;
101 }
102
103 auto getRankedRefreshRatesAsPair(const std::vector<LayerRequirement>& layers,
104 GlobalSignals signals) const {
105 const auto [ranking, consideredSignals] = getRankedRefreshRates(layers, signals);
106 return std::make_pair(ranking, consideredSignals);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800107 }
108
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800109 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
110 GlobalSignals signals = {}) const {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -0400111 return getRankedRefreshRates(layers, signals).ranking.front().modePtr;
Dominik Laskowski0c252702021-12-20 20:32:09 -0800112 }
Dominik Laskowski36dced82022-09-02 09:24:00 -0700113
114 SetPolicyResult setPolicy(const PolicyVariant& policy) {
115 ftl::FakeGuard guard(kMainThreadContext);
116 return RefreshRateConfigs::setPolicy(policy);
117 }
118
119 SetPolicyResult setDisplayManagerPolicy(const DisplayManagerPolicy& policy) {
120 return setPolicy(policy);
121 }
Dominik Laskowski0c252702021-12-20 20:32:09 -0800122};
123
Alec Mouri0a1cc962019-03-14 12:33:02 -0700124class RefreshRateConfigsTest : public testing::Test {
125protected:
Dominik Laskowski530d6bd2022-10-10 16:55:54 -0400126 using RefreshRateOrder = TestableRefreshRateConfigs::RefreshRateOrder;
127
Alec Mouri0a1cc962019-03-14 12:33:02 -0700128 RefreshRateConfigsTest();
129 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -0700130
Dominik Laskowski0c252702021-12-20 20:32:09 -0800131 static constexpr DisplayModeId kModeId60{0};
132 static constexpr DisplayModeId kModeId90{1};
133 static constexpr DisplayModeId kModeId72{2};
134 static constexpr DisplayModeId kModeId120{3};
135 static constexpr DisplayModeId kModeId30{4};
136 static constexpr DisplayModeId kModeId25{5};
137 static constexpr DisplayModeId kModeId50{6};
138 static constexpr DisplayModeId kModeId24{7};
139 static constexpr DisplayModeId kModeId24Frac{8};
140 static constexpr DisplayModeId kModeId30Frac{9};
141 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700142
Dominik Laskowski0c252702021-12-20 20:32:09 -0800143 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
144 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
145 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
146 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
147 static inline const DisplayModePtr kMode90_4K =
148 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
149 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
150 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
151 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
152 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
153 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
154 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
155 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
156 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
157 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
158 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
159 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
160 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700161
Dominik Laskowski0c252702021-12-20 20:32:09 -0800162 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800163 static inline const DisplayModes kModes_60 = makeModes(kMode60);
164 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
165 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
166 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
167 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
168 static inline const DisplayModes kModes_60_90_72_120 =
169 makeModes(kMode60, kMode90, kMode72, kMode120);
170 static inline const DisplayModes kModes_30_60_72_90_120 =
171 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100172
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800173 static inline const DisplayModes kModes_30_60 =
174 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
175 static inline const DisplayModes kModes_30_60_72_90 =
176 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
177 static inline const DisplayModes kModes_30_60_90 =
178 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
179 static inline const DisplayModes kModes_25_30_50_60 =
180 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
181 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700182
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200183 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800184 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
185 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
186 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700187};
188
189RefreshRateConfigsTest::RefreshRateConfigsTest() {
190 const ::testing::TestInfo* const test_info =
191 ::testing::UnitTest::GetInstance()->current_test_info();
192 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
193}
194
195RefreshRateConfigsTest::~RefreshRateConfigsTest() {
196 const ::testing::TestInfo* const test_info =
197 ::testing::UnitTest::GetInstance()->current_test_info();
198 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
199}
200
201namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700202
Dominik Laskowski0c252702021-12-20 20:32:09 -0800203TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
204 RefreshRateConfigs configs(kModes_60, kModeId60);
205 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700206}
207
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100208TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski36dced82022-09-02 09:24:00 -0700209 TestableRefreshRateConfigs configs(kModes_60, kModeId60);
210
211 EXPECT_EQ(SetPolicyResult::Invalid,
212 configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}));
213 EXPECT_EQ(SetPolicyResult::Invalid,
214 configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}));
215}
216
217TEST_F(RefreshRateConfigsTest, unchangedPolicy) {
218 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
219
220 EXPECT_EQ(SetPolicyResult::Changed,
221 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
222
223 EXPECT_EQ(SetPolicyResult::Unchanged,
224 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
225
226 // Override to the same policy.
227 EXPECT_EQ(SetPolicyResult::Unchanged,
228 configs.setPolicy(RefreshRateConfigs::OverridePolicy{kModeId90, {60_Hz, 90_Hz}}));
229
230 // Clear override to restore DisplayManagerPolicy.
231 EXPECT_EQ(SetPolicyResult::Unchanged,
232 configs.setPolicy(RefreshRateConfigs::NoOverridePolicy{}));
233
234 EXPECT_EQ(SetPolicyResult::Changed,
235 configs.setDisplayManagerPolicy({kModeId90, {30_Hz, 90_Hz}}));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100236}
237
Dominik Laskowski0c252702021-12-20 20:32:09 -0800238TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
239 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700240
Dominik Laskowski0c252702021-12-20 20:32:09 -0800241 const auto minRate = configs.getMinSupportedRefreshRate();
242 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700243
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800244 EXPECT_EQ(kMode60, minRate);
245 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Dominik Laskowski0c252702021-12-20 20:32:09 -0800247 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
248 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
249
250 EXPECT_EQ(minRateByPolicy, minRate);
251 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700252}
Ady Abraham2139f732019-11-13 18:56:40 -0800253
Dominik Laskowski0c252702021-12-20 20:32:09 -0800254TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
255 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Dominik Laskowski0c252702021-12-20 20:32:09 -0800257 const auto minRate = configs.getMinRefreshRateByPolicy();
258 const auto performanceRate = configs.getMaxSupportedRefreshRate();
259 const auto minRate60 = configs.getMinRefreshRateByPolicy();
260 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800261
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800262 EXPECT_EQ(kMode60, minRate);
263 EXPECT_EQ(kMode60, minRate60);
264 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800265
Dominik Laskowski36dced82022-09-02 09:24:00 -0700266 EXPECT_EQ(SetPolicyResult::Changed,
267 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800268 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800269
Dominik Laskowski0c252702021-12-20 20:32:09 -0800270 const auto minRate90 = configs.getMinRefreshRateByPolicy();
271 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800272
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800273 EXPECT_EQ(kMode90_G1, performanceRate);
274 EXPECT_EQ(kMode90_G1, minRate90);
275 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700276}
277
Dominik Laskowski0c252702021-12-20 20:32:09 -0800278TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
279 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700280
Dominik Laskowski0c252702021-12-20 20:32:09 -0800281 const auto minRate = configs.getMinRefreshRateByPolicy();
282 const auto performanceRate = configs.getMaxSupportedRefreshRate();
283 const auto minRate60 = configs.getMinRefreshRateByPolicy();
284 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700285
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800286 EXPECT_EQ(kMode60, minRate);
287 EXPECT_EQ(kMode60, minRate60);
288 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700289
Dominik Laskowski36dced82022-09-02 09:24:00 -0700290 EXPECT_EQ(SetPolicyResult::Changed,
291 configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800292 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700293
Dominik Laskowski0c252702021-12-20 20:32:09 -0800294 const auto minRate90 = configs.getMinRefreshRateByPolicy();
295 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700296
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800297 EXPECT_EQ(kMode90_4K, performanceRate);
298 EXPECT_EQ(kMode90_4K, minRate90);
299 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800300}
301
Dominik Laskowski0c252702021-12-20 20:32:09 -0800302TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
303 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800304
Dominik Laskowski0c252702021-12-20 20:32:09 -0800305 const auto minRate = configs.getMinRefreshRateByPolicy();
306 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800307
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800308 EXPECT_EQ(kMode60, minRate);
309 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800310
Dominik Laskowski36dced82022-09-02 09:24:00 -0700311 EXPECT_EQ(SetPolicyResult::Changed,
312 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800313
Dominik Laskowski0c252702021-12-20 20:32:09 -0800314 const auto minRate60 = configs.getMinRefreshRateByPolicy();
315 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
316
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800317 EXPECT_EQ(kMode60, minRate60);
318 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800319}
320
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800321TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800322 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800323 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700324 const auto& mode = configs.getActiveMode();
325 EXPECT_EQ(mode.getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800326 }
327
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800328 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800329 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700330 const auto& mode = configs.getActiveMode();
331 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800332 }
333
Dominik Laskowski36dced82022-09-02 09:24:00 -0700334 EXPECT_EQ(SetPolicyResult::Changed,
335 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham2139f732019-11-13 18:56:40 -0800336 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700337 const auto& mode = configs.getActiveMode();
338 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800339 }
340}
341
Steven Thomasbb374322020-04-28 22:47:16 -0700342TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800343 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800344 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800345
Dominik Laskowski0c252702021-12-20 20:32:09 -0800346 // If there are no layers we select the default frame rate, which is the max of the primary
347 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800348 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800349
Dominik Laskowski36dced82022-09-02 09:24:00 -0700350 EXPECT_EQ(SetPolicyResult::Changed,
351 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800352 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800353 }
354 {
355 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800356 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800357 constexpr bool kAllowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -0700358 EXPECT_EQ(SetPolicyResult::Changed,
359 configs.setDisplayManagerPolicy(
360 {kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}));
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800361 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800362 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800363}
364
Ady Abraham37d46922022-10-05 13:08:51 -0700365TEST_F(RefreshRateConfigsTest, getBestRefreshRate_exactDontChangeRefreshRateWhenNotInPolicy) {
366 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId72);
367
368 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
369 layers[0].vote = LayerVoteType::ExplicitExact;
370 layers[0].desiredRefreshRate = 120_Hz;
371
372 EXPECT_EQ(SetPolicyResult::Changed,
373 configs.setDisplayManagerPolicy({kModeId72, {0_Hz, 90_Hz}}));
374 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
375}
376
Steven Thomasbb374322020-04-28 22:47:16 -0700377TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800378 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700380 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381 auto& lr = layers[0];
382
383 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800384 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800385 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
387 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800388 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800389 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700391 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800393 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800394 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700396 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800397 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800398 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700400 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800401 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800402 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700404 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800405 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800406 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700408 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800409 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800410 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800412 lr.name = "";
Dominik Laskowski36dced82022-09-02 09:24:00 -0700413 EXPECT_EQ(SetPolicyResult::Changed,
414 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
416 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800417 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
419 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800420 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700422 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800424 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800425
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700426 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800427 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700429 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800430 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700432 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800433 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700435 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800436 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
Dominik Laskowski36dced82022-09-02 09:24:00 -0700438 EXPECT_EQ(SetPolicyResult::Changed,
439 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800440
441 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800442 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
444 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800445 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700447 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448 lr.vote = LayerVoteType::Heuristic;
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 = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800452 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700454 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800455 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700457 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800458 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700460 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800461 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462
Dominik Laskowski36dced82022-09-02 09:24:00 -0700463 EXPECT_EQ(SetPolicyResult::Changed,
464 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800466 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467
468 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800469 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700471 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800473 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700475 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800476 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700478 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800479 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700481 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800482 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800483
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700484 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800485 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486}
487
rnlee3bd610662021-06-23 16:27:57 -0700488TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800489 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700490
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700491 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700492 auto& lr = layers[0];
493
494 lr.vote = LayerVoteType::Min;
495 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800496 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700497
498 lr.vote = LayerVoteType::Max;
499 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800500 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700501
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700502 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700503 lr.vote = LayerVoteType::Heuristic;
504 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800505 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700506
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700507 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700508 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800509 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700510
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700511 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700512 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800513 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700514
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700515 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700516 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800517 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700518
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700519 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700520 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800521 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700522}
523
Steven Thomasbb374322020-04-28 22:47:16 -0700524TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800525 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800526
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700527 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800528 auto& lr = layers[0];
529
530 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800531 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532
533 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800534 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800535
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700536 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800537 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800538 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800539
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700540 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800541 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800542
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700543 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800544 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700546 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800547 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800550 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800551}
552
Steven Thomasbb374322020-04-28 22:47:16 -0700553TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800554 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700556 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557 auto& lr1 = layers[0];
558 auto& lr2 = layers[1];
559
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700560 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700562 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800563 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800564 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800565
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700566 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800567 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700568 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800569 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800570 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700572 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800573 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700574 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800575 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800576 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800577}
578
Steven Thomasbb374322020-04-28 22:47:16 -0700579TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800580 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800581
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700582 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800583 auto& lr1 = layers[0];
584 auto& lr2 = layers[1];
585
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700586 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800587 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800588 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700589 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800590 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800591 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800592 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800593
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700594 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800595 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800596 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700597 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800598 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800600 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800601
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700602 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800603 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800604 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700605 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800606 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800607 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800608 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800609
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700610 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800611 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700613 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800614 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800615 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800616 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800617
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700618 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800619 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
620 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700621 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800622 lr2.vote = LayerVoteType::ExplicitDefault;
623 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800624 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800625
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700626 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700629 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800630 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800631 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800632 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800633
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700634 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800635 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700637 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800638 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800640 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800641
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700642 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800643 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800644 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700645 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800648 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800649
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700650 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800651 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800652 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700653 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800654 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800655 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800656 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800657}
658
rnlee3bd610662021-06-23 16:27:57 -0700659TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800660 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
661 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700662
Ady Abraham62f51d92022-08-24 22:20:22 +0000663 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700664 auto& lr1 = layers[0];
665 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000666 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700667
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700668 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700669 lr1.vote = LayerVoteType::ExplicitDefault;
670 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700671 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700672 lr2.vote = LayerVoteType::Heuristic;
673 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800674 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700675
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700676 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700677 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
678 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700679 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700680 lr2.vote = LayerVoteType::Heuristic;
681 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800682 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700683
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700684 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700685 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
686 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700687 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700688 lr2.vote = LayerVoteType::ExplicitDefault;
689 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800690 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700691
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700692 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700693 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
694 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700695 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700696 lr2.vote = LayerVoteType::Heuristic;
697 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800698 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700699
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700700 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700701 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
702 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700703 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700704 lr2.vote = LayerVoteType::ExplicitDefault;
705 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800706 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700707
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700708 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700709 lr1.vote = LayerVoteType::ExplicitDefault;
710 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700711 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700712 lr2.vote = LayerVoteType::Heuristic;
713 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800714 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700715
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700716 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700717 lr1.vote = LayerVoteType::Heuristic;
718 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700719 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700720 lr2.vote = LayerVoteType::ExplicitDefault;
721 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800722 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700723
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700724 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700725 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
726 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700727 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700728 lr2.vote = LayerVoteType::ExplicitDefault;
729 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800730 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700731
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700732 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700733 lr1.vote = LayerVoteType::ExplicitDefault;
734 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700735 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700736 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
737 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800738 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000739
740 lr1.desiredRefreshRate = 24_Hz;
741 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
742 lr1.name = "24Hz ExplicitExactOrMultiple";
743 lr2.vote = LayerVoteType::Max;
744 lr2.name = "Max";
745 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
746
747 lr1.desiredRefreshRate = 24_Hz;
748 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
749 lr1.name = "24Hz ExplicitExactOrMultiple";
750 lr2.desiredRefreshRate = 120_Hz;
751 lr2.vote = LayerVoteType::ExplicitDefault;
752 lr2.name = "120Hz ExplicitDefault";
753 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
754
755 lr1.desiredRefreshRate = 24_Hz;
756 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
757 lr1.name = "24Hz ExplicitExactOrMultiple";
758 lr2.desiredRefreshRate = 120_Hz;
759 lr2.vote = LayerVoteType::ExplicitExact;
760 lr2.name = "120Hz ExplicitExact";
761 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000762
763 lr1.desiredRefreshRate = 10_Hz;
764 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
765 lr1.name = "30Hz ExplicitExactOrMultiple";
766 lr2.desiredRefreshRate = 120_Hz;
767 lr2.vote = LayerVoteType::Heuristic;
768 lr2.name = "120Hz ExplicitExact";
769 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
770
771 lr1.desiredRefreshRate = 30_Hz;
772 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
773 lr1.name = "30Hz ExplicitExactOrMultiple";
774 lr2.desiredRefreshRate = 30_Hz;
775 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
776 lr2.name = "30Hz ExplicitExactOrMultiple";
777 lr3.vote = LayerVoteType::Heuristic;
778 lr3.desiredRefreshRate = 120_Hz;
779 lr3.name = "120Hz Heuristic";
780 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700781}
782
Steven Thomasbb374322020-04-28 22:47:16 -0700783TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800784 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700786 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800787 auto& lr = layers[0];
788
789 lr.vote = LayerVoteType::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;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800793 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800794
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700795 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800797 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700799 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800800 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800801
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700802 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800803 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800804
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700805 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800806 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800807
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700808 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800809 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810}
811
Steven Thomasbb374322020-04-28 22:47:16 -0700812TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800813 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700815 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816 auto& lr = layers[0];
817
818 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800819 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800820 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821
822 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800823 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800824 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800825
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700826 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800827 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800828 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800829 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800830
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700831 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800832 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800833 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
834 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700836 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800837 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800838 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
839 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700841 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800842 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800843 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
844 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700846 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800847 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800848 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
849 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800850
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800852 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
853 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800854 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
855 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800856}
857
Steven Thomasbb374322020-04-28 22:47:16 -0700858TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800859 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800860
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700861 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862 auto& lr1 = layers[0];
863 auto& lr2 = layers[1];
864
865 lr1.vote = LayerVoteType::Min;
866 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800867 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800868
869 lr1.vote = LayerVoteType::Min;
870 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700871 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800872 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800873
874 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800875 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700876 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800877 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800878
879 lr1.vote = LayerVoteType::Max;
880 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700881 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800882 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800883
884 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800885 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700886 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800887 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800888
889 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700890 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800891 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700892 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800893 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800894
895 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700896 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800897 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700898 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800899 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800900}
901
Steven Thomasbb374322020-04-28 22:47:16 -0700902TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800903 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800904
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700905 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800906 auto& lr = layers[0];
907
Ady Abraham71c437d2020-01-31 15:56:57 -0800908 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800909 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700910 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800911 const auto mode = configs.getBestRefreshRate(layers);
912 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
913 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800914 }
915}
916
rnlee3bd610662021-06-23 16:27:57 -0700917TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800918 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
919 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700920
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700921 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700922 auto& lr = layers[0];
923
924 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
925 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700926 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800927 const auto mode = configs.getBestRefreshRate(layers);
928 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
929 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700930 }
931}
932
Dominik Laskowski0c252702021-12-20 20:32:09 -0800933TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800934 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800935
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700936 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800937 auto& lr1 = layers[0];
938 auto& lr2 = layers[1];
939
940 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700941 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800942 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700943 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800944 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945
946 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700947 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800948 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700949 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800950 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800951
952 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700953 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800954 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700955 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800956 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800957}
958
Steven Thomasbb374322020-04-28 22:47:16 -0700959TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800960 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800961
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700962 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800963 auto& lr = layers[0];
964
Ady Abraham71c437d2020-01-31 15:56:57 -0800965 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800966 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700967 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800968 const auto mode = configs.getBestRefreshRate(layers, {});
969 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
970 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800971 }
972}
973
Steven Thomasbb374322020-04-28 22:47:16 -0700974TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800975 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800976
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700977 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800978 auto& lr1 = layers[0];
979 auto& lr2 = layers[1];
980
981 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700982 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800983 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800984 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700985 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800986 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800987 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800988
989 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700990 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800991 lr1.name = "60Hz ExplicitExactOrMultiple";
992 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700993 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800994 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800995 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800996
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";
Ady Abraham34702102020-02-10 14:12:05 -08001000 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001001 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001002 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -08001003
1004 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001005 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001007 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001008 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001009 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001010 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -08001011
1012 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001013 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001014 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001015 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001016 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001017 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001018}
1019
1020TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001021 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001022
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001023 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001024 auto& lr1 = layers[0];
1025 auto& lr2 = layers[1];
1026
1027 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001028 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001029 lr1.name = "60Hz ExplicitExactOrMultiple";
1030 lr2.vote = LayerVoteType::NoVote;
1031 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001032 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001033
1034 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001035 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001036 lr1.name = "60Hz ExplicitExactOrMultiple";
1037 lr2.vote = LayerVoteType::NoVote;
1038 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001039 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001040
1041 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001042 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001043 lr1.name = "60Hz ExplicitExactOrMultiple";
1044 lr2.vote = LayerVoteType::Max;
1045 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001046 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001047
1048 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001049 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001050 lr1.name = "60Hz ExplicitExactOrMultiple";
1051 lr2.vote = LayerVoteType::Max;
1052 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001053 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001054
1055 // The other layer starts to provide buffers
1056 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001057 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001058 lr1.name = "60Hz ExplicitExactOrMultiple";
1059 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001060 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001061 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001062 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001063}
1064
ramindanid72ba162022-09-09 21:33:40 +00001065TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicy) {
1066 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1067 // different group.
1068 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
ramindanid72ba162022-09-09 21:33:40 +00001069
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001070 const auto refreshRates = configs.rankRefreshRates(configs.getActiveMode().getGroup(),
1071 RefreshRateOrder::Descending);
ramindanid72ba162022-09-09 21:33:40 +00001072
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001073 const std::array expectedRefreshRates = {kMode90, kMode60, kMode30};
ramindanid72ba162022-09-09 21:33:40 +00001074 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001075
ramindanid72ba162022-09-09 21:33:40 +00001076 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001077 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1078 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1079 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001080 }
1081}
1082
1083TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicy) {
1084 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1085 // different group.
1086 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
ramindanid72ba162022-09-09 21:33:40 +00001087
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001088 const auto refreshRates = configs.rankRefreshRates(configs.getActiveMode().getGroup(),
1089 RefreshRateOrder::Ascending);
ramindanid72ba162022-09-09 21:33:40 +00001090
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001091 const std::array expectedRefreshRates = {kMode30, kMode60, kMode90};
ramindanid72ba162022-09-09 21:33:40 +00001092 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001093
ramindanid72ba162022-09-09 21:33:40 +00001094 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001095 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1096 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1097 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001098 }
1099}
1100
1101TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicyOutsideTheGroup) {
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);
ramindanid72ba162022-09-09 21:33:40 +00001105
Dominik Laskowski36dced82022-09-02 09:24:00 -07001106 EXPECT_EQ(SetPolicyResult::Changed,
1107 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001108
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001109 const auto refreshRates =
1110 configs.rankRefreshRates(/*anchorGroupOpt*/ std::nullopt, RefreshRateOrder::Ascending);
ramindanid72ba162022-09-09 21:33:40 +00001111
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001112 const std::array expectedRefreshRates = {kMode30, kMode60, kMode90};
ramindanid72ba162022-09-09 21:33:40 +00001113 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001114
ramindanid72ba162022-09-09 21:33:40 +00001115 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001116 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1117 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1118 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001119 }
1120}
1121
1122TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicyOutsideTheGroup) {
1123 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1124 // different group.
1125 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
ramindanid72ba162022-09-09 21:33:40 +00001126
Dominik Laskowski36dced82022-09-02 09:24:00 -07001127 EXPECT_EQ(SetPolicyResult::Changed,
1128 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}));
ramindanid72ba162022-09-09 21:33:40 +00001129
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001130 const auto refreshRates =
1131 configs.rankRefreshRates(/*anchorGroupOpt*/ std::nullopt, RefreshRateOrder::Descending);
ramindanid72ba162022-09-09 21:33:40 +00001132
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001133 const std::array expectedRefreshRates = {kMode90, kMode60, kMode30};
ramindanid72ba162022-09-09 21:33:40 +00001134 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001135
ramindanid72ba162022-09-09 21:33:40 +00001136 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001137 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1138 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1139 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001140 }
1141}
1142
ramindani38c84982022-08-29 18:02:57 +00001143TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001144 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
ramindani38c84982022-08-29 18:02:57 +00001145
ramindanid72ba162022-09-09 21:33:40 +00001146 auto [refreshRates, signals] = configs.getRankedRefreshRates({}, {});
ramindani38c84982022-08-29 18:02:57 +00001147 EXPECT_FALSE(signals.powerOnImminent);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001148
1149 std::array expectedRefreshRates = {kMode90, kMode60};
ramindanid72ba162022-09-09 21:33:40 +00001150 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001151
ramindanid72ba162022-09-09 21:33:40 +00001152 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001153 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1154 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1155 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001156 }
ramindani38c84982022-08-29 18:02:57 +00001157
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001158 std::tie(refreshRates, signals) =
1159 configs.getRankedRefreshRatesAsPair({}, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001160 EXPECT_TRUE(signals.powerOnImminent);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001161
ramindanid72ba162022-09-09 21:33:40 +00001162 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001163
ramindanid72ba162022-09-09 21:33:40 +00001164 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001165 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1166 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1167 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001168 }
ramindani38c84982022-08-29 18:02:57 +00001169
1170 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
1171 auto& lr1 = layers[0];
1172 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1173 lr1.desiredRefreshRate = 60_Hz;
1174 lr1.name = "60Hz ExplicitExactOrMultiple";
1175
ramindanid72ba162022-09-09 21:33:40 +00001176 std::tie(refreshRates, signals) =
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001177 configs.getRankedRefreshRatesAsPair(layers, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001178 EXPECT_TRUE(signals.powerOnImminent);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001179
ramindanid72ba162022-09-09 21:33:40 +00001180 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001181
ramindanid72ba162022-09-09 21:33:40 +00001182 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001183 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1184 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1185 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001186 }
1187
ramindanid72ba162022-09-09 21:33:40 +00001188 std::tie(refreshRates, signals) =
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001189 configs.getRankedRefreshRatesAsPair(layers, {.powerOnImminent = false});
ramindanid72ba162022-09-09 21:33:40 +00001190 EXPECT_FALSE(signals.powerOnImminent);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001191
1192 expectedRefreshRates = {kMode60, kMode90};
ramindanid72ba162022-09-09 21:33:40 +00001193 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001194
ramindanid72ba162022-09-09 21:33:40 +00001195 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001196 EXPECT_EQ(expectedRefreshRates[i], refreshRates[i].modePtr)
1197 << "Expected fps " << expectedRefreshRates[i]->getFps().getIntValue()
1198 << " Actual fps " << refreshRates[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001199 }
ramindani38c84982022-08-29 18:02:57 +00001200}
1201
Ady Abraham6fb599b2020-03-05 13:48:22 -08001202TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001203 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001204
ramindanid72ba162022-09-09 21:33:40 +00001205 auto [_, signals] = configs.getRankedRefreshRates({}, {});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001206 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001207
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001208 std::tie(std::ignore, signals) = configs.getRankedRefreshRatesAsPair({}, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001209 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001210
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001211 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001212 auto& lr1 = layers[0];
1213 auto& lr2 = layers[1];
1214
1215 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001216 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001217 lr1.name = "60Hz ExplicitExactOrMultiple";
1218 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001219 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001220 lr2.name = "60Hz Heuristic";
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001221 std::tie(std::ignore, signals) = configs.getRankedRefreshRatesAsPair(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001222 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001223
1224 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001225 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001226 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001227 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001228 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001229 lr2.name = "60Hz Heuristic";
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001230 std::tie(std::ignore, signals) = configs.getRankedRefreshRatesAsPair(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001231 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001232
1233 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001234 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001235 lr1.name = "60Hz ExplicitExactOrMultiple";
1236 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001237 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001238 lr2.name = "60Hz Heuristic";
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001239 std::tie(std::ignore, signals) = configs.getRankedRefreshRatesAsPair(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001240 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001241
1242 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001243 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001244 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001245 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001246 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001247 lr2.name = "60Hz Heuristic";
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001248 std::tie(std::ignore, signals) = configs.getRankedRefreshRatesAsPair(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001249 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001250}
1251
Steven Thomasbb374322020-04-28 22:47:16 -07001252TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001253 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001254
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001255 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001256 auto& lr = layers[0];
1257
1258 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001259 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1260 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001261
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001262 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001263
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001264 {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 -08001265
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001266 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001267
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001268 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001269
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001270 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001271
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001272 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001273
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001274 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001275 };
1276
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001277 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001278 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001279 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001280
1281 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001282 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001283 lr.name = ss.str();
1284
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001285 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001286 }
1287}
1288
1289TEST_F(RefreshRateConfigsTest,
1290 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001291 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001292 auto& lr = layers[0];
1293
1294 // Test that 23.976 will choose 24 if 23.976 is not supported
1295 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001296 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1297 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001298 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001299
1300 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 lr.desiredRefreshRate = 23.976_Hz;
1302 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001303 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001304 }
1305
1306 // Test that 24 will choose 23.976 if 24 is not supported
1307 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001308 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1309 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001310 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001311
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001312 lr.desiredRefreshRate = 24_Hz;
1313 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001314 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001315 }
1316
1317 // Test that 29.97 will prefer 59.94 over 60 and 30
1318 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001319 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1320 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001321 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001322
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001323 lr.desiredRefreshRate = 29.97_Hz;
1324 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001325 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001326 }
1327}
1328
1329TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001330 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001331 auto& lr = layers[0];
1332
1333 // Test that voting for supported refresh rate will select this refresh rate
1334 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001335 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001336
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001337 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 +02001338 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001339 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001340 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001341 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001342 lr.name = ss.str();
1343
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001344 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001345 }
1346 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001347}
1348
Alec Mouri11232a22020-05-14 18:06:25 -07001349TEST_F(RefreshRateConfigsTest,
1350 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski36dced82022-09-02 09:24:00 -07001351 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001352
Dominik Laskowski36dced82022-09-02 09:24:00 -07001353 EXPECT_EQ(SetPolicyResult::Changed,
1354 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001355
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001356 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001357 auto& lr = layers[0];
1358
Alec Mouri11232a22020-05-14 18:06:25 -07001359 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001360 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001361 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001362 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001363
ramindanid72ba162022-09-09 21:33:40 +00001364 const auto [mode, signals] =
1365 configs.getRankedRefreshRates(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001366
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001367 EXPECT_EQ(mode.begin()->modePtr, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001368 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001369}
1370
1371TEST_F(RefreshRateConfigsTest,
1372 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001373 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001374
Dominik Laskowski36dced82022-09-02 09:24:00 -07001375 EXPECT_EQ(SetPolicyResult::Changed,
1376 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001377
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001378 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001379 auto& lr = layers[0];
1380
Alec Mouri11232a22020-05-14 18:06:25 -07001381 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001382 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001383 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001384 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001385 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001386}
1387
ramindanid72ba162022-09-09 21:33:40 +00001388TEST_F(RefreshRateConfigsTest, testDisplayModeOrdering) {
1389 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1390
1391 std::vector<LayerRequirement> layers = {{.weight = 1.f},
1392 {.weight = 1.f},
1393 {.weight = 1.f},
1394 {.weight = 1.f},
1395 {.weight = 1.f}};
1396 auto& lr1 = layers[0];
1397 auto& lr2 = layers[1];
1398 auto& lr3 = layers[2];
1399 auto& lr4 = layers[3];
1400 auto& lr5 = layers[4];
1401
1402 lr1.desiredRefreshRate = 90_Hz;
1403 lr1.name = "90Hz";
1404 lr1.focused = true;
1405
1406 lr2.desiredRefreshRate = 60_Hz;
1407 lr2.name = "60Hz";
1408 lr2.focused = true;
1409
1410 lr3.desiredRefreshRate = 72_Hz;
1411 lr3.name = "72Hz";
1412 lr3.focused = true;
1413
1414 lr4.desiredRefreshRate = 120_Hz;
1415 lr4.name = "120Hz";
1416 lr4.focused = true;
1417
1418 lr5.desiredRefreshRate = 30_Hz;
1419 lr5.name = "30Hz";
1420 lr5.focused = true;
1421
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001422 std::array expectedRanking = {kMode120, kMode90, kMode72, kMode60, kMode30};
1423 auto actualRanking = configs.getRankedRefreshRates(layers, {}).ranking;
ramindanid72ba162022-09-09 21:33:40 +00001424
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001425 ASSERT_EQ(expectedRanking.size(), actualRanking.size());
1426
1427 for (size_t i = 0; i < expectedRanking.size(); ++i) {
1428 EXPECT_EQ(expectedRanking[i], actualRanking[i].modePtr)
1429 << "Expected fps " << expectedRanking[i]->getFps().getIntValue() << " Actual fps "
1430 << actualRanking[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001431 }
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
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001448 expectedRanking = {kMode120, kMode90, kMode72, kMode60, kMode30};
1449 actualRanking = configs.getRankedRefreshRates(layers, {}).ranking;
ramindanid72ba162022-09-09 21:33:40 +00001450
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001451 ASSERT_EQ(expectedRanking.size(), actualRanking.size());
ramindanid72ba162022-09-09 21:33:40 +00001452
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001453 for (size_t i = 0; i < expectedRanking.size(); ++i) {
1454 EXPECT_EQ(expectedRanking[i], actualRanking[i].modePtr)
1455 << "Expected fps " << expectedRanking[i]->getFps().getIntValue() << " Actual fps "
1456 << actualRanking[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001457 }
1458
1459 lr1.vote = LayerVoteType::Heuristic;
1460 lr1.desiredRefreshRate = 30_Hz;
1461 lr1.name = "30Hz";
1462
1463 lr2.desiredRefreshRate = 120_Hz;
1464 lr2.name = "120Hz";
1465
1466 lr3.desiredRefreshRate = 60_Hz;
1467 lr3.name = "60Hz";
1468
1469 lr5.desiredRefreshRate = 72_Hz;
1470 lr5.name = "72Hz";
1471
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001472 expectedRanking = {kMode30, kMode60, kMode90, kMode120, kMode72};
1473 actualRanking = configs.getRankedRefreshRates(layers, {}).ranking;
ramindanid72ba162022-09-09 21:33:40 +00001474
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001475 ASSERT_EQ(expectedRanking.size(), actualRanking.size());
1476
1477 for (size_t i = 0; i < expectedRanking.size(); ++i) {
1478 EXPECT_EQ(expectedRanking[i], actualRanking[i].modePtr)
1479 << "Expected fps " << expectedRanking[i]->getFps().getIntValue() << " Actual fps "
1480 << actualRanking[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001481 }
1482
1483 lr1.desiredRefreshRate = 120_Hz;
1484 lr1.name = "120Hz";
1485 lr1.weight = 0.0f;
1486
1487 lr2.desiredRefreshRate = 60_Hz;
1488 lr2.name = "60Hz";
1489 lr2.vote = LayerVoteType::NoVote;
1490
1491 lr3.name = "60Hz-2";
1492 lr3.vote = LayerVoteType::Heuristic;
1493
1494 lr4.vote = LayerVoteType::ExplicitExact;
1495
1496 lr5.desiredRefreshRate = 120_Hz;
1497 lr5.name = "120Hz-2";
1498
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001499 expectedRanking = {kMode90, kMode60, kMode120, kMode72, kMode30};
1500 actualRanking = configs.getRankedRefreshRates(layers, {}).ranking;
ramindanid72ba162022-09-09 21:33:40 +00001501
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001502 ASSERT_EQ(expectedRanking.size(), actualRanking.size());
1503
1504 for (size_t i = 0; i < expectedRanking.size(); ++i) {
1505 EXPECT_EQ(expectedRanking[i], actualRanking[i].modePtr)
1506 << "Expected fps " << expectedRanking[i]->getFps().getIntValue() << " Actual fps "
1507 << actualRanking[i].modePtr->getFps().getIntValue();
ramindanid72ba162022-09-09 21:33:40 +00001508 }
1509}
1510
Alec Mouri11232a22020-05-14 18:06:25 -07001511TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001512 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001513 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001514
Dominik Laskowski36dced82022-09-02 09:24:00 -07001515 EXPECT_EQ(SetPolicyResult::Changed,
1516 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Alec Mouri11232a22020-05-14 18:06:25 -07001517
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001518 const auto [ranking, signals] = configs.getRankedRefreshRates({}, {});
1519 EXPECT_EQ(ranking.front().modePtr, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001520 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001521
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001522 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001523 auto& lr = layers[0];
1524
1525 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001526 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001527 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001528 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001529 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001530
1531 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001532 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001533
1534 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001535 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001536 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001537 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001538 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001539
1540 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001541 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001542
1543 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001544 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001545 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001546 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001547 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001548
1549 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001550 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001551
1552 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001553 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001554 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001555 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001556 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001557
1558 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001559 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001560
1561 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001562 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001563 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001564 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001565 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001566
1567 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001568 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001569}
1570
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001571TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001572 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001573
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001574 // The default policy doesn't allow group switching. Verify that no
1575 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001576 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001577 auto& layer = layers[0];
1578 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001579 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001580 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001581 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001582 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001583
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001584 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001585}
Steven Thomasd4071902020-03-24 16:02:53 -07001586
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001587TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001588 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1589
Dominik Laskowski36dced82022-09-02 09:24:00 -07001590 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001591 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001592 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001593 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001595 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001596 auto& layer = layers[0];
1597 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001598 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001599 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1600 layer.name = "90Hz ExplicitDefault";
1601 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001602 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001603}
1604
1605TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001606 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001607
Dominik Laskowski36dced82022-09-02 09:24:00 -07001608 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001609 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001610 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001611 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001612
1613 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001614 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001615 auto& layer = layers[0];
1616 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001617 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001618 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001619 layer.name = "90Hz ExplicitDefault";
1620 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001621 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001622}
1623
1624TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001625 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001626
Dominik Laskowski36dced82022-09-02 09:24:00 -07001627 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001628 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1629 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001630 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001631
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001632 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001633
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001634 // 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 -07001635 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001636 auto& layer = layers[0];
1637 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001638 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001639 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001640 layer.name = "60Hz ExplicitDefault";
1641 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001642 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001643}
1644
1645TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001646 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001647
Dominik Laskowski36dced82022-09-02 09:24:00 -07001648 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001649 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1650 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001651 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001652
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001653 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001654
1655 // Verify that if the current config is in another group and there are no layers with
1656 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001657
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001658 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001659 auto& layer = layers[0];
1660 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001661 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001662 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001663 layer.name = "60Hz ExplicitDefault";
1664 layer.focused = true;
1665
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001666 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001667}
1668
1669TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001670 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001671
Dominik Laskowski36dced82022-09-02 09:24:00 -07001672 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001673 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1674 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001675 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001676
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001677 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001678
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001679 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001680 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001681 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001682 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001683 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001684 layers[0].seamlessness = Seamlessness::OnlySeamless;
1685 layers[0].name = "60Hz ExplicitDefault";
1686 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001687
1688 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001689 layers[1].vote = LayerVoteType::ExplicitDefault;
1690 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001691 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001692 layers[1].name = "90Hz ExplicitDefault";
1693 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001694
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001695 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001696}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001697
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001698TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001699 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001700
Dominik Laskowski36dced82022-09-02 09:24:00 -07001701 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001702 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1703 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001704 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001705
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001706 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001707
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001708 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1709 // seamlessness=Default can't change the mode group back to the group of the default
1710 // mode.
1711 // For example, this may happen when a video playback requests and gets a seamed switch,
1712 // but another layer (with default seamlessness) starts animating. The animating layer
1713 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001714 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001715 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001716 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001717 layers[0].focused = true;
1718 layers[0].vote = LayerVoteType::ExplicitDefault;
1719 layers[0].name = "60Hz ExplicitDefault";
1720
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001721 layers.push_back(LayerRequirement{.weight = 0.1f});
1722 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001723 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001724 layers[1].focused = true;
1725 layers[1].vote = LayerVoteType::ExplicitDefault;
1726 layers[1].name = "90Hz ExplicitDefault";
1727
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001728 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001729}
1730
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001731TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001732 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001733
Dominik Laskowski36dced82022-09-02 09:24:00 -07001734 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001735 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1736 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001737 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001738
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001739 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001740
1741 // Layer with seamlessness=Default can change the mode group if there's a not
1742 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1743 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001744 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001745 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001746 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001747 layers[0].focused = true;
1748 layers[0].vote = LayerVoteType::ExplicitDefault;
1749 layers[0].name = "60Hz ExplicitDefault";
1750
1751 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001752 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001753 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001754 layers[1].focused = false;
1755 layers[1].vote = LayerVoteType::ExplicitDefault;
1756 layers[1].name = "90Hz ExplicitDefault";
1757
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001758 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001759}
1760
1761TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001762 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001763
1764 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001765 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001766 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001767 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001768 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001769
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001770 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001771 auto& layer = layers[0];
1772 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001773 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001774 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001775 layer.name = "60Hz ExplicitExactOrMultiple";
1776 layer.focused = true;
1777
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001778 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001779
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001780 configs.setActiveModeId(kModeId120);
1781 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001782}
1783
1784TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001785 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001786
1787 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001788 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001789 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001790 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001791 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanov46084422020-10-13 12:33:42 +02001792
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001793 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1794 .vote = LayerVoteType::ExplicitDefault,
1795 .desiredRefreshRate = 60_Hz,
1796 .seamlessness = Seamlessness::SeamedAndSeamless,
1797 .weight = 0.5f,
1798 .focused = false},
1799 {.name = "25Hz ExplicitExactOrMultiple",
1800 .vote = LayerVoteType::ExplicitExactOrMultiple,
1801 .desiredRefreshRate = 25_Hz,
1802 .seamlessness = Seamlessness::OnlySeamless,
1803 .weight = 1.f,
1804 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001805
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001806 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001807
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001808 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001809 seamedLayer.desiredRefreshRate = 30_Hz;
1810 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001811 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001812
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001813 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001814}
1815
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001816TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001817 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001818
1819 // Allow group switching.
Dominik Laskowski36dced82022-09-02 09:24:00 -07001820 RefreshRateConfigs::DisplayManagerPolicy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001821 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001822 policy.allowGroupSwitching = true;
Dominik Laskowski36dced82022-09-02 09:24:00 -07001823 EXPECT_EQ(SetPolicyResult::Changed, configs.setPolicy(policy));
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001824
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001825 std::vector<LayerRequirement> layers = {
1826 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001827
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001828 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001829}
1830
Steven Thomasf734df42020-04-13 21:09:28 -07001831TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001832 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001833
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001834 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001835 layers[0].name = "Test layer";
1836
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001837 struct Args {
1838 bool touch = false;
1839 bool focused = true;
1840 };
1841
Steven Thomasbb374322020-04-28 22:47:16 -07001842 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001843 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001844 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001845 layers[0].vote = voteType;
1846 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001847 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001848 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001849 };
1850
Dominik Laskowski36dced82022-09-02 09:24:00 -07001851 EXPECT_EQ(SetPolicyResult::Changed,
1852 configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001853
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001854 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001855 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1856 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1857 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1858 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1859 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1860 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001861
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001862 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001863 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1864 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001865 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001866
Steven Thomasf734df42020-04-13 21:09:28 -07001867 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001868 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1869
Steven Thomasf734df42020-04-13 21:09:28 -07001870 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1871 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001872 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1873 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001874 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001875
Dominik Laskowski36dced82022-09-02 09:24:00 -07001876 EXPECT_EQ(SetPolicyResult::Changed,
1877 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08001878
1879 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1880 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1881 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1882 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1883 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1884 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001885}
1886
Steven Thomasbb374322020-04-28 22:47:16 -07001887TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001888 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001889
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001890 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001891 layers[0].name = "Test layer";
1892
Marin Shalamanov23c44202020-12-22 19:09:20 +01001893 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001894 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001895 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001896
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001897 const auto [ranking, signals] =
1898 configs.getRankedRefreshRates(layers, {.touch = touchActive, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001899
1900 // Refresh rate will be chosen by either touch state or idle state.
1901 EXPECT_EQ(!touchActive, signals.idle);
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04001902 return ranking.front().modePtr->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001903 };
1904
Dominik Laskowski36dced82022-09-02 09:24:00 -07001905 EXPECT_EQ(SetPolicyResult::Changed,
1906 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}));
Steven Thomasbb374322020-04-28 22:47:16 -07001907
1908 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001909 {
1910 constexpr bool kTouchActive = true;
1911 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1912 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1913 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1914 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1915 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1916 EXPECT_EQ(kModeId90,
1917 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1918 }
Steven Thomasbb374322020-04-28 22:47:16 -07001919
1920 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001921 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001922
1923 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001924 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001925
1926 {
1927 constexpr bool kTouchActive = false;
1928 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1929 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1930 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1931 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1932 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1933 EXPECT_EQ(kModeId60,
1934 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1935 }
Steven Thomasbb374322020-04-28 22:47:16 -07001936
1937 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001938 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001939}
1940
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001941TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001942 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001943
1944 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001945 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1946 const Fps expectedFrameRate = [fps] {
1947 if (fps < 26.91f) return 24_Hz;
1948 if (fps < 37.51f) return 30_Hz;
1949 if (fps < 52.51f) return 45_Hz;
1950 if (fps < 66.01f) return 60_Hz;
1951 if (fps < 81.01f) return 72_Hz;
1952 return 90_Hz;
1953 }();
1954
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001955 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001956 }
1957}
1958
1959TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001960 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001961
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001962 struct Expectation {
1963 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001964 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001965 };
1966
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001967 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001968 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1969 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001970 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001971
1972 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001973 const auto& knownFrameRates = configs.knownFrameRates();
1974 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001975 knownFrameRatesExpectations.begin(),
1976 [](Fps fps, const Expectation& expected) {
1977 return isApproxEqual(fps, expected.fps);
1978 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001979 EXPECT_TRUE(equal);
1980
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001981 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001982 auto& layer = layers[0];
1983 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001984
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001985 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001986 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001987 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001988 }
1989}
1990
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001991TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001992 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001993
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001994 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001995 auto& explicitExactLayer = layers[0];
1996 auto& explicitExactOrMultipleLayer = layers[1];
1997
1998 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1999 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002000 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002001
2002 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2003 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002004 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002005
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002006 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
2007 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002008
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002009 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2010 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002011 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002012
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002013 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002014 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002015
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002016 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002017 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002018
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002019 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002020 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002021}
2022
2023TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002024 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
2025 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002026
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002027 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002028 auto& explicitExactLayer = layers[0];
2029 auto& explicitExactOrMultipleLayer = layers[1];
2030
2031 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2032 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002033 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002034
2035 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2036 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002037 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002038
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002039 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2040 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002041
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002042 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2043 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002044 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002045
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002046 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002047 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002048
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002049 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002050 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002051
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002052 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002053 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002054}
2055
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002056TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002057 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002058
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002059 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2060 const auto args = std::make_pair(std::vector<LayerRequirement>{},
2061 GlobalSignals{.touch = true, .idle = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002062
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04002063 const RefreshRateConfigs::RankedRefreshRates result = {{RefreshRateConfigs::ScoredRefreshRate{
2064 kMode90}},
2065 {.touch = true}};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002066
ramindanid72ba162022-09-09 21:33:40 +00002067 configs.mutableGetRankedRefreshRatesCache() = {args, result};
2068
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04002069 EXPECT_EQ(result, configs.getRankedRefreshRates(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002070}
2071
2072TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002073 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
2074
ramindanid72ba162022-09-09 21:33:40 +00002075 EXPECT_FALSE(configs.mutableGetRankedRefreshRatesCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002076
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002077 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002078 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002079
Dominik Laskowski530d6bd2022-10-10 16:55:54 -04002080 const auto result = configs.getRankedRefreshRates(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002081
ramindanid72ba162022-09-09 21:33:40 +00002082 const auto& cache = configs.mutableGetRankedRefreshRatesCache();
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002083 ASSERT_TRUE(cache);
2084
2085 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
2086 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002087}
2088
Ady Abraham5e4e9832021-06-14 13:40:56 -07002089TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002090 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07002091
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002092 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002093 auto& explicitExactLayer = layers[0];
2094 auto& explicitExactOrMultipleLayer = layers[1];
2095
2096 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2097 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002098 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002099
2100 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2101 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002102 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002103
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002104 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2105 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002106
2107 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2108
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002109 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2110 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002111}
2112
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002113TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002114 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
2115 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002116
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002117 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002118 auto& explicitDefaultLayer = layers[0];
2119 auto& explicitExactOrMultipleLayer = layers[1];
2120
2121 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2122 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002123 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002124
2125 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2126 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002127 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002128
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002129 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002130}
2131
Ady Abraham05243be2021-09-16 15:58:52 -07002132// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08002133TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07002134 constexpr int kMinRefreshRate = 10;
2135 constexpr int kMaxRefreshRate = 240;
2136
2137 DisplayModes displayModes;
2138 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002139 const DisplayModeId modeId(fps);
2140 displayModes.try_emplace(modeId,
2141 createDisplayMode(modeId,
2142 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07002143 }
2144
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002145 const TestableRefreshRateConfigs configs(std::move(displayModes),
2146 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07002147
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002148 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07002149 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2150 layers[0].desiredRefreshRate = fps;
2151 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002152 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07002153 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07002154 };
2155
2156 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002157 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07002158 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2159 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2160 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2161 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2162 }
2163}
2164
Ady Abraham1c595502022-01-13 21:58:32 -08002165// b/190578904
2166TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002167 constexpr DisplayModeId kActiveModeId{0};
2168 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
2169 createDisplayMode(DisplayModeId(1), 53_Hz),
2170 createDisplayMode(DisplayModeId(2), 55_Hz),
2171 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08002172
2173 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002174 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08002175
Dominik Laskowski0c252702021-12-20 20:32:09 -08002176 const std::vector<LayerRequirement> layers = {
2177 {
Ady Abraham1c595502022-01-13 21:58:32 -08002178 .vote = LayerVoteType::ExplicitDefault,
2179 .desiredRefreshRate = 43_Hz,
2180 .seamlessness = Seamlessness::SeamedAndSeamless,
2181 .weight = 0.41f,
2182 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08002183 {
Ady Abraham1c595502022-01-13 21:58:32 -08002184 .vote = LayerVoteType::ExplicitExactOrMultiple,
2185 .desiredRefreshRate = 53_Hz,
2186 .seamlessness = Seamlessness::SeamedAndSeamless,
2187 .weight = 0.41f,
2188 },
2189 };
2190
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002191 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08002192}
2193
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002194TEST_F(RefreshRateConfigsTest, modeComparison) {
2195 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
2196 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
2197 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07002198}
2199
2200TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002201 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07002202
Dominik Laskowski36dced82022-09-02 09:24:00 -07002203 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002204
Dominik Laskowski36dced82022-09-02 09:24:00 -07002205 // setPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002206 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002207
Dominik Laskowski36dced82022-09-02 09:24:00 -07002208 // setPolicy(60, 90), current 60Hz => TurnOn.
2209 EXPECT_EQ(SetPolicyResult::Changed,
2210 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002211 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002212
Dominik Laskowski36dced82022-09-02 09:24:00 -07002213 // setPolicy(60, 60), current 60Hz => TurnOff
2214 EXPECT_EQ(SetPolicyResult::Changed,
2215 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002216 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002217
Dominik Laskowski36dced82022-09-02 09:24:00 -07002218 // setPolicy(90, 90), current 90Hz => TurnOff.
2219 EXPECT_EQ(SetPolicyResult::Changed,
2220 configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002221 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002222}
2223
TreeHugger Robot758ab612021-06-22 19:17:29 +00002224TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002225 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00002226
Dominik Laskowski36dced82022-09-02 09:24:00 -07002227 TestableRefreshRateConfigs configs(kModes_60_120, kModeId120);
Dominik Laskowski0c252702021-12-20 20:32:09 -08002228
Dominik Laskowski36dced82022-09-02 09:24:00 -07002229 // setPolicy(0, 60), current 60Hz => TurnOn.
2230 EXPECT_EQ(SetPolicyResult::Changed,
2231 configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002232 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002233
Dominik Laskowski36dced82022-09-02 09:24:00 -07002234 // setPolicy(60, 60), current 60Hz => TurnOff.
2235 EXPECT_EQ(SetPolicyResult::Changed,
2236 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002237 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002238
Dominik Laskowski36dced82022-09-02 09:24:00 -07002239 // setPolicy(60, 120), current 60Hz => TurnOn.
2240 EXPECT_EQ(SetPolicyResult::Changed,
2241 configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002242 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002243
Dominik Laskowski36dced82022-09-02 09:24:00 -07002244 // setPolicy(120, 120), current 120Hz => TurnOff.
2245 EXPECT_EQ(SetPolicyResult::Changed,
2246 configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}));
Dominik Laskowski0c252702021-12-20 20:32:09 -08002247 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002248}
2249
Ady Abrahamcc315492022-02-17 17:06:39 -08002250TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002251 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002252
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002253 const auto frameRate = 30_Hz;
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002254 Fps displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002255 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002256
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002257 configs.setActiveModeId(kModeId60);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002258 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002259 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002260
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002261 configs.setActiveModeId(kModeId72);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002262 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002263 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002264
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002265 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002266 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002267 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002268
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002269 configs.setActiveModeId(kModeId120);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002270 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002271 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002272
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002273 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002274 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002275 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002276
Ady Abrahamcc315492022-02-17 17:06:39 -08002277 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
2278 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
2279 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
2280 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002281}
2282
2283TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002284 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2285 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002286
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002287 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2288 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002289
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002290 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2291 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002292
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002293 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2294 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002295
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002296 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2297 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002298
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002299 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 +02002300 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002301 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002302 }
2303
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002304 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2305 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2306 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002307}
2308
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002309TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002310 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08002311
Dominik Laskowski0c252702021-12-20 20:32:09 -08002312 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002313}
2314
2315TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002316 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2317 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002318
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002319 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002320 layers[0].name = "Test layer";
2321 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002322 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002323 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002324
2325 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2326 EXPECT_EQ(1u, frameRateOverrides.size());
2327 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2328 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002329
2330 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002331 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2332 EXPECT_EQ(1u, frameRateOverrides.size());
2333 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2334 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002335
2336 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002337 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2338 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002339
2340 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002341 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2342 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002343
2344 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002345 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2346 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002347
2348 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002349 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2350 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002351}
2352
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002353TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002354 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2355 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002356
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002357 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2358 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002359
2360 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002361 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002362 layers[0].vote = LayerVoteType::ExplicitDefault;
2363
2364 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002365 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002366 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002367 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002368
Dominik Laskowski0c252702021-12-20 20:32:09 -08002369 EXPECT_EQ(2u, frameRateOverrides.size());
2370 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2371 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2372 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2373 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002374
2375 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002376 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2377 EXPECT_EQ(1u, frameRateOverrides.size());
2378 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2379 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002380
2381 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002382 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2383 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002384}
2385
2386TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002387 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2388 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002389
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002390 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002391 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002392 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002393 layers[0].vote = LayerVoteType::ExplicitDefault;
2394
Dominik Laskowski0c252702021-12-20 20:32:09 -08002395 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2396 EXPECT_EQ(1u, frameRateOverrides.size());
2397 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2398 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002399
Dominik Laskowski0c252702021-12-20 20:32:09 -08002400 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2401 EXPECT_EQ(1u, frameRateOverrides.size());
2402 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2403 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002404
2405 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002406 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2407 EXPECT_EQ(1u, frameRateOverrides.size());
2408 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2409 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002410
Dominik Laskowski0c252702021-12-20 20:32:09 -08002411 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2412 EXPECT_EQ(1u, frameRateOverrides.size());
2413 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2414 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002415
2416 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002417 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2418 EXPECT_EQ(1u, frameRateOverrides.size());
2419 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2420 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002421
Dominik Laskowski0c252702021-12-20 20:32:09 -08002422 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2423 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002424}
2425
Alec Mouri0a1cc962019-03-14 12:33:02 -07002426} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002427} // namespace android::scheduler