blob: 78009b812275e5ee4b2e8197445f895b4224dfd3 [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
20#include <gmock/gmock.h>
21#include <log/log.h>
22#include <thread>
23
24#include "DisplayHardware/HWC2.h"
25#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070026
27using namespace std::chrono_literals;
28using testing::_;
29
30namespace android {
31namespace scheduler {
32
Alec Mouri0a1cc962019-03-14 12:33:02 -070033using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080034using LayerVoteType = RefreshRateConfigs::LayerVoteType;
35using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070036
37class RefreshRateConfigsTest : public testing::Test {
38protected:
Ady Abraham2139f732019-11-13 18:56:40 -080039 static inline const HwcConfigIndexType HWC_CONFIG_ID_60 = HwcConfigIndexType(0);
Ady Abraham8a82ba62020-01-17 12:43:17 -080040 static inline const HwcConfigIndexType HWC_CONFIG_ID_72 = HwcConfigIndexType(1);
41 static inline const HwcConfigIndexType HWC_CONFIG_ID_90 = HwcConfigIndexType(2);
42 static inline const HwcConfigIndexType HWC_CONFIG_ID_120 = HwcConfigIndexType(3);
43 static inline const HwcConfigIndexType HWC_CONFIG_ID_30 = HwcConfigIndexType(4);
Ady Abraham2139f732019-11-13 18:56:40 -080044 static inline const HwcConfigGroupType HWC_GROUP_ID_0 = HwcConfigGroupType(0);
45 static inline const HwcConfigGroupType HWC_GROUP_ID_1 = HwcConfigGroupType(1);
Ady Abraham8a82ba62020-01-17 12:43:17 -080046 static constexpr auto VSYNC_30 = static_cast<int64_t>(1e9f / 30);
47 static constexpr auto VSYNC_60 = static_cast<int64_t>(1e9f / 60);
48 static constexpr auto VSYNC_72 = static_cast<int64_t>(1e9f / 72);
49 static constexpr auto VSYNC_90 = static_cast<int64_t>(1e9f / 90);
50 static constexpr auto VSYNC_120 = static_cast<int64_t>(1e9f / 120);
Ana Krulec72f0d6e2020-01-06 15:24:47 -080051 static constexpr int64_t VSYNC_60_POINT_4 = 16666665;
Alec Mouri0a1cc962019-03-14 12:33:02 -070052
53 RefreshRateConfigsTest();
54 ~RefreshRateConfigsTest();
Alec Mouri0a1cc962019-03-14 12:33:02 -070055};
56
57RefreshRateConfigsTest::RefreshRateConfigsTest() {
58 const ::testing::TestInfo* const test_info =
59 ::testing::UnitTest::GetInstance()->current_test_info();
60 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
61}
62
63RefreshRateConfigsTest::~RefreshRateConfigsTest() {
64 const ::testing::TestInfo* const test_info =
65 ::testing::UnitTest::GetInstance()->current_test_info();
66 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
67}
68
69namespace {
70/* ------------------------------------------------------------------------
71 * Test cases
72 */
Ady Abraham2139f732019-11-13 18:56:40 -080073TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
74 std::vector<RefreshRateConfigs::InputConfig> configs{
75 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070076 auto refreshRateConfigs =
77 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080078 /*currentConfigId=*/HWC_CONFIG_ID_60);
79 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
80}
81
82TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingNotSupported) {
83 std::vector<RefreshRateConfigs::InputConfig> configs{
84 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
85 auto refreshRateConfigs =
86 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/false, configs,
87 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070088 ASSERT_FALSE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -070089}
90
Ana Kruleced3a8cc2019-11-14 00:55:07 +010091TEST_F(RefreshRateConfigsTest, invalidPolicy) {
92 std::vector<RefreshRateConfigs::InputConfig> configs{
93 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
94 auto refreshRateConfigs =
95 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
96 /*currentConfigId=*/HWC_CONFIG_ID_60);
97 ASSERT_LT(refreshRateConfigs->setPolicy(HwcConfigIndexType(10), 60, 60, nullptr), 0);
98 ASSERT_LT(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 20, 40, nullptr), 0);
99}
100
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700101TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Ady Abraham2139f732019-11-13 18:56:40 -0800102 std::vector<RefreshRateConfigs::InputConfig> configs{
103 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
104 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700105 auto refreshRateConfigs =
106 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -0800107 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700108
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700109 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700110
Ady Abraham2139f732019-11-13 18:56:40 -0800111 const auto minRate = refreshRateConfigs->getMinRefreshRate();
112 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700113
Ady Abraham2139f732019-11-13 18:56:40 -0800114 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
115 ASSERT_EQ(expectedDefaultConfig, minRate);
116 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
117 90};
118 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
119
120 const auto minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
121 const auto performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
122 ASSERT_EQ(minRateByPolicy, minRate);
123 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700124}
Ady Abraham2139f732019-11-13 18:56:40 -0800125
126TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
127 std::vector<RefreshRateConfigs::InputConfig> configs{
128 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
129 {HWC_CONFIG_ID_90, HWC_GROUP_ID_1, VSYNC_90}}};
130 auto refreshRateConfigs =
131 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
132 /*currentConfigId=*/HWC_CONFIG_ID_60);
133
134 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
135 const auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
136 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
137 const auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
138 const auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
139
140 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
141 ASSERT_EQ(expectedDefaultConfig, minRate);
142 ASSERT_EQ(expectedDefaultConfig, minRate60);
143 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
144
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100145 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 60, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800146 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
147
148 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
149 const auto minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
150 const auto performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
151
152 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_1, "90fps",
153 90};
154 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
155 ASSERT_EQ(expectedPerformanceConfig, minRate90);
156 ASSERT_EQ(expectedPerformanceConfig, performanceRate90);
157}
158
159TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
160 std::vector<RefreshRateConfigs::InputConfig> configs{
161 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
162 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
163 auto refreshRateConfigs =
164 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
165 /*currentConfigId=*/HWC_CONFIG_ID_60);
166 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
167 auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
168 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
169
170 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
171 ASSERT_EQ(expectedDefaultConfig, minRate);
172 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
173 90};
174 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
175
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100176 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800177 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
178
179 auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
180 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
181 ASSERT_EQ(expectedDefaultConfig, minRate60);
182 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
183}
184
185TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
186 std::vector<RefreshRateConfigs::InputConfig> configs{
187 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
188 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
189 auto refreshRateConfigs =
190 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
191 /*currentConfigId=*/HWC_CONFIG_ID_60);
192 {
193 auto current = refreshRateConfigs->getCurrentRefreshRate();
194 EXPECT_EQ(current.configId, HWC_CONFIG_ID_60);
195 }
196
197 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
198 {
199 auto current = refreshRateConfigs->getCurrentRefreshRate();
200 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
201 }
202
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100203 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800204 {
205 auto current = refreshRateConfigs->getCurrentRefreshRate();
206 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
207 }
208}
209
210TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
211 std::vector<RefreshRateConfigs::InputConfig> configs{
212 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
213 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
214 auto refreshRateConfigs =
215 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
216 /*currentConfigId=*/HWC_CONFIG_ID_60);
217
218 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
219
220 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
221 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
222
Ady Abraham8a82ba62020-01-17 12:43:17 -0800223 const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> {
224 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, 1.0f}};
225 };
226
227 EXPECT_EQ(expected90Config,
228 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
229 EXPECT_EQ(expected60Config,
230 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
231 EXPECT_EQ(expected90Config,
232 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
233 EXPECT_EQ(expected60Config,
234 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
235 EXPECT_EQ(expected60Config,
236 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800237
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100238 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800239 EXPECT_EQ(expected60Config,
240 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
241 EXPECT_EQ(expected60Config,
242 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
243 EXPECT_EQ(expected60Config,
244 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
245 EXPECT_EQ(expected60Config,
246 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
247 EXPECT_EQ(expected60Config,
248 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800249
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100250 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800251 EXPECT_EQ(expected90Config,
252 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
253 EXPECT_EQ(expected90Config,
254 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
255 EXPECT_EQ(expected90Config,
256 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
257 EXPECT_EQ(expected90Config,
258 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
259 EXPECT_EQ(expected90Config,
260 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100261 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800262 EXPECT_EQ(expected90Config,
263 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
264 EXPECT_EQ(expected60Config,
265 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
266 EXPECT_EQ(expected90Config,
267 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
268 EXPECT_EQ(expected60Config,
269 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
270 EXPECT_EQ(expected60Config,
271 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
272}
273
274TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_60_90) {
275 std::vector<RefreshRateConfigs::InputConfig> configs{
276 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
277 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
278 auto refreshRateConfigs =
279 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
280 /*currentConfigId=*/HWC_CONFIG_ID_60);
281
282 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
283
284 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
285 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
286
287 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
288 auto& lr = layers[0];
289
290 lr.vote = LayerVoteType::Min;
291 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
292
293 lr.vote = LayerVoteType::Max;
294 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
295
296 lr.desiredRefreshRate = 90.0f;
297 lr.vote = LayerVoteType::Heuristic;
298 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
299
300 lr.desiredRefreshRate = 60.0f;
301 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
302
303 lr.desiredRefreshRate = 45.0f;
304 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
305
306 lr.desiredRefreshRate = 30.0f;
307 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
308
309 lr.desiredRefreshRate = 24.0f;
310 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
311
312 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
313
314 lr.vote = LayerVoteType::Min;
315 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
316
317 lr.vote = LayerVoteType::Max;
318 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
319
320 lr.desiredRefreshRate = 90.0f;
321 lr.vote = LayerVoteType::Heuristic;
322 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
323
324 lr.desiredRefreshRate = 60.0f;
325 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
326
327 lr.desiredRefreshRate = 45.0f;
328 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
329
330 lr.desiredRefreshRate = 30.0f;
331 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
332
333 lr.desiredRefreshRate = 24.0f;
334 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
335
336 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
337
338 lr.vote = LayerVoteType::Min;
339 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
340
341 lr.vote = LayerVoteType::Max;
342 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
343
344 lr.desiredRefreshRate = 90.0f;
345 lr.vote = LayerVoteType::Heuristic;
346 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
347
348 lr.desiredRefreshRate = 60.0f;
349 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
350
351 lr.desiredRefreshRate = 45.0f;
352 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
353
354 lr.desiredRefreshRate = 30.0f;
355 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
356
357 lr.desiredRefreshRate = 24.0f;
358 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
359
360 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
361 lr.vote = LayerVoteType::Min;
362 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
363
364 lr.vote = LayerVoteType::Max;
365 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
366
367 lr.desiredRefreshRate = 90.0f;
368 lr.vote = LayerVoteType::Heuristic;
369 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
370
371 lr.desiredRefreshRate = 60.0f;
372 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
373
374 lr.desiredRefreshRate = 45.0f;
375 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
376
377 lr.desiredRefreshRate = 30.0f;
378 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
379
380 lr.desiredRefreshRate = 24.0f;
381 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
382}
383
384TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_60_72_90) {
385 std::vector<RefreshRateConfigs::InputConfig> configs{
386 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
387 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
388 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
389 auto refreshRateConfigs =
390 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
391 /*currentConfigId=*/HWC_CONFIG_ID_60);
392
393 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
394
395 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
396 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
397 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
398
399 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
400 auto& lr = layers[0];
401
402 lr.vote = LayerVoteType::Min;
403 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
404
405 lr.vote = LayerVoteType::Max;
406 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
407
408 lr.desiredRefreshRate = 90.0f;
409 lr.vote = LayerVoteType::Heuristic;
410 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
411
412 lr.desiredRefreshRate = 60.0f;
413 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
414
415 lr.desiredRefreshRate = 45.0f;
416 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
417
418 lr.desiredRefreshRate = 30.0f;
419 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
420
421 lr.desiredRefreshRate = 24.0f;
422 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
423}
424
425TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60_72_90_120) {
426 std::vector<RefreshRateConfigs::InputConfig> configs{
427 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
428 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
429 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
430 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90},
431 {HWC_CONFIG_ID_120, HWC_GROUP_ID_0, VSYNC_120}}};
432 auto refreshRateConfigs =
433 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
434 /*currentConfigId=*/HWC_CONFIG_ID_60);
435
436 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
437
438 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
439 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
440 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
441 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
442 RefreshRate expected120Config = {HWC_CONFIG_ID_120, VSYNC_120, HWC_GROUP_ID_0, "120fps", 120};
443
444 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
445 LayerRequirement{.weight = 1.0f}};
446 auto& lr1 = layers[0];
447 auto& lr2 = layers[1];
448
449 lr1.desiredRefreshRate = 24.0f;
450 lr1.vote = LayerVoteType::Heuristic;
451 lr2.desiredRefreshRate = 60.0f;
452 lr2.vote = LayerVoteType::Heuristic;
453 EXPECT_EQ(expected120Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
454
455 lr1.desiredRefreshRate = 24.0f;
456 lr1.vote = LayerVoteType::Heuristic;
457 lr2.desiredRefreshRate = 48.0f;
458 lr2.vote = LayerVoteType::Heuristic;
459 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
460
461 lr1.desiredRefreshRate = 24.0f;
462 lr1.vote = LayerVoteType::Heuristic;
463 lr2.desiredRefreshRate = 48.0f;
464 lr2.vote = LayerVoteType::Heuristic;
465 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
466}
467
468TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60) {
469 std::vector<RefreshRateConfigs::InputConfig> configs{
470 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
471 {HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30}}};
472 auto refreshRateConfigs =
473 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
474 /*currentConfigId=*/HWC_CONFIG_ID_60);
475
476 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
477
478 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
479 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
480
481 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
482 auto& lr = layers[0];
483
484 lr.vote = LayerVoteType::Min;
485 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
486
487 lr.vote = LayerVoteType::Max;
488 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
489
490 lr.desiredRefreshRate = 90.0f;
491 lr.vote = LayerVoteType::Heuristic;
492 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
493
494 lr.desiredRefreshRate = 60.0f;
495 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
496
497 lr.desiredRefreshRate = 45.0f;
498 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
499
500 lr.desiredRefreshRate = 30.0f;
501 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
502
503 lr.desiredRefreshRate = 24.0f;
504 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
505}
506
507TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60_72_90) {
508 std::vector<RefreshRateConfigs::InputConfig> configs{
509 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
510 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
511 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
512 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
513 auto refreshRateConfigs =
514 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
515 /*currentConfigId=*/HWC_CONFIG_ID_60);
516
517 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
518
519 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
520 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
521 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
522 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
523
524 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
525 auto& lr = layers[0];
526
527 lr.vote = LayerVoteType::Min;
528 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
529
530 lr.vote = LayerVoteType::Max;
531 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
532
533 lr.desiredRefreshRate = 90.0f;
534 lr.vote = LayerVoteType::Heuristic;
535 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
536
537 lr.desiredRefreshRate = 60.0f;
538 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
539
540 lr.desiredRefreshRate = 45.0f;
541 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
542
543 lr.desiredRefreshRate = 30.0f;
544 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
545
546 lr.desiredRefreshRate = 24.0f;
547 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
548}
549
550TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_PriorityTest) {
551 std::vector<RefreshRateConfigs::InputConfig> configs{
552 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
553 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
554 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
555 auto refreshRateConfigs =
556 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
557 /*currentConfigId=*/HWC_CONFIG_ID_60);
558
559 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
560
561 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
562 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
563 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
564
565 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
566 LayerRequirement{.weight = 1.0f}};
567 auto& lr1 = layers[0];
568 auto& lr2 = layers[1];
569
570 lr1.vote = LayerVoteType::Min;
571 lr2.vote = LayerVoteType::Max;
572 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
573
574 lr1.vote = LayerVoteType::Min;
575 lr2.vote = LayerVoteType::Heuristic;
576 lr2.desiredRefreshRate = 24.0f;
577 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
578
579 lr1.vote = LayerVoteType::Min;
580 lr2.vote = LayerVoteType::Explicit;
581 lr2.desiredRefreshRate = 24.0f;
582 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
583
584 lr1.vote = LayerVoteType::Max;
585 lr2.vote = LayerVoteType::Heuristic;
586 lr2.desiredRefreshRate = 60.0f;
587 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
588
589 lr1.vote = LayerVoteType::Max;
590 lr2.vote = LayerVoteType::Explicit;
591 lr2.desiredRefreshRate = 60.0f;
592 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
593
594 lr1.vote = LayerVoteType::Heuristic;
595 lr1.desiredRefreshRate = 15.0f;
596 lr2.vote = LayerVoteType::Heuristic;
597 lr2.desiredRefreshRate = 45.0f;
598 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
599
600 lr1.vote = LayerVoteType::Heuristic;
601 lr1.desiredRefreshRate = 30.0f;
602 lr2.vote = LayerVoteType::Explicit;
603 lr2.desiredRefreshRate = 45.0f;
604 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
605}
606
607TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_24FpsVideo) {
608 std::vector<RefreshRateConfigs::InputConfig> configs{
609 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
610 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
611 auto refreshRateConfigs =
612 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
613 /*currentConfigId=*/HWC_CONFIG_ID_60);
614
615 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
616
617 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
618 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
619 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
620
621 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
622 auto& lr = layers[0];
623
624 lr.vote = LayerVoteType::Explicit;
625 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
626 lr.desiredRefreshRate = fps;
627 const auto& refreshRate = refreshRateConfigs->getRefreshRateForContentV2(layers);
628 printf("%.2fHz chooses %s\n", fps, refreshRate.name.c_str());
629 EXPECT_EQ(expected60Config, refreshRate);
630 }
631}
632
633TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
634 std::vector<RefreshRateConfigs::InputConfig> configs{
635 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
636 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
637 auto refreshRateConfigs =
638 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
639 /*currentConfigId=*/HWC_CONFIG_ID_60);
640
641 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
642
643 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
644 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
645
646 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
647 LayerRequirement{.weight = 1.0f}};
648 auto& lr1 = layers[0];
649 auto& lr2 = layers[1];
650
651 lr1.vote = LayerVoteType::Heuristic;
652 lr1.desiredRefreshRate = 60.0f;
653 lr2.vote = LayerVoteType::Explicit;
654 lr2.desiredRefreshRate = 90.0f;
655 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
656
657 lr1.vote = LayerVoteType::Heuristic;
658 lr1.desiredRefreshRate = 90.0f;
659 lr2.vote = LayerVoteType::Explicit;
660 lr2.desiredRefreshRate = 60.0f;
661 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
662}
663
664TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_Explicit) {
665 std::vector<RefreshRateConfigs::InputConfig> configs{
666 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
667 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
668 auto refreshRateConfigs =
669 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
670 /*currentConfigId=*/HWC_CONFIG_ID_60);
671
672 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
673
674 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
675 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
676
677 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
678 LayerRequirement{.weight = 1.0f}};
679 auto& lr1 = layers[0];
680 auto& lr2 = layers[1];
681
682 lr1.vote = LayerVoteType::Heuristic;
683 lr1.desiredRefreshRate = 60.0f;
684 lr2.vote = LayerVoteType::Explicit;
685 lr2.desiredRefreshRate = 90.0f;
686 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
687
688 lr1.vote = LayerVoteType::Heuristic;
689 lr1.desiredRefreshRate = 90.0f;
690 lr2.vote = LayerVoteType::Explicit;
691 lr2.desiredRefreshRate = 60.0f;
692 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800693}
694
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800695TEST_F(RefreshRateConfigsTest, testInPolicy) {
696 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60_POINT_4, HWC_GROUP_ID_0,
697 "60fps", 60};
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800698 ASSERT_TRUE(expectedDefaultConfig.inPolicy(60.000004f, 60.000004f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800699 ASSERT_TRUE(expectedDefaultConfig.inPolicy(59.0f, 60.1f));
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800700 ASSERT_FALSE(expectedDefaultConfig.inPolicy(75.0f, 90.0f));
701 ASSERT_FALSE(expectedDefaultConfig.inPolicy(60.0011f, 90.0f));
702 ASSERT_FALSE(expectedDefaultConfig.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800703}
704
Alec Mouri0a1cc962019-03-14 12:33:02 -0700705} // namespace
706} // namespace scheduler
707} // namespace android