blob: 4f20932f2f72d97bf24b215b2962483a503b57f8 [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;
44
Dominik Laskowskif8734e02022-08-26 09:06:59 -070045 void setActiveModeId(DisplayModeId modeId) {
46 ftl::FakeGuard guard(kMainThreadContext);
47 return RefreshRateConfigs::setActiveModeId(modeId);
48 }
49
50 const DisplayMode& getActiveMode() const {
51 ftl::FakeGuard guard(kMainThreadContext);
52 return RefreshRateConfigs::getActiveMode();
53 }
54
Dominik Laskowskib0054a22022-03-03 09:03:06 -080055 DisplayModePtr getMinSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080056 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080057 return mMinRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080058 }
59
Dominik Laskowskib0054a22022-03-03 09:03:06 -080060 DisplayModePtr getMaxSupportedRefreshRate() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080061 std::lock_guard lock(mLock);
Dominik Laskowskib0054a22022-03-03 09:03:06 -080062 return mMaxRefreshRateModeIt->second;
Dominik Laskowski0c252702021-12-20 20:32:09 -080063 }
64
Dominik Laskowskib0054a22022-03-03 09:03:06 -080065 DisplayModePtr getMinRefreshRateByPolicy() const {
Dominik Laskowski0c252702021-12-20 20:32:09 -080066 std::lock_guard lock(mLock);
67 return getMinRefreshRateByPolicyLocked();
68 }
69
70 const std::vector<Fps>& knownFrameRates() const { return mKnownFrameRates; }
71
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080072 using RefreshRateConfigs::GetBestRefreshRateCache;
73 auto& mutableGetBestRefreshRateCache() { return mGetBestRefreshRateCache; }
Dominik Laskowski0c252702021-12-20 20:32:09 -080074
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080075 auto getBestRefreshRateAndSignals(const std::vector<LayerRequirement>& layers,
76 GlobalSignals signals) const {
77 return RefreshRateConfigs::getBestRefreshRate(layers, signals);
78 }
79
Dominik Laskowskib0054a22022-03-03 09:03:06 -080080 DisplayModePtr getBestRefreshRate(const std::vector<LayerRequirement>& layers = {},
81 GlobalSignals signals = {}) const {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -080082 return getBestRefreshRateAndSignals(layers, signals).first;
Dominik Laskowski0c252702021-12-20 20:32:09 -080083 }
84};
85
Alec Mouri0a1cc962019-03-14 12:33:02 -070086class RefreshRateConfigsTest : public testing::Test {
87protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070088 RefreshRateConfigsTest();
89 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070090
Dominik Laskowski0c252702021-12-20 20:32:09 -080091 static constexpr DisplayModeId kModeId60{0};
92 static constexpr DisplayModeId kModeId90{1};
93 static constexpr DisplayModeId kModeId72{2};
94 static constexpr DisplayModeId kModeId120{3};
95 static constexpr DisplayModeId kModeId30{4};
96 static constexpr DisplayModeId kModeId25{5};
97 static constexpr DisplayModeId kModeId50{6};
98 static constexpr DisplayModeId kModeId24{7};
99 static constexpr DisplayModeId kModeId24Frac{8};
100 static constexpr DisplayModeId kModeId30Frac{9};
101 static constexpr DisplayModeId kModeId60Frac{10};
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700102
Dominik Laskowski0c252702021-12-20 20:32:09 -0800103 static inline const DisplayModePtr kMode60 = createDisplayMode(kModeId60, 60_Hz);
104 static inline const DisplayModePtr kMode60Frac = createDisplayMode(kModeId60Frac, 59.94_Hz);
105 static inline const DisplayModePtr kMode90 = createDisplayMode(kModeId90, 90_Hz);
106 static inline const DisplayModePtr kMode90_G1 = createDisplayMode(kModeId90, 90_Hz, 1);
107 static inline const DisplayModePtr kMode90_4K =
108 createDisplayMode(kModeId90, 90_Hz, 0, {3840, 2160});
109 static inline const DisplayModePtr kMode72 = createDisplayMode(kModeId72, 72_Hz);
110 static inline const DisplayModePtr kMode72_G1 = createDisplayMode(kModeId72, 72_Hz, 1);
111 static inline const DisplayModePtr kMode120 = createDisplayMode(kModeId120, 120_Hz);
112 static inline const DisplayModePtr kMode120_G1 = createDisplayMode(kModeId120, 120_Hz, 1);
113 static inline const DisplayModePtr kMode30 = createDisplayMode(kModeId30, 30_Hz);
114 static inline const DisplayModePtr kMode30_G1 = createDisplayMode(kModeId30, 30_Hz, 1);
115 static inline const DisplayModePtr kMode30Frac = createDisplayMode(kModeId30Frac, 29.97_Hz);
116 static inline const DisplayModePtr kMode25 = createDisplayMode(kModeId25, 25_Hz);
117 static inline const DisplayModePtr kMode25_G1 = createDisplayMode(kModeId25, 25_Hz, 1);
118 static inline const DisplayModePtr kMode50 = createDisplayMode(kModeId50, 50_Hz);
119 static inline const DisplayModePtr kMode24 = createDisplayMode(kModeId24, 24_Hz);
120 static inline const DisplayModePtr kMode24Frac = createDisplayMode(kModeId24Frac, 23.976_Hz);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700121
Dominik Laskowski0c252702021-12-20 20:32:09 -0800122 // Test configurations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800123 static inline const DisplayModes kModes_60 = makeModes(kMode60);
124 static inline const DisplayModes kModes_60_90 = makeModes(kMode60, kMode90);
125 static inline const DisplayModes kModes_60_90_G1 = makeModes(kMode60, kMode90_G1);
126 static inline const DisplayModes kModes_60_90_4K = makeModes(kMode60, kMode90_4K);
127 static inline const DisplayModes kModes_60_72_90 = makeModes(kMode60, kMode90, kMode72);
128 static inline const DisplayModes kModes_60_90_72_120 =
129 makeModes(kMode60, kMode90, kMode72, kMode120);
130 static inline const DisplayModes kModes_30_60_72_90_120 =
131 makeModes(kMode60, kMode90, kMode72, kMode120, kMode30);
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100132
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800133 static inline const DisplayModes kModes_30_60 =
134 makeModes(kMode60, kMode90_G1, kMode72_G1, kMode120_G1, kMode30);
135 static inline const DisplayModes kModes_30_60_72_90 =
136 makeModes(kMode60, kMode90, kMode72, kMode120_G1, kMode30);
137 static inline const DisplayModes kModes_30_60_90 =
138 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30);
139 static inline const DisplayModes kModes_25_30_50_60 =
140 makeModes(kMode60, kMode90, kMode72_G1, kMode120_G1, kMode30_G1, kMode25_G1, kMode50);
141 static inline const DisplayModes kModes_60_120 = makeModes(kMode60, kMode120);
Ady Abrahamabc27602020-04-08 17:20:29 -0700142
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200143 // This is a typical TV configuration.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800144 static inline const DisplayModes kModes_24_25_30_50_60_Frac =
145 makeModes(kMode24, kMode24Frac, kMode25, kMode30, kMode30Frac, kMode50, kMode60,
146 kMode60Frac);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700147};
148
149RefreshRateConfigsTest::RefreshRateConfigsTest() {
150 const ::testing::TestInfo* const test_info =
151 ::testing::UnitTest::GetInstance()->current_test_info();
152 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
153}
154
155RefreshRateConfigsTest::~RefreshRateConfigsTest() {
156 const ::testing::TestInfo* const test_info =
157 ::testing::UnitTest::GetInstance()->current_test_info();
158 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
159}
160
161namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700162
Dominik Laskowski0c252702021-12-20 20:32:09 -0800163TEST_F(RefreshRateConfigsTest, oneMode_canSwitch) {
164 RefreshRateConfigs configs(kModes_60, kModeId60);
165 EXPECT_FALSE(configs.canSwitch());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700166}
167
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100168TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800169 RefreshRateConfigs configs(kModes_60, kModeId60);
170 EXPECT_LT(configs.setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
171 EXPECT_LT(configs.setDisplayManagerPolicy({kModeId60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100172}
173
Dominik Laskowski0c252702021-12-20 20:32:09 -0800174TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap) {
175 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700176
Dominik Laskowski0c252702021-12-20 20:32:09 -0800177 const auto minRate = configs.getMinSupportedRefreshRate();
178 const auto performanceRate = configs.getMaxSupportedRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700179
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800180 EXPECT_EQ(kMode60, minRate);
181 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800182
Dominik Laskowski0c252702021-12-20 20:32:09 -0800183 const auto minRateByPolicy = configs.getMinRefreshRateByPolicy();
184 const auto performanceRateByPolicy = configs.getMaxRefreshRateByPolicy();
185
186 EXPECT_EQ(minRateByPolicy, minRate);
187 EXPECT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188}
Ady Abraham2139f732019-11-13 18:56:40 -0800189
Dominik Laskowski0c252702021-12-20 20:32:09 -0800190TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentGroups) {
191 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800192
Dominik Laskowski0c252702021-12-20 20:32:09 -0800193 const auto minRate = configs.getMinRefreshRateByPolicy();
194 const auto performanceRate = configs.getMaxSupportedRefreshRate();
195 const auto minRate60 = configs.getMinRefreshRateByPolicy();
196 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800197
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800198 EXPECT_EQ(kMode60, minRate);
199 EXPECT_EQ(kMode60, minRate60);
200 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800201
Dominik Laskowski0c252702021-12-20 20:32:09 -0800202 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800203 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800204
Dominik Laskowski0c252702021-12-20 20:32:09 -0800205 const auto minRate90 = configs.getMinRefreshRateByPolicy();
206 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800207
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800208 EXPECT_EQ(kMode90_G1, performanceRate);
209 EXPECT_EQ(kMode90_G1, minRate90);
210 EXPECT_EQ(kMode90_G1, performanceRate90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700211}
212
Dominik Laskowski0c252702021-12-20 20:32:09 -0800213TEST_F(RefreshRateConfigsTest, twoModes_storesFullRefreshRateMap_differentResolutions) {
214 TestableRefreshRateConfigs configs(kModes_60_90_4K, kModeId60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700215
Dominik Laskowski0c252702021-12-20 20:32:09 -0800216 const auto minRate = configs.getMinRefreshRateByPolicy();
217 const auto performanceRate = configs.getMaxSupportedRefreshRate();
218 const auto minRate60 = configs.getMinRefreshRateByPolicy();
219 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700220
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800221 EXPECT_EQ(kMode60, minRate);
222 EXPECT_EQ(kMode60, minRate60);
223 EXPECT_EQ(kMode60, performanceRate60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700224
Dominik Laskowski0c252702021-12-20 20:32:09 -0800225 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {60_Hz, 90_Hz}}), 0);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800226 configs.setActiveModeId(kModeId90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700227
Dominik Laskowski0c252702021-12-20 20:32:09 -0800228 const auto minRate90 = configs.getMinRefreshRateByPolicy();
229 const auto performanceRate90 = configs.getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700230
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800231 EXPECT_EQ(kMode90_4K, performanceRate);
232 EXPECT_EQ(kMode90_4K, minRate90);
233 EXPECT_EQ(kMode90_4K, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800234}
235
Dominik Laskowski0c252702021-12-20 20:32:09 -0800236TEST_F(RefreshRateConfigsTest, twoModes_policyChange) {
237 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800238
Dominik Laskowski0c252702021-12-20 20:32:09 -0800239 const auto minRate = configs.getMinRefreshRateByPolicy();
240 const auto performanceRate = configs.getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800241
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800242 EXPECT_EQ(kMode60, minRate);
243 EXPECT_EQ(kMode90, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800244
Dominik Laskowski0c252702021-12-20 20:32:09 -0800245 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Dominik Laskowski0c252702021-12-20 20:32:09 -0800247 const auto minRate60 = configs.getMinRefreshRateByPolicy();
248 const auto performanceRate60 = configs.getMaxRefreshRateByPolicy();
249
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800250 EXPECT_EQ(kMode60, minRate60);
251 EXPECT_EQ(kMode60, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800252}
253
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800254TEST_F(RefreshRateConfigsTest, twoModes_getActiveMode) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800255 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800256 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700257 const auto& mode = configs.getActiveMode();
258 EXPECT_EQ(mode.getId(), kModeId60);
Ady Abraham2139f732019-11-13 18:56:40 -0800259 }
260
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800261 configs.setActiveModeId(kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800262 {
Dominik Laskowskif8734e02022-08-26 09:06:59 -0700263 const auto& mode = configs.getActiveMode();
264 EXPECT_EQ(mode.getId(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800265 }
266
Dominik Laskowski0c252702021-12-20 20:32:09 -0800267 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
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(), kModeId90);
Ady Abraham2139f732019-11-13 18:56:40 -0800271 }
272}
273
Steven Thomasbb374322020-04-28 22:47:16 -0700274TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800275 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800276 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800277
Dominik Laskowski0c252702021-12-20 20:32:09 -0800278 // If there are no layers we select the default frame rate, which is the max of the primary
279 // range.
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800280 EXPECT_EQ(kMode90, configs.getBestRefreshRate());
Ana Krulec3d367c82020-02-25 15:02:01 -0800281
Dominik Laskowski0c252702021-12-20 20:32:09 -0800282 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800283 EXPECT_EQ(kMode60, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800284 }
285 {
286 // We select max even when this will cause a non-seamless switch.
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800287 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -0800288 constexpr bool kAllowGroupSwitching = true;
289 EXPECT_EQ(configs.setDisplayManagerPolicy({kModeId90, kAllowGroupSwitching, {0_Hz, 90_Hz}}),
290 NO_ERROR);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800291 EXPECT_EQ(kMode90_G1, configs.getBestRefreshRate());
Dominik Laskowski0c252702021-12-20 20:32:09 -0800292 }
Ana Krulec3d367c82020-02-25 15:02:01 -0800293}
294
Steven Thomasbb374322020-04-28 22:47:16 -0700295TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800296 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700298 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 auto& lr = layers[0];
300
301 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800302 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800303 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800304
305 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800306 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800307 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800308
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700309 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800310 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800311 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800312 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800313
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700314 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800315 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800316 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800317
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700318 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800319 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800320 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800321
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700322 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800323 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800324 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800325
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700326 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800327 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800328 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800330 lr.name = "";
Dominik Laskowski0c252702021-12-20 20:32:09 -0800331 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800332
333 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800334 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800335
336 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800337 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700339 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800341 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800342
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700343 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800344 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700346 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800347 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700349 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800350 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700352 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800353 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Dominik Laskowski0c252702021-12-20 20:32:09 -0800355 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800356
357 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800358 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359
360 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800361 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700363 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800365 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700367 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800368 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700370 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800371 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800372
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700373 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800374 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800375
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700376 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800377 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski0c252702021-12-20 20:32:09 -0800379 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800380 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800381 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800382
383 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800384 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700386 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800388 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700390 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800391 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700393 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800394 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700396 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800397 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700399 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800400 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401}
402
rnlee3bd610662021-06-23 16:27:57 -0700403TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800404 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60, {.frameRateMultipleThreshold = 90});
rnlee3bd610662021-06-23 16:27:57 -0700405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700407 auto& lr = layers[0];
408
409 lr.vote = LayerVoteType::Min;
410 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800411 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700412
413 lr.vote = LayerVoteType::Max;
414 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800415 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700416
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700417 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700418 lr.vote = LayerVoteType::Heuristic;
419 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800420 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700421
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700422 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700423 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800424 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700425
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700426 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700427 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800428 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700429
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700430 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700431 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800432 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700433
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700434 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700435 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800436 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700437}
438
Steven Thomasbb374322020-04-28 22:47:16 -0700439TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800440 TestableRefreshRateConfigs configs(kModes_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700442 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443 auto& lr = layers[0];
444
445 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800446 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
448 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800449 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700451 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800453 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700455 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800456 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700458 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800459 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700461 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800462 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700464 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800465 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466}
467
Steven Thomasbb374322020-04-28 22:47:16 -0700468TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800469 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700471 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472 auto& lr1 = layers[0];
473 auto& lr2 = layers[1];
474
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700475 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700477 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800479 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700481 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700483 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800485 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486
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 = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800491 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492}
493
Steven Thomasbb374322020-04-28 22:47:16 -0700494TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800495 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800496
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700497 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800498 auto& lr1 = layers[0];
499 auto& lr2 = layers[1];
500
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700501 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800502 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800503 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700504 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800505 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800506 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800507 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800508
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800510 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800511 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700512 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800513 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800514 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800515 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800516
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700517 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800518 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800519 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700520 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800521 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800522 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800523 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800524
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700525 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800526 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800527 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700528 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800529 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800530 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800531 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800532
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700533 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800534 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
535 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700536 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800537 lr2.vote = LayerVoteType::ExplicitDefault;
538 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800539 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800540
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700541 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800542 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700544 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800545 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800546 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800547 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800548
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800550 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800551 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700552 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800553 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800554 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800555 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800556
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700557 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800558 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800559 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700560 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800561 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800562 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800563 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800564
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700565 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800566 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800567 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700568 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800569 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800570 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800571 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham71c437d2020-01-31 15:56:57 -0800572}
573
rnlee3bd610662021-06-23 16:27:57 -0700574TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800575 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
576 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700577
Ady Abraham62f51d92022-08-24 22:20:22 +0000578 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700579 auto& lr1 = layers[0];
580 auto& lr2 = layers[1];
Ady Abraham62f51d92022-08-24 22:20:22 +0000581 auto& lr3 = layers[2];
rnlee3bd610662021-06-23 16:27:57 -0700582
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700583 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700584 lr1.vote = LayerVoteType::ExplicitDefault;
585 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700586 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700587 lr2.vote = LayerVoteType::Heuristic;
588 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800589 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700590
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700591 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700592 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
593 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700594 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700595 lr2.vote = LayerVoteType::Heuristic;
596 lr2.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800597 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700598
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700599 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700600 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
601 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700602 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700603 lr2.vote = LayerVoteType::ExplicitDefault;
604 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800605 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700606
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700607 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700608 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
609 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700610 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700611 lr2.vote = LayerVoteType::Heuristic;
612 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800613 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700614
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700615 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700616 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
617 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700618 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700619 lr2.vote = LayerVoteType::ExplicitDefault;
620 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800621 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700622
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700623 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700624 lr1.vote = LayerVoteType::ExplicitDefault;
625 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700626 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700627 lr2.vote = LayerVoteType::Heuristic;
628 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800629 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700630
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700631 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700632 lr1.vote = LayerVoteType::Heuristic;
633 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700634 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700635 lr2.vote = LayerVoteType::ExplicitDefault;
636 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800637 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700638
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700639 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700640 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
641 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700642 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700643 lr2.vote = LayerVoteType::ExplicitDefault;
644 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800645 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700646
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700647 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700648 lr1.vote = LayerVoteType::ExplicitDefault;
649 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700650 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700651 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
652 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800653 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamae2e3c72022-08-13 05:12:13 +0000654
655 lr1.desiredRefreshRate = 24_Hz;
656 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
657 lr1.name = "24Hz ExplicitExactOrMultiple";
658 lr2.vote = LayerVoteType::Max;
659 lr2.name = "Max";
660 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
661
662 lr1.desiredRefreshRate = 24_Hz;
663 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
664 lr1.name = "24Hz ExplicitExactOrMultiple";
665 lr2.desiredRefreshRate = 120_Hz;
666 lr2.vote = LayerVoteType::ExplicitDefault;
667 lr2.name = "120Hz ExplicitDefault";
668 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
669
670 lr1.desiredRefreshRate = 24_Hz;
671 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
672 lr1.name = "24Hz ExplicitExactOrMultiple";
673 lr2.desiredRefreshRate = 120_Hz;
674 lr2.vote = LayerVoteType::ExplicitExact;
675 lr2.name = "120Hz ExplicitExact";
676 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abraham62f51d92022-08-24 22:20:22 +0000677
678 lr1.desiredRefreshRate = 10_Hz;
679 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
680 lr1.name = "30Hz ExplicitExactOrMultiple";
681 lr2.desiredRefreshRate = 120_Hz;
682 lr2.vote = LayerVoteType::Heuristic;
683 lr2.name = "120Hz ExplicitExact";
684 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
685
686 lr1.desiredRefreshRate = 30_Hz;
687 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
688 lr1.name = "30Hz ExplicitExactOrMultiple";
689 lr2.desiredRefreshRate = 30_Hz;
690 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
691 lr2.name = "30Hz ExplicitExactOrMultiple";
692 lr3.vote = LayerVoteType::Heuristic;
693 lr3.desiredRefreshRate = 120_Hz;
694 lr3.name = "120Hz Heuristic";
695 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
rnlee3bd610662021-06-23 16:27:57 -0700696}
697
Steven Thomasbb374322020-04-28 22:47:16 -0700698TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800699 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800700
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700701 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800702 auto& lr = layers[0];
703
704 lr.vote = LayerVoteType::Min;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800705 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800706
707 lr.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800708 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800709
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700710 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800711 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800712 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800713
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700714 lr.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800715 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800716
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700717 lr.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800718 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800719
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700720 lr.desiredRefreshRate = 30_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800721 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800722
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700723 lr.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800724 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800725}
726
Steven Thomasbb374322020-04-28 22:47:16 -0700727TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800728 TestableRefreshRateConfigs configs(kModes_30_60_72_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700730 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800731 auto& lr = layers[0];
732
733 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800734 lr.name = "Min";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800735 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800736
737 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800738 lr.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800739 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800740
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700741 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800742 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800743 lr.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800744 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800745
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700746 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800747 lr.name = "60Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800748 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
749 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800750
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700751 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800752 lr.name = "45Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800753 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
754 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700756 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800757 lr.name = "30Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800758 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
759 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800760
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700761 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800762 lr.name = "24Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800763 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
764 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800765
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700766 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800767 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
768 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800769 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
770 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771}
772
Steven Thomasbb374322020-04-28 22:47:16 -0700773TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800774 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700776 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777 auto& lr1 = layers[0];
778 auto& lr2 = layers[1];
779
780 lr1.vote = LayerVoteType::Min;
781 lr2.vote = LayerVoteType::Max;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800782 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800783
784 lr1.vote = LayerVoteType::Min;
785 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700786 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800787 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
789 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800790 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700791 lr2.desiredRefreshRate = 24_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800792 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800793
794 lr1.vote = LayerVoteType::Max;
795 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700796 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800797 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
799 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800800 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700801 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800802 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800803
804 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700805 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700807 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800808 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809
810 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700811 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800812 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700813 lr2.desiredRefreshRate = 45_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800814 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815}
816
Steven Thomasbb374322020-04-28 22:47:16 -0700817TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800818 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700820 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821 auto& lr = layers[0];
822
Ady Abraham71c437d2020-01-31 15:56:57 -0800823 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700825 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800826 const auto mode = configs.getBestRefreshRate(layers);
827 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
828 << to_string(mode->getFps());
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829 }
830}
831
rnlee3bd610662021-06-23 16:27:57 -0700832TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800833 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60,
834 {.frameRateMultipleThreshold = 120});
rnlee3bd610662021-06-23 16:27:57 -0700835
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700836 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700837 auto& lr = layers[0];
838
839 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
840 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700841 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800842 const auto mode = configs.getBestRefreshRate(layers);
843 EXPECT_EQ(kMode60, mode) << lr.desiredRefreshRate << " chooses "
844 << to_string(mode->getFps());
rnlee3bd610662021-06-23 16:27:57 -0700845 }
846}
847
Dominik Laskowski0c252702021-12-20 20:32:09 -0800848TEST_F(RefreshRateConfigsTest, twoModes_getBestRefreshRate_Explicit) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800849 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800850
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700851 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852 auto& lr1 = layers[0];
853 auto& lr2 = layers[1];
854
855 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700856 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800857 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700858 lr2.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800859 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800860
861 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700862 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800863 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700864 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800865 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800866
867 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700868 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800869 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700870 lr2.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800871 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800872}
873
Steven Thomasbb374322020-04-28 22:47:16 -0700874TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800875 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800876
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700877 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800878 auto& lr = layers[0];
879
Ady Abraham71c437d2020-01-31 15:56:57 -0800880 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800881 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700882 lr.desiredRefreshRate = Fps::fromValue(fps);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800883 const auto mode = configs.getBestRefreshRate(layers, {});
884 EXPECT_EQ(kMode90, mode) << lr.desiredRefreshRate << " chooses "
885 << to_string(mode->getFps());
Ady Abrahamf6b77072020-01-30 14:22:54 -0800886 }
887}
888
Steven Thomasbb374322020-04-28 22:47:16 -0700889TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800890 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham34702102020-02-10 14:12:05 -0800891
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700892 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800893 auto& lr1 = layers[0];
894 auto& lr2 = layers[1];
895
896 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700897 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800899 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700900 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800901 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800902 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800903
904 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700905 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800906 lr1.name = "60Hz ExplicitExactOrMultiple";
907 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700908 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800909 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800910 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800911
912 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700913 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800914 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800915 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800916 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800917 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800918
919 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700920 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800921 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800922 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700923 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800924 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800925 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham34702102020-02-10 14:12:05 -0800926
927 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700928 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800929 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800930 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800931 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800932 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800933}
934
935TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800936 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800937
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700938 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800939 auto& lr1 = layers[0];
940 auto& lr2 = layers[1];
941
942 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700943 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800944 lr1.name = "60Hz ExplicitExactOrMultiple";
945 lr2.vote = LayerVoteType::NoVote;
946 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800947 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800948
949 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700950 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951 lr1.name = "60Hz ExplicitExactOrMultiple";
952 lr2.vote = LayerVoteType::NoVote;
953 lr2.name = "NoVote";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800954 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800955
956 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700957 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958 lr1.name = "60Hz ExplicitExactOrMultiple";
959 lr2.vote = LayerVoteType::Max;
960 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800961 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800962
963 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700964 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800965 lr1.name = "60Hz ExplicitExactOrMultiple";
966 lr2.vote = LayerVoteType::Max;
967 lr2.name = "Max";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800968 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800969
970 // The other layer starts to provide buffers
971 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700972 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800973 lr1.name = "60Hz ExplicitExactOrMultiple";
974 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700975 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800976 lr2.name = "90Hz Heuristic";
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800977 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800978}
979
980TEST_F(RefreshRateConfigsTest, touchConsidered) {
Dominik Laskowski0c252702021-12-20 20:32:09 -0800981 RefreshRateConfigs configs(kModes_60_90, kModeId60);
982
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800983 auto [_, signals] = configs.getBestRefreshRate({}, {});
984 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800985
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800986 std::tie(std::ignore, signals) = configs.getBestRefreshRate({}, {.touch = true});
987 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800988
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700989 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -0800990 auto& lr1 = layers[0];
991 auto& lr2 = layers[1];
992
993 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700994 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800995 lr1.name = "60Hz ExplicitExactOrMultiple";
996 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700997 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -0700998 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -0800999 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1000 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001001
1002 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001003 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001004 lr1.name = "60Hz ExplicitExactOrMultiple";
1005 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001006 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001007 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001008 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1009 EXPECT_FALSE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001010
1011 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001012 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001013 lr1.name = "60Hz ExplicitExactOrMultiple";
1014 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001015 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001016 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001017 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1018 EXPECT_TRUE(signals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001019
1020 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001021 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001022 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001023 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001024 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001025 lr2.name = "60Hz Heuristic";
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001026 std::tie(std::ignore, signals) = configs.getBestRefreshRate(layers, {.touch = true});
1027 EXPECT_FALSE(signals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001028}
1029
Steven Thomasbb374322020-04-28 22:47:16 -07001030TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001031 TestableRefreshRateConfigs configs(kModes_60_90_72_120, kModeId60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001032
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001033 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001034 auto& lr = layers[0];
1035
1036 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001037 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1038 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001039
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001040 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001041
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001042 {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 -08001043
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001044 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001045
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001046 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001047
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001048 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001049
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001050 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001051
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001052 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001053 };
1054
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001055 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001056 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001057 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001058
1059 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001060 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001061 lr.name = ss.str();
1062
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001063 EXPECT_EQ(expected, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001064 }
1065}
1066
1067TEST_F(RefreshRateConfigsTest,
1068 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001069 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001070 auto& lr = layers[0];
1071
1072 // Test that 23.976 will choose 24 if 23.976 is not supported
1073 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001074 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1075 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001076 kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001077
1078 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001079 lr.desiredRefreshRate = 23.976_Hz;
1080 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001081 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001082 }
1083
1084 // Test that 24 will choose 23.976 if 24 is not supported
1085 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001086 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1087 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001088 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 lr.desiredRefreshRate = 24_Hz;
1091 lr.name = "ExplicitExactOrMultiple 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001092 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001093 }
1094
1095 // Test that 29.97 will prefer 59.94 over 60 and 30
1096 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001097 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode24Frac, kMode25, kMode30,
1098 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001099 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001100
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001101 lr.desiredRefreshRate = 29.97_Hz;
1102 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001103 EXPECT_EQ(kModeId60Frac, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001104 }
1105}
1106
1107TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001108 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001109 auto& lr = layers[0];
1110
1111 // Test that voting for supported refresh rate will select this refresh rate
1112 {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001113 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001114
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001115 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 +02001116 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001117 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001118 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001119 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001120 lr.name = ss.str();
1121
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001122 EXPECT_EQ(lr.desiredRefreshRate, configs.getBestRefreshRate(layers)->getFps());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001123 }
1124 }
1125
1126 // Test that 23.976 will choose 24 if 23.976 is not supported
1127 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001128 TestableRefreshRateConfigs configs(makeModes(kMode24, kMode25, kMode30, kMode30Frac,
1129 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001130 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001131
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001132 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001133 lr.desiredRefreshRate = 23.976_Hz;
1134 lr.name = "ExplicitExact 23.976 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001135 EXPECT_EQ(kModeId24, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001136 }
1137
1138 // Test that 24 will choose 23.976 if 24 is not supported
1139 {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001140 TestableRefreshRateConfigs configs(makeModes(kMode24Frac, kMode25, kMode30, kMode30Frac,
1141 kMode60, kMode60Frac),
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001142 kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001143
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001144 lr.desiredRefreshRate = 24_Hz;
1145 lr.name = "ExplicitExact 24 Hz";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001146 EXPECT_EQ(kModeId24Frac, configs.getBestRefreshRate(layers)->getId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001147 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001148}
1149
Alec Mouri11232a22020-05-14 18:06:25 -07001150TEST_F(RefreshRateConfigsTest,
1151 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001152 RefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001153
Dominik Laskowski0c252702021-12-20 20:32:09 -08001154 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001155
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001156 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001157 auto& lr = layers[0];
1158
Alec Mouri11232a22020-05-14 18:06:25 -07001159 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001160 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001161 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001162 lr.focused = true;
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001163
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001164 const auto [mode, signals] = configs.getBestRefreshRate(layers, {.touch = true, .idle = true});
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001165
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001166 EXPECT_EQ(mode, kMode60);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001167 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001168}
1169
1170TEST_F(RefreshRateConfigsTest,
1171 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001172 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Alec Mouri11232a22020-05-14 18:06:25 -07001173
Dominik Laskowski0c252702021-12-20 20:32:09 -08001174 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001175
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001176 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001177 auto& lr = layers[0];
1178
Alec Mouri11232a22020-05-14 18:06:25 -07001179 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001180 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001181 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001182 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001183 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001184}
1185
1186TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001187 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001188 TestableRefreshRateConfigs configs(kModes_60_90, kModeId90);
Alec Mouri11232a22020-05-14 18:06:25 -07001189
Dominik Laskowski0c252702021-12-20 20:32:09 -08001190 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Alec Mouri11232a22020-05-14 18:06:25 -07001191
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001192 const auto [mode, signals] = configs.getBestRefreshRateAndSignals({}, {});
1193 EXPECT_EQ(mode, kMode90);
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001194 EXPECT_FALSE(signals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001195
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001196 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001197 auto& lr = layers[0];
1198
1199 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001200 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001201 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001202 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001203 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001204
1205 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001206 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001207
1208 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001209 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001210 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001211 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001212 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001213
1214 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001215 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001216
1217 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001218 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001219 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001220 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001221 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001222
1223 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001224 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001225
1226 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001227 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001228 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001229 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001230 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001231
1232 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001233 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001234
1235 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001236 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001237 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001238 lr.focused = false;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001239 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001240
1241 lr.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001242 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Alec Mouri11232a22020-05-14 18:06:25 -07001243}
1244
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001245TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001246 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Steven Thomasd4071902020-03-24 16:02:53 -07001247
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001248 // The default policy doesn't allow group switching. Verify that no
1249 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001250 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001251 auto& layer = layers[0];
1252 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001253 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001254 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001255 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001256 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001257
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001258 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001259}
Steven Thomasd4071902020-03-24 16:02:53 -07001260
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001261TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001262 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
1263
Steven Thomasd4071902020-03-24 16:02:53 -07001264 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001265 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001266 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001267 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001268
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001269 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001270 auto& layer = layers[0];
1271 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001272 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001273 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1274 layer.name = "90Hz ExplicitDefault";
1275 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001276 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001277}
1278
1279TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001280 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001281
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001282 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001283 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001284 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001285 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001286
1287 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001288 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001289 auto& layer = layers[0];
1290 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001291 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001292 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001293 layer.name = "90Hz ExplicitDefault";
1294 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001295 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001296}
1297
1298TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001299 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001300
Dominik Laskowski0c252702021-12-20 20:32:09 -08001301 RefreshRateConfigs::Policy policy;
1302 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1303 policy.allowGroupSwitching = true;
1304 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1305
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001306 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001307
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001308 // 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 -07001309 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001310 auto& layer = layers[0];
1311 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001312 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001313 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001314 layer.name = "60Hz ExplicitDefault";
1315 layer.focused = true;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001316 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001317}
1318
1319TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001320 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001321
Dominik Laskowski0c252702021-12-20 20:32:09 -08001322 RefreshRateConfigs::Policy policy;
1323 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1324 policy.allowGroupSwitching = true;
1325 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1326
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001327 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001328
1329 // Verify that if the current config is in another group and there are no layers with
1330 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001331
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001332 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001333 auto& layer = layers[0];
1334 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001335 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001336 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001337 layer.name = "60Hz ExplicitDefault";
1338 layer.focused = true;
1339
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001340 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001341}
1342
1343TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001344 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001345
Dominik Laskowski0c252702021-12-20 20:32:09 -08001346 RefreshRateConfigs::Policy policy;
1347 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1348 policy.allowGroupSwitching = true;
1349 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1350
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001351 configs.setActiveModeId(kModeId90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001352
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001353 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001354 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001355 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001356 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001357 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001358 layers[0].seamlessness = Seamlessness::OnlySeamless;
1359 layers[0].name = "60Hz ExplicitDefault";
1360 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001361
1362 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001363 layers[1].vote = LayerVoteType::ExplicitDefault;
1364 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001365 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001366 layers[1].name = "90Hz ExplicitDefault";
1367 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001368
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001369 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001370}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001371
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001372TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001373 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001374
Dominik Laskowski0c252702021-12-20 20:32:09 -08001375 RefreshRateConfigs::Policy policy;
1376 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1377 policy.allowGroupSwitching = true;
1378 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1379
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001380 configs.setActiveModeId(kModeId90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001381
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001382 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1383 // seamlessness=Default can't change the mode group back to the group of the default
1384 // mode.
1385 // For example, this may happen when a video playback requests and gets a seamed switch,
1386 // but another layer (with default seamlessness) starts animating. The animating layer
1387 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001388 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001389 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001390 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001391 layers[0].focused = true;
1392 layers[0].vote = LayerVoteType::ExplicitDefault;
1393 layers[0].name = "60Hz ExplicitDefault";
1394
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001395 layers.push_back(LayerRequirement{.weight = 0.1f});
1396 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001397 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001398 layers[1].focused = true;
1399 layers[1].vote = LayerVoteType::ExplicitDefault;
1400 layers[1].name = "90Hz ExplicitDefault";
1401
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001402 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001403}
1404
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001405TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001406 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId60);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001407
Dominik Laskowski0c252702021-12-20 20:32:09 -08001408 RefreshRateConfigs::Policy policy;
1409 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
1410 policy.allowGroupSwitching = true;
1411 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
1412
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001413 configs.setActiveModeId(kModeId90);
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001414
1415 // Layer with seamlessness=Default can change the mode group if there's a not
1416 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1417 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001418 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001419 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001420 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001421 layers[0].focused = true;
1422 layers[0].vote = LayerVoteType::ExplicitDefault;
1423 layers[0].name = "60Hz ExplicitDefault";
1424
1425 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001426 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001427 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001428 layers[1].focused = false;
1429 layers[1].vote = LayerVoteType::ExplicitDefault;
1430 layers[1].name = "90Hz ExplicitDefault";
1431
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001432 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001433}
1434
1435TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001436 TestableRefreshRateConfigs configs(kModes_30_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001437
1438 // Allow group switching.
1439 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001440 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001441 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001442 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001443
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001444 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001445 auto& layer = layers[0];
1446 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001447 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001448 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001449 layer.name = "60Hz ExplicitExactOrMultiple";
1450 layer.focused = true;
1451
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001452 EXPECT_EQ(kModeId60, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001453
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001454 configs.setActiveModeId(kModeId120);
1455 EXPECT_EQ(kModeId120, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001456}
1457
1458TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001459 TestableRefreshRateConfigs configs(kModes_25_30_50_60, kModeId60);
Marin Shalamanov46084422020-10-13 12:33:42 +02001460
1461 // Allow group switching.
1462 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001463 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001464 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001465 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001466
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001467 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1468 .vote = LayerVoteType::ExplicitDefault,
1469 .desiredRefreshRate = 60_Hz,
1470 .seamlessness = Seamlessness::SeamedAndSeamless,
1471 .weight = 0.5f,
1472 .focused = false},
1473 {.name = "25Hz ExplicitExactOrMultiple",
1474 .vote = LayerVoteType::ExplicitExactOrMultiple,
1475 .desiredRefreshRate = 25_Hz,
1476 .seamlessness = Seamlessness::OnlySeamless,
1477 .weight = 1.f,
1478 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001479
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001480 EXPECT_EQ(kModeId50, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001481
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001482 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001483 seamedLayer.desiredRefreshRate = 30_Hz;
1484 seamedLayer.name = "30Hz ExplicitDefault";
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001485 configs.setActiveModeId(kModeId30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001486
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001487 EXPECT_EQ(kModeId25, configs.getBestRefreshRate(layers)->getId());
Steven Thomasd4071902020-03-24 16:02:53 -07001488}
1489
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001490TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001491 TestableRefreshRateConfigs configs(kModes_60_90_G1, kModeId90);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001492
1493 // Allow group switching.
1494 RefreshRateConfigs::Policy policy;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001495 policy.defaultMode = configs.getCurrentPolicy().defaultMode;
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001496 policy.allowGroupSwitching = true;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001497 EXPECT_GE(configs.setDisplayManagerPolicy(policy), 0);
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001498
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001499 std::vector<LayerRequirement> layers = {
1500 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001501
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001502 EXPECT_EQ(kModeId90, configs.getBestRefreshRate(layers)->getId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001503}
1504
Steven Thomasf734df42020-04-13 21:09:28 -07001505TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001506 TestableRefreshRateConfigs configs(kModes_30_60_90, kModeId60);
Steven Thomasf734df42020-04-13 21:09:28 -07001507
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001508 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001509 layers[0].name = "Test layer";
1510
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001511 struct Args {
1512 bool touch = false;
1513 bool focused = true;
1514 };
1515
Steven Thomasbb374322020-04-28 22:47:16 -07001516 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001517 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001518 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001519 layers[0].vote = voteType;
1520 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001521 layers[0].focused = args.focused;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001522 return configs.getBestRefreshRate(layers, {.touch = args.touch})->getId();
Steven Thomasf734df42020-04-13 21:09:28 -07001523 };
1524
Dominik Laskowski0c252702021-12-20 20:32:09 -08001525 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}), 0);
1526
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001527 EXPECT_EQ(kModeId60, configs.getBestRefreshRate()->getId());
Dominik Laskowski0c252702021-12-20 20:32:09 -08001528 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1529 EXPECT_EQ(kModeId30, getFrameRate(LayerVoteType::Min, 90_Hz));
1530 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1531 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1532 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1533 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001534
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001535 // Unfocused layers are not allowed to override primary config.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001536 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
1537 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001538 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001539
Steven Thomasf734df42020-04-13 21:09:28 -07001540 // Touch boost should be restricted to the primary range.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001541 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
1542
Steven Thomasf734df42020-04-13 21:09:28 -07001543 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1544 // shouldn't drag us back down to the primary range max.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001545 EXPECT_EQ(kModeId90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
1546 EXPECT_EQ(kModeId60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001547 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001548
Dominik Laskowski0c252702021-12-20 20:32:09 -08001549 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}), 0);
1550
1551 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1552 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Min, 90_Hz));
1553 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Max, 90_Hz));
1554 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1555 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1556 EXPECT_EQ(kModeId60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001557}
1558
Steven Thomasbb374322020-04-28 22:47:16 -07001559TEST_F(RefreshRateConfigsTest, idle) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001560 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Steven Thomasbb374322020-04-28 22:47:16 -07001561
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001562 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001563 layers[0].name = "Test layer";
1564
Marin Shalamanov23c44202020-12-22 19:09:20 +01001565 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001566 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001567 layers[0].desiredRefreshRate = 90_Hz;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001568
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001569 const auto [refreshRate, signals] =
1570 configs.getBestRefreshRateAndSignals(layers, {.touch = touchActive, .idle = true});
1571
1572 // Refresh rate will be chosen by either touch state or idle state.
1573 EXPECT_EQ(!touchActive, signals.idle);
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001574 return refreshRate->getId();
Steven Thomasbb374322020-04-28 22:47:16 -07001575 };
1576
Dominik Laskowski0c252702021-12-20 20:32:09 -08001577 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}), 0);
Steven Thomasbb374322020-04-28 22:47:16 -07001578
1579 // Idle should be lower priority than touch boost.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001580 {
1581 constexpr bool kTouchActive = true;
1582 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1583 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1584 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1585 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1586 EXPECT_EQ(kModeId90, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1587 EXPECT_EQ(kModeId90,
1588 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1589 }
Steven Thomasbb374322020-04-28 22:47:16 -07001590
1591 // With no layers, idle should still be lower priority than touch boost.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001592 EXPECT_EQ(kModeId90, configs.getBestRefreshRate({}, {.touch = true, .idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001593
1594 // Idle should be higher precedence than other layer frame rate considerations.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001595 configs.setActiveModeId(kModeId90);
Dominik Laskowski0c252702021-12-20 20:32:09 -08001596
1597 {
1598 constexpr bool kTouchActive = false;
1599 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::NoVote, kTouchActive));
1600 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Min, kTouchActive));
1601 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Max, kTouchActive));
1602 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::Heuristic, kTouchActive));
1603 EXPECT_EQ(kModeId60, getIdleFrameRate(LayerVoteType::ExplicitDefault, kTouchActive));
1604 EXPECT_EQ(kModeId60,
1605 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, kTouchActive));
1606 }
Steven Thomasbb374322020-04-28 22:47:16 -07001607
1608 // Idle should be applied rather than the current config when there are no layers.
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001609 EXPECT_EQ(kModeId60, configs.getBestRefreshRate({}, {.idle = true})->getId());
Steven Thomasbb374322020-04-28 22:47:16 -07001610}
1611
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001612TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001613 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001614
1615 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001616 const auto knownFrameRate = configs.findClosestKnownFrameRate(Fps::fromValue(fps));
1617 const Fps expectedFrameRate = [fps] {
1618 if (fps < 26.91f) return 24_Hz;
1619 if (fps < 37.51f) return 30_Hz;
1620 if (fps < 52.51f) return 45_Hz;
1621 if (fps < 66.01f) return 60_Hz;
1622 if (fps < 81.01f) return 72_Hz;
1623 return 90_Hz;
1624 }();
1625
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001626 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001627 }
1628}
1629
1630TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001631 TestableRefreshRateConfigs configs(kModes_60_90, kModeId60);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001632
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001633 struct Expectation {
1634 Fps fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001635 DisplayModePtr mode;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001636 };
1637
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001638 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001639 {24_Hz, kMode60}, {30_Hz, kMode60}, {45_Hz, kMode90},
1640 {60_Hz, kMode60}, {72_Hz, kMode90}, {90_Hz, kMode90},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001641 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001642
1643 // Make sure the test tests all the known frame rate
Dominik Laskowski0c252702021-12-20 20:32:09 -08001644 const auto& knownFrameRates = configs.knownFrameRates();
1645 const bool equal = std::equal(knownFrameRates.begin(), knownFrameRates.end(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001646 knownFrameRatesExpectations.begin(),
1647 [](Fps fps, const Expectation& expected) {
1648 return isApproxEqual(fps, expected.fps);
1649 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001650 EXPECT_TRUE(equal);
1651
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001652 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001653 auto& layer = layers[0];
1654 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001655
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001656 for (const auto& [fps, mode] : knownFrameRatesExpectations) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001657 layer.desiredRefreshRate = fps;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001658 EXPECT_EQ(mode, configs.getBestRefreshRate(layers));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001659 }
1660}
1661
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001662TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001663 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001664
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001665 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001666 auto& explicitExactLayer = layers[0];
1667 auto& explicitExactOrMultipleLayer = layers[1];
1668
1669 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1670 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001671 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001672
1673 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1674 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001675 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001676
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001677 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers));
1678 EXPECT_EQ(kMode30, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001679
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001680 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1681 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001682 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001683
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001684 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001685 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001686
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001687 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001688 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001689
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001690 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001691 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001692}
1693
1694TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001695 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60,
1696 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001697
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001698 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001699 auto& explicitExactLayer = layers[0];
1700 auto& explicitExactOrMultipleLayer = layers[1];
1701
1702 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1703 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001704 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001705
1706 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1707 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001708 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001709
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001710 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1711 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001712
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001713 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1714 explicitExactLayer.desiredRefreshRate = 60_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001715 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001716
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001717 explicitExactLayer.desiredRefreshRate = 72_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001718 EXPECT_EQ(kMode72, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001719
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001720 explicitExactLayer.desiredRefreshRate = 90_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001721 EXPECT_EQ(kMode90, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001722
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001723 explicitExactLayer.desiredRefreshRate = 120_Hz;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001724 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001725}
1726
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001727TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001728 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001729
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001730 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1731 const auto args = std::make_pair(std::vector<LayerRequirement>{},
1732 GlobalSignals{.touch = true, .idle = true});
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001733 const auto result = std::make_pair(kMode90, GlobalSignals{.touch = true});
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001734
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001735 configs.mutableGetBestRefreshRateCache() = {args, result};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001736
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001737 EXPECT_EQ(result, configs.getBestRefreshRateAndSignals(args.first, args.second));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001738}
1739
1740TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001741 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId60);
1742
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001743 EXPECT_FALSE(configs.mutableGetBestRefreshRateCache());
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001744
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001745 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001746 RefreshRateConfigs::GlobalSignals globalSignals{.touch = true, .idle = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001747
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001748 const auto result = configs.getBestRefreshRateAndSignals(layers, globalSignals);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001749
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001750 const auto& cache = configs.mutableGetBestRefreshRateCache();
1751 ASSERT_TRUE(cache);
1752
1753 EXPECT_EQ(cache->arguments, std::make_pair(layers, globalSignals));
1754 EXPECT_EQ(cache->result, result);
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001755}
1756
Ady Abraham5e4e9832021-06-14 13:40:56 -07001757TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001758 TestableRefreshRateConfigs configs(kModes_60_120, kModeId60, {.enableFrameRateOverride = true});
Ady Abraham5e4e9832021-06-14 13:40:56 -07001759
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001760 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001761 auto& explicitExactLayer = layers[0];
1762 auto& explicitExactOrMultipleLayer = layers[1];
1763
1764 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1765 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001766 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001767
1768 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1769 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001770 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001771
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001772 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1773 EXPECT_EQ(kMode120, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001774
1775 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1776
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001777 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
1778 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001779}
1780
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001781TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
Dominik Laskowskia8626ec2021-12-15 18:13:30 -08001782 TestableRefreshRateConfigs configs(kModes_24_25_30_50_60_Frac, kModeId60,
1783 {.enableFrameRateOverride = true});
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001784
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001785 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001786 auto& explicitDefaultLayer = layers[0];
1787 auto& explicitExactOrMultipleLayer = layers[1];
1788
1789 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1790 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001791 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001792
1793 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1794 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001795 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001796
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001797 EXPECT_EQ(kMode60, configs.getBestRefreshRate(layers));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001798}
1799
Ady Abraham05243be2021-09-16 15:58:52 -07001800// b/190578904
Dominik Laskowski0c252702021-12-20 20:32:09 -08001801TEST_F(RefreshRateConfigsTest, getBestRefreshRate_withCloseRefreshRates) {
Ady Abraham05243be2021-09-16 15:58:52 -07001802 constexpr int kMinRefreshRate = 10;
1803 constexpr int kMaxRefreshRate = 240;
1804
1805 DisplayModes displayModes;
1806 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001807 const DisplayModeId modeId(fps);
1808 displayModes.try_emplace(modeId,
1809 createDisplayMode(modeId,
1810 Fps::fromValue(static_cast<float>(fps))));
Ady Abraham05243be2021-09-16 15:58:52 -07001811 }
1812
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001813 const TestableRefreshRateConfigs configs(std::move(displayModes),
1814 DisplayModeId(kMinRefreshRate));
Ady Abraham05243be2021-09-16 15:58:52 -07001815
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001816 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001817 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1818 layers[0].desiredRefreshRate = fps;
1819 layers[0].vote = vote;
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001820 EXPECT_EQ(fps.getIntValue(), configs.getBestRefreshRate(layers)->getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001821 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001822 };
1823
1824 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001825 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001826 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1827 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1828 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1829 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1830 }
1831}
1832
Ady Abraham1c595502022-01-13 21:58:32 -08001833// b/190578904
1834TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001835 constexpr DisplayModeId kActiveModeId{0};
1836 DisplayModes displayModes = makeModes(createDisplayMode(kActiveModeId, 43_Hz),
1837 createDisplayMode(DisplayModeId(1), 53_Hz),
1838 createDisplayMode(DisplayModeId(2), 55_Hz),
1839 createDisplayMode(DisplayModeId(3), 60_Hz));
Ady Abraham1c595502022-01-13 21:58:32 -08001840
1841 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001842 const TestableRefreshRateConfigs configs(std::move(displayModes), kActiveModeId);
Ady Abraham1c595502022-01-13 21:58:32 -08001843
Dominik Laskowski0c252702021-12-20 20:32:09 -08001844 const std::vector<LayerRequirement> layers = {
1845 {
Ady Abraham1c595502022-01-13 21:58:32 -08001846 .vote = LayerVoteType::ExplicitDefault,
1847 .desiredRefreshRate = 43_Hz,
1848 .seamlessness = Seamlessness::SeamedAndSeamless,
1849 .weight = 0.41f,
1850 },
Dominik Laskowski0c252702021-12-20 20:32:09 -08001851 {
Ady Abraham1c595502022-01-13 21:58:32 -08001852 .vote = LayerVoteType::ExplicitExactOrMultiple,
1853 .desiredRefreshRate = 53_Hz,
1854 .seamlessness = Seamlessness::SeamedAndSeamless,
1855 .weight = 0.41f,
1856 },
1857 };
1858
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001859 EXPECT_EQ(53_Hz, configs.getBestRefreshRate(layers, globalSignals)->getFps());
Ady Abraham1c595502022-01-13 21:58:32 -08001860}
1861
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001862TEST_F(RefreshRateConfigsTest, modeComparison) {
1863 EXPECT_LT(kMode60->getFps(), kMode90->getFps());
1864 EXPECT_GE(kMode60->getFps(), kMode60->getFps());
1865 EXPECT_GE(kMode90->getFps(), kMode90->getFps());
Ana Krulecb9afd792020-06-11 13:16:15 -07001866}
1867
1868TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001869 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
Ana Krulecb9afd792020-06-11 13:16:15 -07001870
Dominik Laskowski0c252702021-12-20 20:32:09 -08001871 RefreshRateConfigs configs(kModes_60_90, kModeId90);
1872
Ana Krulecb9afd792020-06-11 13:16:15 -07001873 // SetPolicy(60, 90), current 90Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001874 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001875
1876 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001877 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 90_Hz}}), 0);
1878 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001879
Ady Abrahama91605e2021-06-18 11:41:47 -07001880 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski0c252702021-12-20 20:32:09 -08001881 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1882 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001883
1884 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001885 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId90, {90_Hz, 90_Hz}}), 0);
1886 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001887}
1888
TreeHugger Robot758ab612021-06-22 19:17:29 +00001889TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001890 using KernelIdleTimerAction = RefreshRateConfigs::KernelIdleTimerAction;
TreeHugger Robot758ab612021-06-22 19:17:29 +00001891
Dominik Laskowski0c252702021-12-20 20:32:09 -08001892 RefreshRateConfigs configs(kModes_60_120, kModeId120);
1893
TreeHugger Robot758ab612021-06-22 19:17:29 +00001894 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001895 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {0_Hz, 60_Hz}}), 0);
1896 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001897
1898 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001899 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 60_Hz}}), 0);
1900 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001901
1902 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001903 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId60, {60_Hz, 120_Hz}}), 0);
1904 EXPECT_EQ(KernelIdleTimerAction::TurnOn, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001905
1906 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski0c252702021-12-20 20:32:09 -08001907 EXPECT_GE(configs.setDisplayManagerPolicy({kModeId120, {120_Hz, 120_Hz}}), 0);
1908 EXPECT_EQ(KernelIdleTimerAction::TurnOff, configs.getIdleTimerAction());
TreeHugger Robot758ab612021-06-22 19:17:29 +00001909}
1910
Ady Abrahamcc315492022-02-17 17:06:39 -08001911TEST_F(RefreshRateConfigsTest, getFrameRateDivisor) {
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001912 TestableRefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001913
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001914 const auto frameRate = 30_Hz;
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001915 Fps displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001916 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001917
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001918 configs.setActiveModeId(kModeId60);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001919 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001920 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001921
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001922 configs.setActiveModeId(kModeId72);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001923 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001924 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001925
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001926 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001927 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001928 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001929
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001930 configs.setActiveModeId(kModeId120);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001931 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001932 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001933
Dominik Laskowskib0054a22022-03-03 09:03:06 -08001934 configs.setActiveModeId(kModeId90);
Dominik Laskowskif8734e02022-08-26 09:06:59 -07001935 displayRefreshRate = configs.getActiveMode().getFps();
Ady Abrahamcc315492022-02-17 17:06:39 -08001936 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivisor(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001937
Ady Abrahamcc315492022-02-17 17:06:39 -08001938 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 25_Hz));
1939 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(24_Hz, 23.976_Hz));
1940 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(30_Hz, 29.97_Hz));
1941 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivisor(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001942}
1943
1944TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001945 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
1946 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001947
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001948 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
1949 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001950
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001951 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
1952 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001953
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001954 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
1955 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001956
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001957 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
1958 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001959
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001960 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 +02001961 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001962 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001963 }
1964
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001965 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
1966 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
1967 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08001968}
1969
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001970TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001971 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120);
Ady Abraham62a0be22020-12-08 16:54:10 -08001972
Dominik Laskowski0c252702021-12-20 20:32:09 -08001973 EXPECT_TRUE(configs.getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001974}
1975
1976TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08001977 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
1978 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08001979
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001980 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08001981 layers[0].name = "Test layer";
1982 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001983 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08001984 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001985
1986 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1987 EXPECT_EQ(1u, frameRateOverrides.size());
1988 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1989 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001990
1991 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001992 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1993 EXPECT_EQ(1u, frameRateOverrides.size());
1994 ASSERT_EQ(1u, frameRateOverrides.count(1234));
1995 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08001996
1997 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski0c252702021-12-20 20:32:09 -08001998 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
1999 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002000
2001 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002002 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2003 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002004
2005 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002006 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2007 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002008
2009 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002010 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2011 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002012}
2013
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002014TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002015 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2016 {.enableFrameRateOverride = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002017
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002018 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2019 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002020
2021 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002022 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002023 layers[0].vote = LayerVoteType::ExplicitDefault;
2024
2025 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002026 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002027 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002028 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002029
Dominik Laskowski0c252702021-12-20 20:32:09 -08002030 EXPECT_EQ(2u, frameRateOverrides.size());
2031 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2032 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
2033 ASSERT_EQ(1u, frameRateOverrides.count(5678));
2034 EXPECT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002035
2036 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002037 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2038 EXPECT_EQ(1u, frameRateOverrides.size());
2039 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2040 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002041
2042 layers[1].ownerUid = 1234;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002043 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2044 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002045}
2046
2047TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
Dominik Laskowski0c252702021-12-20 20:32:09 -08002048 RefreshRateConfigs configs(kModes_30_60_72_90_120, kModeId120,
2049 {.enableFrameRateOverride = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002050
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002051 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002052 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002053 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002054 layers[0].vote = LayerVoteType::ExplicitDefault;
2055
Dominik Laskowski0c252702021-12-20 20:32:09 -08002056 auto frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2057 EXPECT_EQ(1u, frameRateOverrides.size());
2058 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2059 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002060
Dominik Laskowski0c252702021-12-20 20:32:09 -08002061 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2062 EXPECT_EQ(1u, frameRateOverrides.size());
2063 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2064 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002065
2066 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002067 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2068 EXPECT_EQ(1u, frameRateOverrides.size());
2069 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2070 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002071
Dominik Laskowski0c252702021-12-20 20:32:09 -08002072 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2073 EXPECT_EQ(1u, frameRateOverrides.size());
2074 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2075 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002076
2077 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski0c252702021-12-20 20:32:09 -08002078 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {});
2079 EXPECT_EQ(1u, frameRateOverrides.size());
2080 ASSERT_EQ(1u, frameRateOverrides.count(1234));
2081 EXPECT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002082
Dominik Laskowski0c252702021-12-20 20:32:09 -08002083 frameRateOverrides = configs.getFrameRateOverrides(layers, 120_Hz, {.touch = true});
2084 EXPECT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002085}
2086
Alec Mouri0a1cc962019-03-14 12:33:02 -07002087} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002088} // namespace android::scheduler