blob: a706c4b33b44356face1c4c16530ec32f31e99ab [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "SchedulerUnittests"
19
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070020#include <ftl/enum.h>
Dominik Laskowskif8734e02022-08-26 09:06:59 -070021#include <ftl/fake_guard.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070022#include <gmock/gmock.h>
23#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010024#include <ui/Size.h>
25
Alec Mouri0a1cc962019-03-14 12:33:02 -070026#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070027#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070028#include "Scheduler/RefreshRateConfigs.h"
Dominik Laskowskib0054a22022-03-03 09:03:06 -080029#include "mock/DisplayHardware/MockDisplayMode.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070030
31using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070032
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070033namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070034
Peiyong Line9d809e2020-04-14 13:10:48 -070035namespace hal = android::hardware::graphics::composer::hal;
36
Ady Abraham8a82ba62020-01-17 12:43:17 -080037using LayerVoteType = RefreshRateConfigs::LayerVoteType;
38using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070039
Dominik Laskowskib0054a22022-03-03 09:03:06 -080040using mock::createDisplayMode;
41
Dominik Laskowski0c252702021-12-20 20:32:09 -080042struct TestableRefreshRateConfigs : RefreshRateConfigs {
43 using RefreshRateConfigs::RefreshRateConfigs;
ramindanid72ba162022-09-09 21:33:40 +000044 using RefreshRateConfigs::RefreshRateOrder;
Dominik Laskowski0c252702021-12-20 20:32:09 -080045
Dominik Laskowskif8734e02022-08-26 09:06:59 -070046 void setActiveModeId(DisplayModeId modeId) {
47 ftl::FakeGuard guard(kMainThreadContext);
48 return RefreshRateConfigs::setActiveModeId(modeId);
49 }
50
51 const DisplayMode& getActiveMode() const {
52 ftl::FakeGuard guard(kMainThreadContext);
53 return RefreshRateConfigs::getActiveMode();
54 }
55
Dominik Laskowskib0054a22022-03-03 09:03:06 -080056 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080057 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080058 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080059 }
60
Dominik Laskowskib0054a22022-03-03 09:03:06 -080061 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080062 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080063 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080064 }
65
Dominik Laskowskib0054a22022-03-03 09:03:06 -080066 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080067 std::lock_guard lock(mLock);
68 return getMinRefreshRateByPolicyLocked();
69 }
70
ramindanid72ba162022-09-09 21:33:40 +000071 DisplayModePtr getMaxRefreshRateByPolicy() const {
72 std::lock_guard lock(mLock);
73 return getMaxRefreshRateByPolicyLocked(getActiveModeItLocked()->second->getGroup());
74 }
75
76 std::vector<RefreshRateRanking> getRefreshRatesByPolicy(
77 std::optional<int> anchorGroupOpt, RefreshRateOrder refreshRateOrder) const {
78 std::lock_guard lock(mLock);
79 return RefreshRateConfigs::getRefreshRatesByPolicyLocked(anchorGroupOpt, refreshRateOrder);
80 }
81
Dominik Laskowski0c252702021-12-20 20:32:09 -080082 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
83
ramindanid72ba162022-09-09 21:33:40 +000084 using RefreshRateConfigs::GetRankedRefreshRatesCache;
85 auto& mutableGetRankedRefreshRatesCache() { return mGetRankedRefreshRatesCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080086
ramindanid72ba162022-09-09 21:33:40 +000087 auto getRankedRefreshRatesAndSignals(const std::vector<LayerRequirement>& layers,
88 GlobalSignals signals) const {
89 return RefreshRateConfigs::getRankedRefreshRates(layers, signals);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080090 }
91
Dominik Laskowskib0054a22022-03-03 09:03:06 -080092 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
93 GlobalSignals signals = {}) const {
ramindanid72ba162022-09-09 21:33:40 +000094 return getRankedRefreshRatesAndSignals(layers, signals).first.front().displayModePtr;
Dominik Laskowski0c252702021-12-20 20:32:09 -080095 }
96};
97
Alec Mouri0a1cc962019-03-14 12:33:02 -070098class RefreshRateConfigsTest : public testing::Test {
99protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -0700100 RefreshRateConfigsTest();
101 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -0700102
Dominik Laskowski0c252702021-12-20 20:32:09 -0800103 static constexpr DisplayModeId kModeId60{0};
104 static constexpr DisplayModeId kModeId90{1};
105 static constexpr DisplayModeId kModeId72{2};
106 static constexpr DisplayModeId kModeId120{3};
107 static constexpr DisplayModeId kModeId30{4};
108 static constexpr DisplayModeId kModeId25{5};
109 static constexpr DisplayModeId kModeId50{6};
110 static constexpr DisplayModeId kModeId24{7};
111 static constexpr DisplayModeId kModeId24Frac{8};
112 static constexpr DisplayModeId kModeId30Frac{9};
113 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700114
Dominik Laskowski0c252702021-12-20 20:32:09 -0800115 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
116 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
117 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
118 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
119 static inline const DisplayModePtr kMode90_4K =
120 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
121 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
122 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
123 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
124 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
125 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
126 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
127 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
128 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
129 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
130 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
131 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
132 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700133
Dominik Laskowski0c252702021-12-20 20:32:09 -0800134 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800135 static inline const DisplayModes kModes_60 = makeModes(kMode60);
136 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
137 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
138 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
139 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
140 static inline const DisplayModes kModes_60_90_72_120 =
141 makeModes(kMode60, kMode90, kMode72, kMode120);
142 static inline const DisplayModes kModes_30_60_72_90_120 =
143 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100144
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800145 static inline const DisplayModes kModes_30_60 =
146 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
147 static inline const DisplayModes kModes_30_60_72_90 =
148 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
149 static inline const DisplayModes kModes_30_60_90 =
150 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
151 static inline const DisplayModes kModes_25_30_50_60 =
152 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
153 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700154
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200155 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800156 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
157 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
158 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700159};
160
161RefreshRateConfigsTest::RefreshRateConfigsTest() {
162 const ::testing::TestInfo* const test_info =
163 ::testing::UnitTest::GetInstance()->current_test_info();
164 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
165}
166
167RefreshRateConfigsTest::~RefreshRateConfigsTest() {
168 const ::testing::TestInfo* const test_info =
169 ::testing::UnitTest::GetInstance()->current_test_info();
170 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
171}
172
173namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700174
Dominik Laskowski0c252702021-12-20 20:32:09 -0800175TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
176 RefreshRateConfigs configs(kModes_60, kModeId60);
177 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700178}
179
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100180TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800181 RefreshRateConfigs configs(kModes_60, kModeId60);
182 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
183 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100184}
185
Dominik Laskowski0c252702021-12-20 20:32:09 -0800186TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
187 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188
Dominik Laskowski0c252702021-12-20 20:32:09 -0800189 const auto minRate = configs.getMinSupportedRefreshRate();
190 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700191
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800192 EXPECT_EQ(kMode60, minRate);
193 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800194
Dominik Laskowski0c252702021-12-20 20:32:09 -0800195 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
196 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
197
198 EXPECT_EQ(minRateByPolicy, minRate);
199 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700200}
Ady Abraham2139f732019-11-13 18:56:40 -0800201
Dominik Laskowski0c252702021-12-20 20:32:09 -0800202TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
203 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800204
Dominik Laskowski0c252702021-12-20 20:32:09 -0800205 const auto minRate = configs.getMinRefreshRateByPolicy();
206 const auto performanceRate = configs.getMaxSupportedRefreshRate();
207 const auto minRate60 = configs.getMinRefreshRateByPolicy();
208 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800209
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800210 EXPECT_EQ(kMode60, minRate);
211 EXPECT_EQ(kMode60, minRate60);
212 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800213
Dominik Laskowski0c252702021-12-20 20:32:09 -0800214 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800215 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800216
Dominik Laskowski0c252702021-12-20 20:32:09 -0800217 const auto minRate90 = configs.getMinRefreshRateByPolicy();
218 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800219
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800220 EXPECT_EQ(kMode90_G1, performanceRate);
221 EXPECT_EQ(kMode90_G1, minRate90);
222 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700223}
224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
226 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700227
Dominik Laskowski0c252702021-12-20 20:32:09 -0800228 const auto minRate = configs.getMinRefreshRateByPolicy();
229 const auto performanceRate = configs.getMaxSupportedRefreshRate();
230 const auto minRate60 = configs.getMinRefreshRateByPolicy();
231 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700232
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800233 EXPECT_EQ(kMode60, minRate);
234 EXPECT_EQ(kMode60, minRate60);
235 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700236
Dominik Laskowski0c252702021-12-20 20:32:09 -0800237 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800238 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700239
Dominik Laskowski0c252702021-12-20 20:32:09 -0800240 const auto minRate90 = configs.getMinRefreshRateByPolicy();
241 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700242
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800243 EXPECT_EQ(kMode90_4K, performanceRate);
244 EXPECT_EQ(kMode90_4K, minRate90);
245 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800246}
247
Dominik Laskowski0c252702021-12-20 20:32:09 -0800248TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
249 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800250
Dominik Laskowski0c252702021-12-20 20:32:09 -0800251 const auto minRate = configs.getMinRefreshRateByPolicy();
252 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800253
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800254 EXPECT_EQ(kMode60, minRate);
255 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Dominik Laskowski0c252702021-12-20 20:32:09 -0800257 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800258
Dominik Laskowski0c252702021-12-20 20:32:09 -0800259 const auto minRate60 = configs.getMinRefreshRateByPolicy();
260 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
261
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800262 EXPECT_EQ(kMode60, minRate60);
263 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800264}
265
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800266TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800268 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700269 const auto& mode = configs.getActiveMode();
270 EXPECT_EQ(mode.getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800271 }
272
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800273 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800274 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700275 const auto& mode = configs.getActiveMode();
276 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800277 }
278
Dominik Laskowski0c252702021-12-20 20:32:09 -0800279 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800280 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700281 const auto& mode = configs.getActiveMode();
282 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800283 }
284}
285
Steven Thomasbb374322020-04-28 22:47:16 -0700286TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800287 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800288 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800289
Dominik Laskowski0c252702021-12-20 20:32:09 -0800290 // If there are no layers we select the default frame rate, which is the max of the primary
291 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800292 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800293
Dominik Laskowski0c252702021-12-20 20:32:09 -0800294 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800295 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800296 }
297 {
298 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800299 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800300 constexpr bool kAllowGroupSwitching = true;
301 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
302 NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800303 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800304 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800305}
306
Steven Thomasbb374322020-04-28 22:47:16 -0700307TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800308 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800309
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700310 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800311 auto& lr = layers[0];
312
313 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800314 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800315 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800316
317 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800318 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800319 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800320
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700321 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800322 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800323 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800324 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800325
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700326 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800327 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800328 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700330 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800331 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800332 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800333
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700334 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800335 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800336 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800337
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700338 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800339 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800340 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800341
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800342 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800343 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800344
345 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800346 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800347
348 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800349 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800350
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700351 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800352 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800353 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700355 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800356 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800357
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700358 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800359 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800360
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700361 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800362 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800363
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700364 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800365 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
Dominik Laskowski0c252702021-12-20 20:32:09 -0800367 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368
369 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800370 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
372 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800373 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700375 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800377 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700379 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800380 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800383 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700385 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800386 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700388 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800389 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Dominik Laskowski0c252702021-12-20 20:32:09 -0800391 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800393 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
395 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800396 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700398 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800400 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700402 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800403 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700405 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800406 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700408 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800409 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800410
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700411 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800412 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413}
414
rnlee3bd610662021-06-23 16:27:57 -0700415TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800416 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700417
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700418 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700419 auto& lr = layers[0];
420
421 lr.vote = LayerVoteType::Min;
422 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800423 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700424
425 lr.vote = LayerVoteType::Max;
426 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800427 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700428
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700429 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700430 lr.vote = LayerVoteType::Heuristic;
431 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800432 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700433
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700434 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700435 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800436 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700437
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700438 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700439 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800440 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700441
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700442 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700443 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800444 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700445
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700446 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700447 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800448 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700449}
450
Steven Thomasbb374322020-04-28 22:47:16 -0700451TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800452 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700454 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455 auto& lr = layers[0];
456
457 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800458 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
460 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800461 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700463 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800465 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700467 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800468 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700470 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800471 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700473 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800474 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700476 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800477 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478}
479
Steven Thomasbb374322020-04-28 22:47:16 -0700480TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800481 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700483 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484 auto& lr1 = layers[0];
485 auto& lr2 = layers[1];
486
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700487 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800488 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700489 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800491 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700495 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800496 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800497 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700499 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700501 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800502 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800503 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800504}
505
Steven Thomasbb374322020-04-28 22:47:16 -0700506TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800507 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800508
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800510 auto& lr1 = layers[0];
511 auto& lr2 = layers[1];
512
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700513 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800514 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800515 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700516 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800517 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800518 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800519 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800520
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700521 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800522 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800523 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700524 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800525 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800526 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800527 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800528
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700529 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800530 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800531 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700532 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800533 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800534 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800535 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800536
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700537 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800538 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800539 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700540 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800541 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800542 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800543 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800544
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700545 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800546 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
547 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700548 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800549 lr2.vote = LayerVoteType::ExplicitDefault;
550 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800551 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800552
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700553 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800554 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800555 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700556 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800557 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800558 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800559 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800560
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700561 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800562 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800563 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700564 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800565 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800566 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800567 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800568
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700569 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800570 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800571 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700572 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800573 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800574 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800575 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800576
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700577 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800578 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800579 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700580 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800581 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800582 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800583 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800584}
585
rnlee3bd610662021-06-23 16:27:57 -0700586TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800587 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
588 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700589
Ady Abraham62f51d92022-08-24 22:20:22 +0000590 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700591 auto& lr1 = layers[0];
592 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000593 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700595 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700596 lr1.vote = LayerVoteType::ExplicitDefault;
597 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700598 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700599 lr2.vote = LayerVoteType::Heuristic;
600 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800601 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700602
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700603 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700604 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
605 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700606 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700607 lr2.vote = LayerVoteType::Heuristic;
608 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800609 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700610
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700611 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700612 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
613 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700614 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700615 lr2.vote = LayerVoteType::ExplicitDefault;
616 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800617 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700618
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700619 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700620 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
621 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700622 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700623 lr2.vote = LayerVoteType::Heuristic;
624 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800625 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700626
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700627 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700628 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
629 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700630 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700631 lr2.vote = LayerVoteType::ExplicitDefault;
632 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800633 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700634
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700635 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700636 lr1.vote = LayerVoteType::ExplicitDefault;
637 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700639 lr2.vote = LayerVoteType::Heuristic;
640 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800641 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700642
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700643 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700644 lr1.vote = LayerVoteType::Heuristic;
645 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700646 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700647 lr2.vote = LayerVoteType::ExplicitDefault;
648 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800649 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700650
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700651 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700652 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
653 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700654 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700655 lr2.vote = LayerVoteType::ExplicitDefault;
656 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800657 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700658
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700659 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700660 lr1.vote = LayerVoteType::ExplicitDefault;
661 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700662 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700663 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
664 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800665 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000666
667 lr1.desiredRefreshRate = 24_Hz;
668 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
669 lr1.name = "24Hz ExplicitExactOrMultiple";
670 lr2.vote = LayerVoteType::Max;
671 lr2.name = "Max";
672 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
673
674 lr1.desiredRefreshRate = 24_Hz;
675 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
676 lr1.name = "24Hz ExplicitExactOrMultiple";
677 lr2.desiredRefreshRate = 120_Hz;
678 lr2.vote = LayerVoteType::ExplicitDefault;
679 lr2.name = "120Hz ExplicitDefault";
680 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
681
682 lr1.desiredRefreshRate = 24_Hz;
683 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
684 lr1.name = "24Hz ExplicitExactOrMultiple";
685 lr2.desiredRefreshRate = 120_Hz;
686 lr2.vote = LayerVoteType::ExplicitExact;
687 lr2.name = "120Hz ExplicitExact";
688 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000689
690 lr1.desiredRefreshRate = 10_Hz;
691 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
692 lr1.name = "30Hz ExplicitExactOrMultiple";
693 lr2.desiredRefreshRate = 120_Hz;
694 lr2.vote = LayerVoteType::Heuristic;
695 lr2.name = "120Hz ExplicitExact";
696 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
697
698 lr1.desiredRefreshRate = 30_Hz;
699 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
700 lr1.name = "30Hz ExplicitExactOrMultiple";
701 lr2.desiredRefreshRate = 30_Hz;
702 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
703 lr2.name = "30Hz ExplicitExactOrMultiple";
704 lr3.vote = LayerVoteType::Heuristic;
705 lr3.desiredRefreshRate = 120_Hz;
706 lr3.name = "120Hz Heuristic";
707 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700708}
709
Steven Thomasbb374322020-04-28 22:47:16 -0700710TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800711 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800712
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700713 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800714 auto& lr = layers[0];
715
716 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800717 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800718
719 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800720 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800721
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700722 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800723 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800724 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800725
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700726 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800727 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800728
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700729 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800730 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800731
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700732 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800733 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700735 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800736 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800737}
738
Steven Thomasbb374322020-04-28 22:47:16 -0700739TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800740 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800741
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700742 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800743 auto& lr = layers[0];
744
745 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800746 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800747 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800748
749 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800750 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800751 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700753 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800754 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800755 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800756 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800757
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700758 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800759 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800760 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
761 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800762
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700763 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800764 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800765 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
766 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800767
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700768 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800769 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800770 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
771 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800772
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700773 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800774 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800775 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
776 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800777
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700778 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800779 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
780 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800781 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
782 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800783}
784
Steven Thomasbb374322020-04-28 22:47:16 -0700785TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800786 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800787
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700788 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800789 auto& lr1 = layers[0];
790 auto& lr2 = layers[1];
791
792 lr1.vote = LayerVoteType::Min;
793 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800794 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795
796 lr1.vote = LayerVoteType::Min;
797 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700798 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800799 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800800
801 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800802 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700803 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800804 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
806 lr1.vote = LayerVoteType::Max;
807 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700808 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800809 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810
811 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800812 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700813 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800814 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815
816 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700817 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800818 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700819 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800820 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821
822 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700823 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800824 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800826 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800827}
828
Steven Thomasbb374322020-04-28 22:47:16 -0700829TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800830 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800831
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700832 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800833 auto& lr = layers[0];
834
Ady Abraham71c437d2020-01-31 15:56:57 -0800835 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800836 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700837 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800838 const auto mode = configs.getBestRefreshRate(layers);
839 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
840 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841 }
842}
843
rnlee3bd610662021-06-23 16:27:57 -0700844TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800845 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
846 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700847
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700848 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700849 auto& lr = layers[0];
850
851 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
852 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700853 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800854 const auto mode = configs.getBestRefreshRate(layers);
855 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
856 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700857 }
858}
859
Dominik Laskowski0c252702021-12-20 20:32:09 -0800860TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800861 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700863 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800864 auto& lr1 = layers[0];
865 auto& lr2 = layers[1];
866
867 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700868 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800869 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700870 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800871 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872
873 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700874 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800875 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700876 lr2.desiredRefreshRate = 60_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::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700880 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800881 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700882 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800883 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800884}
885
Steven Thomasbb374322020-04-28 22:47:16 -0700886TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800887 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800888
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800890 auto& lr = layers[0];
891
Ady Abraham71c437d2020-01-31 15:56:57 -0800892 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800893 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700894 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800895 const auto mode = configs.getBestRefreshRate(layers, {});
896 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
897 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800898 }
899}
900
Steven Thomasbb374322020-04-28 22:47:16 -0700901TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800902 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800903
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700904 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800905 auto& lr1 = layers[0];
906 auto& lr2 = layers[1];
907
908 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700909 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800910 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800911 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700912 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800913 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800914 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800915
916 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700917 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800918 lr1.name = "60Hz ExplicitExactOrMultiple";
919 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700920 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800921 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800922 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800923
924 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700925 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800926 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800927 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800928 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800929 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800930
931 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700932 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800933 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800934 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700935 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800936 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800937 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800938
939 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700940 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800941 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800942 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800943 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800944 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945}
946
947TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800948 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800949
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700950 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951 auto& lr1 = layers[0];
952 auto& lr2 = layers[1];
953
954 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700955 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800956 lr1.name = "60Hz ExplicitExactOrMultiple";
957 lr2.vote = LayerVoteType::NoVote;
958 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800959 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800960
961 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700962 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800963 lr1.name = "60Hz ExplicitExactOrMultiple";
964 lr2.vote = LayerVoteType::NoVote;
965 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800966 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800967
968 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700969 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800970 lr1.name = "60Hz ExplicitExactOrMultiple";
971 lr2.vote = LayerVoteType::Max;
972 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800973 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800974
975 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700976 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800977 lr1.name = "60Hz ExplicitExactOrMultiple";
978 lr2.vote = LayerVoteType::Max;
979 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800980 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800981
982 // The other layer starts to provide buffers
983 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700984 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800985 lr1.name = "60Hz ExplicitExactOrMultiple";
986 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700987 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800988 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800989 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800990}
991
ramindanid72ba162022-09-09 21:33:40 +0000992TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicy) {
993 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
994 // different group.
995 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
996 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
997 RefreshRateRanking{kMode60},
998 RefreshRateRanking{kMode30}};
999
1000 const std::vector<RefreshRateRanking>& refreshRates =
1001 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1002 TestableRefreshRateConfigs::RefreshRateOrder::
1003 Descending);
1004
1005 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1006 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1007 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1008 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1009 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1010 }
1011}
1012
1013TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicy) {
1014 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1015 // different group.
1016 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
1017 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1018 RefreshRateRanking{kMode60},
1019 RefreshRateRanking{kMode90}};
1020
1021 const std::vector<RefreshRateRanking>& refreshRates =
1022 configs.getRefreshRatesByPolicy(configs.getActiveMode().getGroup(),
1023 TestableRefreshRateConfigs::RefreshRateOrder::
1024 Ascending);
1025
1026 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1027 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1028 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1029 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1030 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1031 }
1032}
1033
1034TEST_F(RefreshRateConfigsTest, getMinRefreshRatesByPolicyOutsideTheGroup) {
1035 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1036 // different group.
1037 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1038 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode30},
1039 RefreshRateRanking{kMode60},
1040 RefreshRateRanking{kMode90}};
1041
1042 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}), 0);
1043
1044 const std::vector<RefreshRateRanking>& refreshRates =
1045 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1046 TestableRefreshRateConfigs::RefreshRateOrder::
1047 Ascending);
1048
1049 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1050 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1051 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1052 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1053 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1054 }
1055}
1056
1057TEST_F(RefreshRateConfigsTest, getMaxRefreshRatesByPolicyOutsideTheGroup) {
1058 // The kModes_30_60_90 contains two kMode72_G1, kMode120_G1 which are from the
1059 // different group.
1060 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId72);
1061 const std::vector<RefreshRateRanking>& expectedRefreshRates = {RefreshRateRanking{kMode90},
1062 RefreshRateRanking{kMode60},
1063 RefreshRateRanking{kMode30}};
1064
1065 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 90_Hz}, {30_Hz, 90_Hz}}), 0);
1066
1067 const std::vector<RefreshRateRanking>& refreshRates =
1068 configs.getRefreshRatesByPolicy(/*anchorGroupOpt*/ std::nullopt,
1069 TestableRefreshRateConfigs::RefreshRateOrder::
1070 Descending);
1071
1072 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1073 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1074 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1075 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1076 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1077 }
1078}
1079
ramindani38c84982022-08-29 18:02:57 +00001080TEST_F(RefreshRateConfigsTest, powerOnImminentConsidered) {
1081 RefreshRateConfigs configs(kModes_60_90, kModeId60);
ramindanid72ba162022-09-09 21:33:40 +00001082 std::vector<RefreshRateRanking> expectedRefreshRates = {RefreshRateRanking{kMode90},
1083 RefreshRateRanking{kMode60}};
ramindani38c84982022-08-29 18:02:57 +00001084
ramindanid72ba162022-09-09 21:33:40 +00001085 auto [refreshRates, signals] = configs.getRankedRefreshRates({}, {});
ramindani38c84982022-08-29 18:02:57 +00001086 EXPECT_FALSE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001087 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1088 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1089 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1090 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1091 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1092 }
ramindani38c84982022-08-29 18:02:57 +00001093
ramindanid72ba162022-09-09 21:33:40 +00001094 std::tie(refreshRates, signals) = configs.getRankedRefreshRates({}, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001095 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001096 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1097 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1098 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1099 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1100 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1101 }
ramindani38c84982022-08-29 18:02:57 +00001102
1103 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
1104 auto& lr1 = layers[0];
1105 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1106 lr1.desiredRefreshRate = 60_Hz;
1107 lr1.name = "60Hz ExplicitExactOrMultiple";
1108
ramindanid72ba162022-09-09 21:33:40 +00001109 std::tie(refreshRates, signals) =
1110 configs.getRankedRefreshRates(layers, {.powerOnImminent = true});
ramindani38c84982022-08-29 18:02:57 +00001111 EXPECT_TRUE(signals.powerOnImminent);
ramindanid72ba162022-09-09 21:33:40 +00001112 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1113 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1114 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1115 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1116 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1117 }
1118
1119 expectedRefreshRates = {RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90}};
1120 std::tie(refreshRates, signals) =
1121 configs.getRankedRefreshRates(layers, {.powerOnImminent = false});
1122 EXPECT_FALSE(signals.powerOnImminent);
1123 ASSERT_EQ(expectedRefreshRates.size(), refreshRates.size());
1124 for (size_t i = 0; i < expectedRefreshRates.size(); ++i) {
1125 EXPECT_EQ(expectedRefreshRates[i].displayModePtr, refreshRates[i].displayModePtr)
1126 << "Expected fps " << expectedRefreshRates[i].displayModePtr->getFps().getIntValue()
1127 << " Actual fps " << refreshRates[i].displayModePtr->getFps().getIntValue();
1128 }
ramindani38c84982022-08-29 18:02:57 +00001129}
1130
Ady Abraham6fb599b2020-03-05 13:48:22 -08001131TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001132 RefreshRateConfigs configs(kModes_60_90, kModeId60);
1133
ramindanid72ba162022-09-09 21:33:40 +00001134 auto [_, signals] = configs.getRankedRefreshRates({}, {});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001135 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001136
ramindanid72ba162022-09-09 21:33:40 +00001137 std::tie(std::ignore, signals) = configs.getRankedRefreshRates({}, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001138 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001139
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001140 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001141 auto& lr1 = layers[0];
1142 auto& lr2 = layers[1];
1143
1144 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001145 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001146 lr1.name = "60Hz ExplicitExactOrMultiple";
1147 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001148 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001149 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001150 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001151 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001152
1153 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001154 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001155 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001156 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001157 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001158 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001159 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001160 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001161
1162 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001163 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001164 lr1.name = "60Hz ExplicitExactOrMultiple";
1165 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001166 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001167 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001168 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001169 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001170
1171 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001172 lr1.desiredRefreshRate = 60_Hz;
ramindanid72ba162022-09-09 21:33:40 +00001173 lr1.name = "60Hz ExplicitDefault";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001174 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001175 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001176 lr2.name = "60Hz Heuristic";
ramindanid72ba162022-09-09 21:33:40 +00001177 std::tie(std::ignore, signals) = configs.getRankedRefreshRates(layers, {.touch = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001178 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001179}
1180
Steven Thomasbb374322020-04-28 22:47:16 -07001181TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001182 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001183
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001184 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001185 auto& lr = layers[0];
1186
1187 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001188 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1189 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001190
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001191 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001192
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001193 {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 -08001194
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001195 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001196
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001197 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001198
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001199 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001200
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001201 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001202
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001203 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001204 };
1205
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001206 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001207 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001208 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001209
1210 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001211 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001212 lr.name = ss.str();
1213
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001214 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001215 }
1216}
1217
1218TEST_F(RefreshRateConfigsTest,
1219 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001220 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001221 auto& lr = layers[0];
1222
1223 // Test that 23.976 will choose 24 if 23.976 is not supported
1224 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001225 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1226 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001227 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001228
1229 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001230 lr.desiredRefreshRate = 23.976_Hz;
1231 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001232 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001233 }
1234
1235 // Test that 24 will choose 23.976 if 24 is not supported
1236 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001237 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1238 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001239 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001240
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001241 lr.desiredRefreshRate = 24_Hz;
1242 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001243 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001244 }
1245
1246 // Test that 29.97 will prefer 59.94 over 60 and 30
1247 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001248 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1249 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001250 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001251
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001252 lr.desiredRefreshRate = 29.97_Hz;
1253 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001254 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001255 }
1256}
1257
1258TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001259 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001260 auto& lr = layers[0];
1261
1262 // Test that voting for supported refresh rate will select this refresh rate
1263 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001264 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001265
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001266 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 +02001267 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001268 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001269 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001270 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001271 lr.name = ss.str();
1272
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001273 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001274 }
1275 }
1276
1277 // Test that 23.976 will choose 24 if 23.976 is not supported
1278 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001279 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1280 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001281 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001282
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001283 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001284 lr.desiredRefreshRate = 23.976_Hz;
1285 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001286 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001287 }
1288
1289 // Test that 24 will choose 23.976 if 24 is not supported
1290 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001291 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1292 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001293 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001294
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001295 lr.desiredRefreshRate = 24_Hz;
1296 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001297 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001298 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001299}
1300
Alec Mouri11232a22020-05-14 18:06:25 -07001301TEST_F(RefreshRateConfigsTest,
1302 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001303 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001304
Dominik Laskowski0c252702021-12-20 20:32:09 -08001305 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001306
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001307 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001308 auto& lr = layers[0];
1309
Alec Mouri11232a22020-05-14 18:06:25 -07001310 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001311 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001312 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001313 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001314
ramindanid72ba162022-09-09 21:33:40 +00001315 const auto [mode, signals] =
1316 configs.getRankedRefreshRates(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001317
ramindanid72ba162022-09-09 21:33:40 +00001318 EXPECT_EQ(mode.begin()->displayModePtr, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001319 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001320}
1321
1322TEST_F(RefreshRateConfigsTest,
1323 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001324 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001325
Dominik Laskowski0c252702021-12-20 20:32:09 -08001326 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001327
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001328 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001329 auto& lr = layers[0];
1330
Alec Mouri11232a22020-05-14 18:06:25 -07001331 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001332 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001333 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001334 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001335 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001336}
1337
ramindanid72ba162022-09-09 21:33:40 +00001338TEST_F(RefreshRateConfigsTest, testDisplayModeOrdering) {
1339 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1340
1341 std::vector<LayerRequirement> layers = {{.weight = 1.f},
1342 {.weight = 1.f},
1343 {.weight = 1.f},
1344 {.weight = 1.f},
1345 {.weight = 1.f}};
1346 auto& lr1 = layers[0];
1347 auto& lr2 = layers[1];
1348 auto& lr3 = layers[2];
1349 auto& lr4 = layers[3];
1350 auto& lr5 = layers[4];
1351
1352 lr1.desiredRefreshRate = 90_Hz;
1353 lr1.name = "90Hz";
1354 lr1.focused = true;
1355
1356 lr2.desiredRefreshRate = 60_Hz;
1357 lr2.name = "60Hz";
1358 lr2.focused = true;
1359
1360 lr3.desiredRefreshRate = 72_Hz;
1361 lr3.name = "72Hz";
1362 lr3.focused = true;
1363
1364 lr4.desiredRefreshRate = 120_Hz;
1365 lr4.name = "120Hz";
1366 lr4.focused = true;
1367
1368 lr5.desiredRefreshRate = 30_Hz;
1369 lr5.name = "30Hz";
1370 lr5.focused = true;
1371
1372 std::vector<RefreshRateRanking> expectedRankings = {
1373 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1374 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1375 };
1376
1377 std::vector<RefreshRateRanking> actualOrder =
1378 configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1379 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1380 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1381 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1382 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1383 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1384 }
1385
1386 lr1.vote = LayerVoteType::Max;
1387 lr1.name = "Max";
1388
1389 lr2.desiredRefreshRate = 60_Hz;
1390 lr2.name = "60Hz";
1391
1392 lr3.desiredRefreshRate = 72_Hz;
1393 lr3.name = "72Hz";
1394
1395 lr4.desiredRefreshRate = 90_Hz;
1396 lr4.name = "90Hz";
1397
1398 lr5.desiredRefreshRate = 120_Hz;
1399 lr5.name = "120Hz";
1400
1401 expectedRankings = {
1402 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode90}, RefreshRateRanking{kMode72},
1403 RefreshRateRanking{kMode60}, RefreshRateRanking{kMode30},
1404 };
1405
1406 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1407
1408 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1409 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1410 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1411 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1412 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1413 }
1414
1415 lr1.vote = LayerVoteType::Heuristic;
1416 lr1.desiredRefreshRate = 30_Hz;
1417 lr1.name = "30Hz";
1418
1419 lr2.desiredRefreshRate = 120_Hz;
1420 lr2.name = "120Hz";
1421
1422 lr3.desiredRefreshRate = 60_Hz;
1423 lr3.name = "60Hz";
1424
1425 lr5.desiredRefreshRate = 72_Hz;
1426 lr5.name = "72Hz";
1427
1428 expectedRankings = {
1429 RefreshRateRanking{kMode30}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode90},
1430 RefreshRateRanking{kMode120}, RefreshRateRanking{kMode72},
1431 };
1432
1433 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1434 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1435 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1436 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1437 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1438 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1439 }
1440
1441 lr1.desiredRefreshRate = 120_Hz;
1442 lr1.name = "120Hz";
1443 lr1.weight = 0.0f;
1444
1445 lr2.desiredRefreshRate = 60_Hz;
1446 lr2.name = "60Hz";
1447 lr2.vote = LayerVoteType::NoVote;
1448
1449 lr3.name = "60Hz-2";
1450 lr3.vote = LayerVoteType::Heuristic;
1451
1452 lr4.vote = LayerVoteType::ExplicitExact;
1453
1454 lr5.desiredRefreshRate = 120_Hz;
1455 lr5.name = "120Hz-2";
1456
1457 expectedRankings = {
1458 RefreshRateRanking{kMode90}, RefreshRateRanking{kMode60}, RefreshRateRanking{kMode120},
1459 RefreshRateRanking{kMode72}, RefreshRateRanking{kMode30},
1460 };
1461
1462 actualOrder = configs.getRankedRefreshRatesAndSignals(layers, {}).first;
1463 ASSERT_EQ(expectedRankings.size(), actualOrder.size());
1464 for (size_t i = 0; i < expectedRankings.size(); ++i) {
1465 EXPECT_EQ(expectedRankings[i].displayModePtr, actualOrder[i].displayModePtr)
1466 << "Expected fps " << expectedRankings[i].displayModePtr->getFps().getIntValue()
1467 << " Actual fps " << actualOrder[i].displayModePtr->getFps().getIntValue();
1468 }
1469}
1470
Alec Mouri11232a22020-05-14 18:06:25 -07001471TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001472 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001473 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001474
Dominik Laskowski0c252702021-12-20 20:32:09 -08001475 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001476
ramindanid72ba162022-09-09 21:33:40 +00001477 const auto [mode, signals] = configs.getRankedRefreshRatesAndSignals({}, {});
1478 EXPECT_EQ(mode.front().displayModePtr, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001479 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001481 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001482 auto& lr = layers[0];
1483
1484 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001485 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001486 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001487 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001488 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001489
1490 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001491 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001492
1493 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001494 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001495 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001496 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001497 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001498
1499 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001500 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001501
1502 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001503 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001504 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001505 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001506 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001507
1508 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001509 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001510
1511 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001512 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001513 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001514 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001515 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001516
1517 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001518 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001519
1520 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001521 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001522 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001523 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001524 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001525
1526 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001527 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001528}
1529
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001530TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001531 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001532
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001533 // The default policy doesn't allow group switching. Verify that no
1534 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001535 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001536 auto& layer = layers[0];
1537 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001538 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001539 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001540 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001541 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001542
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001543 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001544}
Steven Thomasd4071902020-03-24 16:02:53 -07001545
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001546TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001547 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1548
Steven Thomasd4071902020-03-24 16:02:53 -07001549 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001550 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001551 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001552 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001553
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001554 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001555 auto& layer = layers[0];
1556 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001557 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001558 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1559 layer.name = "90Hz ExplicitDefault";
1560 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001561 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001562}
1563
1564TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001565 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001566
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001567 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001568 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001569 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001570 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001571
1572 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001573 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001574 auto& layer = layers[0];
1575 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001576 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001577 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001578 layer.name = "90Hz ExplicitDefault";
1579 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001580 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001581}
1582
1583TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001584 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001585
Dominik Laskowski0c252702021-12-20 20:32:09 -08001586 RefreshRateConfigs::Policy policy;
1587 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1588 policy.allowGroupSwitching = true;
1589 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1590
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001591 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001592
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001593 // 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 -07001594 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001595 auto& layer = layers[0];
1596 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001597 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001598 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001599 layer.name = "60Hz ExplicitDefault";
1600 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001601 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001602}
1603
1604TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001605 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001606
Dominik Laskowski0c252702021-12-20 20:32:09 -08001607 RefreshRateConfigs::Policy policy;
1608 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1609 policy.allowGroupSwitching = true;
1610 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1611
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001612 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001613
1614 // Verify that if the current config is in another group and there are no layers with
1615 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001616
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001617 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001618 auto& layer = layers[0];
1619 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001620 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001621 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001622 layer.name = "60Hz ExplicitDefault";
1623 layer.focused = true;
1624
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001625 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001626}
1627
1628TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001629 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001630
Dominik Laskowski0c252702021-12-20 20:32:09 -08001631 RefreshRateConfigs::Policy policy;
1632 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1633 policy.allowGroupSwitching = true;
1634 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1635
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001636 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001637
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001638 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001639 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001640 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001641 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001642 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001643 layers[0].seamlessness = Seamlessness::OnlySeamless;
1644 layers[0].name = "60Hz ExplicitDefault";
1645 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001646
1647 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001648 layers[1].vote = LayerVoteType::ExplicitDefault;
1649 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001650 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001651 layers[1].name = "90Hz ExplicitDefault";
1652 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001653
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001654 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001655}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001656
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001657TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001658 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001659
Dominik Laskowski0c252702021-12-20 20:32:09 -08001660 RefreshRateConfigs::Policy policy;
1661 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1662 policy.allowGroupSwitching = true;
1663 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1664
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001665 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001666
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001667 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1668 // seamlessness=Default can't change the mode group back to the group of the default
1669 // mode.
1670 // For example, this may happen when a video playback requests and gets a seamed switch,
1671 // but another layer (with default seamlessness) starts animating. The animating layer
1672 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001673 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001674 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001675 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001676 layers[0].focused = true;
1677 layers[0].vote = LayerVoteType::ExplicitDefault;
1678 layers[0].name = "60Hz ExplicitDefault";
1679
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001680 layers.push_back(LayerRequirement{.weight = 0.1f});
1681 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001682 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001683 layers[1].focused = true;
1684 layers[1].vote = LayerVoteType::ExplicitDefault;
1685 layers[1].name = "90Hz ExplicitDefault";
1686
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001687 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001688}
1689
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001690TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001691 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001692
Dominik Laskowski0c252702021-12-20 20:32:09 -08001693 RefreshRateConfigs::Policy policy;
1694 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1695 policy.allowGroupSwitching = true;
1696 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1697
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001698 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001699
1700 // Layer with seamlessness=Default can change the mode group if there's a not
1701 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1702 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001703 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001704 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001705 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001706 layers[0].focused = true;
1707 layers[0].vote = LayerVoteType::ExplicitDefault;
1708 layers[0].name = "60Hz ExplicitDefault";
1709
1710 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001711 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001712 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001713 layers[1].focused = false;
1714 layers[1].vote = LayerVoteType::ExplicitDefault;
1715 layers[1].name = "90Hz ExplicitDefault";
1716
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001717 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001718}
1719
1720TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001721 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001722
1723 // Allow group switching.
1724 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001725 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001726 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001727 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001728
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001729 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001730 auto& layer = layers[0];
1731 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001732 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001733 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001734 layer.name = "60Hz ExplicitExactOrMultiple";
1735 layer.focused = true;
1736
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001737 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001738
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001739 configs.setActiveModeId(kModeId120);
1740 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001741}
1742
1743TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001744 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001745
1746 // Allow group switching.
1747 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001748 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001749 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001750 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001751
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001752 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1753 .vote = LayerVoteType::ExplicitDefault,
1754 .desiredRefreshRate = 60_Hz,
1755 .seamlessness = Seamlessness::SeamedAndSeamless,
1756 .weight = 0.5f,
1757 .focused = false},
1758 {.name = "25Hz ExplicitExactOrMultiple",
1759 .vote = LayerVoteType::ExplicitExactOrMultiple,
1760 .desiredRefreshRate = 25_Hz,
1761 .seamlessness = Seamlessness::OnlySeamless,
1762 .weight = 1.f,
1763 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001764
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001765 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001766
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001767 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001768 seamedLayer.desiredRefreshRate = 30_Hz;
1769 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001770 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001771
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001772 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001773}
1774
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001775TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001776 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001777
1778 // Allow group switching.
1779 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001780 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001781 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001782 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001783
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001784 std::vector<LayerRequirement> layers = {
1785 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001786
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001787 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001788}
1789
Steven Thomasf734df42020-04-13 21:09:28 -07001790TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001791 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001792
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001793 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001794 layers[0].name = "Test layer";
1795
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001796 struct Args {
1797 bool touch = false;
1798 bool focused = true;
1799 };
1800
Steven Thomasbb374322020-04-28 22:47:16 -07001801 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001802 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001803 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001804 layers[0].vote = voteType;
1805 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001806 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001807 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001808 };
1809
Dominik Laskowski0c252702021-12-20 20:32:09 -08001810 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1811
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001812 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001813 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1814 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1815 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1816 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1817 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1818 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001819
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001820 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001821 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1822 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001823 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001824
Steven Thomasf734df42020-04-13 21:09:28 -07001825 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001826 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1827
Steven Thomasf734df42020-04-13 21:09:28 -07001828 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1829 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001830 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1831 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001832 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001833
Dominik Laskowski0c252702021-12-20 20:32:09 -08001834 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1835
1836 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1837 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1838 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1839 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1840 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1841 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001842}
1843
Steven Thomasbb374322020-04-28 22:47:16 -07001844TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001845 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001846
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001847 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001848 layers[0].name = "Test layer";
1849
Marin Shalamanov23c44202020-12-22 19:09:20 +01001850 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001851 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001852 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001853
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001854 const auto [refreshRate, signals] =
ramindanid72ba162022-09-09 21:33:40 +00001855 configs.getRankedRefreshRatesAndSignals(layers,
1856 {.touch = touchActive, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001857
1858 // Refresh rate will be chosen by either touch state or idle state.
1859 EXPECT_EQ(!touchActive, signals.idle);
ramindanid72ba162022-09-09 21:33:40 +00001860 return refreshRate.front().displayModePtr->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001861 };
1862
Dominik Laskowski0c252702021-12-20 20:32:09 -08001863 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001864
1865 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001866 {
1867 constexpr bool kTouchActive = true;
1868 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1869 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1870 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1871 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1872 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1873 EXPECT_EQ(kModeId90,
1874 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1875 }
Steven Thomasbb374322020-04-28 22:47:16 -07001876
1877 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001878 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001879
1880 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001881 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001882
1883 {
1884 constexpr bool kTouchActive = false;
1885 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1886 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1887 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1888 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1889 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1890 EXPECT_EQ(kModeId60,
1891 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1892 }
Steven Thomasbb374322020-04-28 22:47:16 -07001893
1894 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001895 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001896}
1897
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001898TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001899 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001900
1901 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001902 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1903 const Fps expectedFrameRate = [fps] {
1904 if (fps < 26.91f) return 24_Hz;
1905 if (fps < 37.51f) return 30_Hz;
1906 if (fps < 52.51f) return 45_Hz;
1907 if (fps < 66.01f) return 60_Hz;
1908 if (fps < 81.01f) return 72_Hz;
1909 return 90_Hz;
1910 }();
1911
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001912 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001913 }
1914}
1915
1916TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001917 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001918
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001919 struct Expectation {
1920 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001921 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001922 };
1923
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001924 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001925 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1926 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001927 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001928
1929 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001930 const auto& knownFrameRates = configs.knownFrameRates();
1931 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001932 knownFrameRatesExpectations.begin(),
1933 [](Fps fps, const Expectation& expected) {
1934 return isApproxEqual(fps, expected.fps);
1935 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001936 EXPECT_TRUE(equal);
1937
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001938 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001939 auto& layer = layers[0];
1940 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001941
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001942 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001943 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001944 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001945 }
1946}
1947
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001948TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001949 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001950
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001951 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001952 auto& explicitExactLayer = layers[0];
1953 auto& explicitExactOrMultipleLayer = layers[1];
1954
1955 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1956 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001957 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001958
1959 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1960 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001961 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001962
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001963 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
1964 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001965
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001966 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1967 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001968 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001969
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001970 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001971 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001972
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001973 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001974 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001975
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001976 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001977 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001978}
1979
1980TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001981 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1982 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001983
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001984 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001985 auto& explicitExactLayer = layers[0];
1986 auto& explicitExactOrMultipleLayer = layers[1];
1987
1988 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1989 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001990 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001991
1992 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1993 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001994 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001995
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001996 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1997 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001998
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001999 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
2000 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002001 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002002
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002003 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002004 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002005
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002006 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002007 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002008
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002009 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002010 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002011}
2012
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002013TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002014 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002015
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002016 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2017 const auto args = std::make_pair(std::vector<LayerRequirement>{},
2018 GlobalSignals{.touch = true, .idle = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002019
ramindanid72ba162022-09-09 21:33:40 +00002020 const auto result = std::make_pair(std::vector<RefreshRateRanking>{RefreshRateRanking{kMode90}},
2021 GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002022
ramindanid72ba162022-09-09 21:33:40 +00002023 configs.mutableGetRankedRefreshRatesCache() = {args, result};
2024
2025 EXPECT_EQ(result, configs.getRankedRefreshRatesAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002026}
2027
2028TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002029 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
2030
ramindanid72ba162022-09-09 21:33:40 +00002031 EXPECT_FALSE(configs.mutableGetRankedRefreshRatesCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002032
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002033 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002034 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002035
ramindanid72ba162022-09-09 21:33:40 +00002036 const auto result = configs.getRankedRefreshRatesAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002037
ramindanid72ba162022-09-09 21:33:40 +00002038 const auto& cache = configs.mutableGetRankedRefreshRatesCache();
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002039 ASSERT_TRUE(cache);
2040
2041 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
2042 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002043}
2044
Ady Abraham5e4e9832021-06-14 13:40:56 -07002045TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002046 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07002047
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002048 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002049 auto& explicitExactLayer = layers[0];
2050 auto& explicitExactOrMultipleLayer = layers[1];
2051
2052 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2053 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002054 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002055
2056 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2057 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002058 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07002059
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002060 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2061 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002062
2063 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2064
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002065 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
2066 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07002067}
2068
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002069TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08002070 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
2071 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002072
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002073 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002074 auto& explicitDefaultLayer = layers[0];
2075 auto& explicitExactOrMultipleLayer = layers[1];
2076
2077 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2078 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002079 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002080
2081 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2082 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002083 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002084
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002085 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002086}
2087
Ady Abraham05243be2021-09-16 15:58:52 -07002088// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08002089TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07002090 constexpr int kMinRefreshRate = 10;
2091 constexpr int kMaxRefreshRate = 240;
2092
2093 DisplayModes displayModes;
2094 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002095 const DisplayModeId modeId(fps);
2096 displayModes.try_emplace(modeId,
2097 createDisplayMode(modeId,
2098 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07002099 }
2100
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002101 const TestableRefreshRateConfigs configs(std::move(displayModes),
2102 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07002103
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002104 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07002105 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2106 layers[0].desiredRefreshRate = fps;
2107 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002108 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07002109 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07002110 };
2111
2112 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002113 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07002114 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2115 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2116 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2117 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2118 }
2119}
2120
Ady Abraham1c595502022-01-13 21:58:32 -08002121// b/190578904
2122TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002123 constexpr DisplayModeId kActiveModeId{0};
2124 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
2125 createDisplayMode(DisplayModeId(1), 53_Hz),
2126 createDisplayMode(DisplayModeId(2), 55_Hz),
2127 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08002128
2129 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002130 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08002131
Dominik Laskowski0c252702021-12-20 20:32:09 -08002132 const std::vector<LayerRequirement> layers = {
2133 {
Ady Abraham1c595502022-01-13 21:58:32 -08002134 .vote = LayerVoteType::ExplicitDefault,
2135 .desiredRefreshRate = 43_Hz,
2136 .seamlessness = Seamlessness::SeamedAndSeamless,
2137 .weight = 0.41f,
2138 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08002139 {
Ady Abraham1c595502022-01-13 21:58:32 -08002140 .vote = LayerVoteType::ExplicitExactOrMultiple,
2141 .desiredRefreshRate = 53_Hz,
2142 .seamlessness = Seamlessness::SeamedAndSeamless,
2143 .weight = 0.41f,
2144 },
2145 };
2146
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002147 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08002148}
2149
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002150TEST_F(RefreshRateConfigsTest, modeComparison) {
2151 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
2152 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
2153 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07002154}
2155
2156TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002157 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07002158
Dominik Laskowski0c252702021-12-20 20:32:09 -08002159 RefreshRateConfigs configs(kModes_60_90, kModeId90);
2160
Ana Krulecb9afd792020-06-11 13:16:15 -07002161 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002162 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002163
2164 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002165 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
2166 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002167
Ady Abrahama91605e2021-06-18 11:41:47 -07002168 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08002169 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
2170 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002171
2172 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002173 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
2174 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002175}
2176
TreeHugger Robot758ab612021-06-22 19:17:29 +00002177TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002178 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00002179
Dominik Laskowski0c252702021-12-20 20:32:09 -08002180 RefreshRateConfigs configs(kModes_60_120, kModeId120);
2181
TreeHugger Robot758ab612021-06-22 19:17:29 +00002182 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002183 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
2184 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002185
2186 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002187 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
2188 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002189
2190 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002191 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
2192 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002193
2194 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08002195 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
2196 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00002197}
2198
Ady Abrahamcc315492022-02-17 17:06:39 -08002199TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002200 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002201
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002202 const auto frameRate = 30_Hz;
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002203 Fps displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002204 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002205
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002206 configs.setActiveModeId(kModeId60);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002207 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002208 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002209
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002210 configs.setActiveModeId(kModeId72);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002211 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002212 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002213
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002214 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002215 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002216 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002217
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002218 configs.setActiveModeId(kModeId120);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002219 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002220 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002221
Dominik Laskowskib0054a22022-03-03 09:03:06 -08002222 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07002223 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08002224 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002225
Ady Abrahamcc315492022-02-17 17:06:39 -08002226 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
2227 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
2228 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
2229 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002230}
2231
2232TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002233 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2234 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002235
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002236 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2237 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002238
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002239 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2240 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002241
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002242 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2243 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002244
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002245 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2246 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002247
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002248 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 +02002249 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002250 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002251 }
2252
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002253 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2254 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2255 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002256}
2257
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002258TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002259 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08002260
Dominik Laskowski0c252702021-12-20 20:32:09 -08002261 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002262}
2263
2264TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002265 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2266 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002267
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002268 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002269 layers[0].name = "Test layer";
2270 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002271 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002272 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002273
2274 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2275 EXPECT_EQ(1u, frameRateOverrides.size());
2276 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2277 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002278
2279 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002280 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2281 EXPECT_EQ(1u, frameRateOverrides.size());
2282 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2283 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002284
2285 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002286 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2287 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002288
2289 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002290 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2291 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002292
2293 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002294 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2295 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002296
2297 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002298 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2299 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002300}
2301
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002302TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002303 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2304 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002305
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002306 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2307 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002308
2309 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002310 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002311 layers[0].vote = LayerVoteType::ExplicitDefault;
2312
2313 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002314 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002315 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002316 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002317
Dominik Laskowski0c252702021-12-20 20:32:09 -08002318 EXPECT_EQ(2u, frameRateOverrides.size());
2319 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2320 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2321 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2322 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002323
2324 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002325 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[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002331 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2332 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002333}
2334
2335TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002336 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2337 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002338
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002339 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002340 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002341 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002342 layers[0].vote = LayerVoteType::ExplicitDefault;
2343
Dominik Laskowski0c252702021-12-20 20:32:09 -08002344 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2345 EXPECT_EQ(1u, frameRateOverrides.size());
2346 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2347 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002348
Dominik Laskowski0c252702021-12-20 20:32:09 -08002349 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2350 EXPECT_EQ(1u, frameRateOverrides.size());
2351 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2352 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002353
2354 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002355 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2356 EXPECT_EQ(1u, frameRateOverrides.size());
2357 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2358 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002359
Dominik Laskowski0c252702021-12-20 20:32:09 -08002360 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2361 EXPECT_EQ(1u, frameRateOverrides.size());
2362 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2363 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002364
2365 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002366 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2367 EXPECT_EQ(1u, frameRateOverrides.size());
2368 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2369 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002370
Dominik Laskowski0c252702021-12-20 20:32:09 -08002371 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2372 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002373}
2374
Alec Mouri0a1cc962019-03-14 12:33:02 -07002375} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002376} // namespace android::scheduler