blob: cd9f2b1cd6d2bc4349f74cfbe5d968f43e00669a [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 =
Ana Krulec8c6f3f62020-01-23 15:48:01 -080077 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -070078}
79
Ana Kruleced3a8cc2019-11-14 00:55:07 +010080TEST_F(RefreshRateConfigsTest, invalidPolicy) {
81 std::vector<RefreshRateConfigs::InputConfig> configs{
82 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
83 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -080084 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Kruleced3a8cc2019-11-14 00:55:07 +010085 ASSERT_LT(refreshRateConfigs->setPolicy(HwcConfigIndexType(10), 60, 60, nullptr), 0);
86 ASSERT_LT(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 20, 40, nullptr), 0);
87}
88
Steven Thomas2bbaabe2019-08-28 16:08:35 -070089TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Ady Abraham2139f732019-11-13 18:56:40 -080090 std::vector<RefreshRateConfigs::InputConfig> configs{
91 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
92 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070093 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -080094 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -070095
Ady Abraham2139f732019-11-13 18:56:40 -080096 const auto minRate = refreshRateConfigs->getMinRefreshRate();
97 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -070098
Ady Abraham2139f732019-11-13 18:56:40 -080099 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
100 ASSERT_EQ(expectedDefaultConfig, minRate);
101 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
102 90};
103 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
104
105 const auto minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
106 const auto performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
107 ASSERT_EQ(minRateByPolicy, minRate);
108 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700109}
Ady Abraham2139f732019-11-13 18:56:40 -0800110
111TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
112 std::vector<RefreshRateConfigs::InputConfig> configs{
113 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
114 {HWC_CONFIG_ID_90, HWC_GROUP_ID_1, VSYNC_90}}};
115 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800116 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800117
Ady Abraham2139f732019-11-13 18:56:40 -0800118 const auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
119 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
120 const auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
121 const auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
122
123 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
124 ASSERT_EQ(expectedDefaultConfig, minRate);
125 ASSERT_EQ(expectedDefaultConfig, minRate60);
126 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
127
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100128 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 60, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800129 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
130
Ady Abraham2139f732019-11-13 18:56:40 -0800131 const auto minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
132 const auto performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
133
134 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_1, "90fps",
135 90};
136 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
137 ASSERT_EQ(expectedPerformanceConfig, minRate90);
138 ASSERT_EQ(expectedPerformanceConfig, performanceRate90);
139}
140
141TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
142 std::vector<RefreshRateConfigs::InputConfig> configs{
143 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
144 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
145 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800146 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
147
Ady Abraham2139f732019-11-13 18:56:40 -0800148 auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
149 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
150
151 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
152 ASSERT_EQ(expectedDefaultConfig, minRate);
153 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
154 90};
155 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
156
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100157 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800158
159 auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
160 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
161 ASSERT_EQ(expectedDefaultConfig, minRate60);
162 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
163}
164
165TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
166 std::vector<RefreshRateConfigs::InputConfig> configs{
167 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
168 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
169 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800170 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800171 {
172 auto current = refreshRateConfigs->getCurrentRefreshRate();
173 EXPECT_EQ(current.configId, HWC_CONFIG_ID_60);
174 }
175
176 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
177 {
178 auto current = refreshRateConfigs->getCurrentRefreshRate();
179 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
180 }
181
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100182 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800183 {
184 auto current = refreshRateConfigs->getCurrentRefreshRate();
185 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
186 }
187}
188
189TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
190 std::vector<RefreshRateConfigs::InputConfig> configs{
191 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
192 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
193 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800194 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800195
196 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
197 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
198
Ady Abraham8a82ba62020-01-17 12:43:17 -0800199 const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> {
200 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, 1.0f}};
201 };
202
203 EXPECT_EQ(expected90Config,
204 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
205 EXPECT_EQ(expected60Config,
206 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
207 EXPECT_EQ(expected90Config,
208 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
209 EXPECT_EQ(expected60Config,
210 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
211 EXPECT_EQ(expected60Config,
212 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800213
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100214 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800215 EXPECT_EQ(expected60Config,
216 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
217 EXPECT_EQ(expected60Config,
218 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
219 EXPECT_EQ(expected60Config,
220 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
221 EXPECT_EQ(expected60Config,
222 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
223 EXPECT_EQ(expected60Config,
224 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800225
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100226 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800227 EXPECT_EQ(expected90Config,
228 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
229 EXPECT_EQ(expected90Config,
230 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
231 EXPECT_EQ(expected90Config,
232 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
233 EXPECT_EQ(expected90Config,
234 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
235 EXPECT_EQ(expected90Config,
236 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100237 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800238 EXPECT_EQ(expected90Config,
239 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
240 EXPECT_EQ(expected60Config,
241 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
242 EXPECT_EQ(expected90Config,
243 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
244 EXPECT_EQ(expected60Config,
245 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
246 EXPECT_EQ(expected60Config,
247 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
248}
249
250TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_60_90) {
251 std::vector<RefreshRateConfigs::InputConfig> configs{
252 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
253 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
254 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800255 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800256
257 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
258 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
259
260 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
261 auto& lr = layers[0];
262
263 lr.vote = LayerVoteType::Min;
264 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
265
266 lr.vote = LayerVoteType::Max;
267 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
268
269 lr.desiredRefreshRate = 90.0f;
270 lr.vote = LayerVoteType::Heuristic;
271 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
272
273 lr.desiredRefreshRate = 60.0f;
274 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
275
276 lr.desiredRefreshRate = 45.0f;
277 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
278
279 lr.desiredRefreshRate = 30.0f;
280 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
281
282 lr.desiredRefreshRate = 24.0f;
283 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
284
285 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
286
287 lr.vote = LayerVoteType::Min;
288 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
289
290 lr.vote = LayerVoteType::Max;
291 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
292
293 lr.desiredRefreshRate = 90.0f;
294 lr.vote = LayerVoteType::Heuristic;
295 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
296
297 lr.desiredRefreshRate = 60.0f;
298 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
299
300 lr.desiredRefreshRate = 45.0f;
301 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
302
303 lr.desiredRefreshRate = 30.0f;
304 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
305
306 lr.desiredRefreshRate = 24.0f;
307 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
308
309 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
310
311 lr.vote = LayerVoteType::Min;
312 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
313
314 lr.vote = LayerVoteType::Max;
315 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
316
317 lr.desiredRefreshRate = 90.0f;
318 lr.vote = LayerVoteType::Heuristic;
319 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
320
321 lr.desiredRefreshRate = 60.0f;
322 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
323
324 lr.desiredRefreshRate = 45.0f;
325 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
326
327 lr.desiredRefreshRate = 30.0f;
328 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
329
330 lr.desiredRefreshRate = 24.0f;
331 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
332
333 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
334 lr.vote = LayerVoteType::Min;
335 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
336
337 lr.vote = LayerVoteType::Max;
338 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
339
340 lr.desiredRefreshRate = 90.0f;
341 lr.vote = LayerVoteType::Heuristic;
342 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
343
344 lr.desiredRefreshRate = 60.0f;
345 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
346
347 lr.desiredRefreshRate = 45.0f;
348 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
349
350 lr.desiredRefreshRate = 30.0f;
351 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
352
353 lr.desiredRefreshRate = 24.0f;
354 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
355}
356
357TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_60_72_90) {
358 std::vector<RefreshRateConfigs::InputConfig> configs{
359 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
360 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
361 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
362 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800363 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364
365 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
366 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
367 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
368
369 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
370 auto& lr = layers[0];
371
372 lr.vote = LayerVoteType::Min;
373 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
374
375 lr.vote = LayerVoteType::Max;
376 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
377
378 lr.desiredRefreshRate = 90.0f;
379 lr.vote = LayerVoteType::Heuristic;
380 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
381
382 lr.desiredRefreshRate = 60.0f;
383 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
384
385 lr.desiredRefreshRate = 45.0f;
386 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
387
388 lr.desiredRefreshRate = 30.0f;
389 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
390
391 lr.desiredRefreshRate = 24.0f;
392 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
393}
394
395TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60_72_90_120) {
396 std::vector<RefreshRateConfigs::InputConfig> configs{
397 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
398 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
399 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
400 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90},
401 {HWC_CONFIG_ID_120, HWC_GROUP_ID_0, VSYNC_120}}};
402 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800403 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
405 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
406 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
407 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
408 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
409 RefreshRate expected120Config = {HWC_CONFIG_ID_120, VSYNC_120, HWC_GROUP_ID_0, "120fps", 120};
410
411 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
412 LayerRequirement{.weight = 1.0f}};
413 auto& lr1 = layers[0];
414 auto& lr2 = layers[1];
415
416 lr1.desiredRefreshRate = 24.0f;
417 lr1.vote = LayerVoteType::Heuristic;
418 lr2.desiredRefreshRate = 60.0f;
419 lr2.vote = LayerVoteType::Heuristic;
420 EXPECT_EQ(expected120Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
421
422 lr1.desiredRefreshRate = 24.0f;
423 lr1.vote = LayerVoteType::Heuristic;
424 lr2.desiredRefreshRate = 48.0f;
425 lr2.vote = LayerVoteType::Heuristic;
426 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
427
428 lr1.desiredRefreshRate = 24.0f;
429 lr1.vote = LayerVoteType::Heuristic;
430 lr2.desiredRefreshRate = 48.0f;
431 lr2.vote = LayerVoteType::Heuristic;
432 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
433}
434
435TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60) {
436 std::vector<RefreshRateConfigs::InputConfig> configs{
437 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
438 {HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30}}};
439 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800440 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
442 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
443 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
444
445 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
446 auto& lr = layers[0];
447
448 lr.vote = LayerVoteType::Min;
449 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
450
451 lr.vote = LayerVoteType::Max;
452 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
453
454 lr.desiredRefreshRate = 90.0f;
455 lr.vote = LayerVoteType::Heuristic;
456 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
457
458 lr.desiredRefreshRate = 60.0f;
459 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
460
461 lr.desiredRefreshRate = 45.0f;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800462 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
464 lr.desiredRefreshRate = 30.0f;
465 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
466
467 lr.desiredRefreshRate = 24.0f;
468 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
469}
470
471TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_30_60_72_90) {
472 std::vector<RefreshRateConfigs::InputConfig> configs{
473 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
474 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
475 {HWC_CONFIG_ID_72, HWC_GROUP_ID_0, VSYNC_72},
476 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
477 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800478 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479
480 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
481 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
482 RefreshRate expected72Config = {HWC_CONFIG_ID_72, VSYNC_72, HWC_GROUP_ID_0, "72fps", 70};
483 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
484
485 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
486 auto& lr = layers[0];
487
488 lr.vote = LayerVoteType::Min;
489 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
490
491 lr.vote = LayerVoteType::Max;
492 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
493
494 lr.desiredRefreshRate = 90.0f;
495 lr.vote = LayerVoteType::Heuristic;
496 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
497
498 lr.desiredRefreshRate = 60.0f;
499 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
500
501 lr.desiredRefreshRate = 45.0f;
502 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
503
504 lr.desiredRefreshRate = 30.0f;
505 EXPECT_EQ(expected30Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
506
507 lr.desiredRefreshRate = 24.0f;
508 EXPECT_EQ(expected72Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
509}
510
511TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_PriorityTest) {
512 std::vector<RefreshRateConfigs::InputConfig> configs{
513 {{HWC_CONFIG_ID_30, HWC_GROUP_ID_0, VSYNC_30},
514 {HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
515 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
516 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800517 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800518
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 expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
522
523 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
524 LayerRequirement{.weight = 1.0f}};
525 auto& lr1 = layers[0];
526 auto& lr2 = layers[1];
527
528 lr1.vote = LayerVoteType::Min;
529 lr2.vote = LayerVoteType::Max;
530 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
531
532 lr1.vote = LayerVoteType::Min;
533 lr2.vote = LayerVoteType::Heuristic;
534 lr2.desiredRefreshRate = 24.0f;
535 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
536
537 lr1.vote = LayerVoteType::Min;
538 lr2.vote = LayerVoteType::Explicit;
539 lr2.desiredRefreshRate = 24.0f;
540 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
541
542 lr1.vote = LayerVoteType::Max;
543 lr2.vote = LayerVoteType::Heuristic;
544 lr2.desiredRefreshRate = 60.0f;
545 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
546
547 lr1.vote = LayerVoteType::Max;
548 lr2.vote = LayerVoteType::Explicit;
549 lr2.desiredRefreshRate = 60.0f;
550 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
551
552 lr1.vote = LayerVoteType::Heuristic;
553 lr1.desiredRefreshRate = 15.0f;
554 lr2.vote = LayerVoteType::Heuristic;
555 lr2.desiredRefreshRate = 45.0f;
556 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
557
558 lr1.vote = LayerVoteType::Heuristic;
559 lr1.desiredRefreshRate = 30.0f;
560 lr2.vote = LayerVoteType::Explicit;
561 lr2.desiredRefreshRate = 45.0f;
562 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
563}
564
565TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_24FpsVideo) {
566 std::vector<RefreshRateConfigs::InputConfig> configs{
567 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
568 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
569 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800570 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571
572 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
573 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
574 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
575
576 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
577 auto& lr = layers[0];
578
579 lr.vote = LayerVoteType::Explicit;
580 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
581 lr.desiredRefreshRate = fps;
582 const auto& refreshRate = refreshRateConfigs->getRefreshRateForContentV2(layers);
583 printf("%.2fHz chooses %s\n", fps, refreshRate.name.c_str());
584 EXPECT_EQ(expected60Config, refreshRate);
585 }
586}
587
588TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
589 std::vector<RefreshRateConfigs::InputConfig> configs{
590 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
591 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
592 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800593 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800594
595 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
596 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
597
598 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
599 LayerRequirement{.weight = 1.0f}};
600 auto& lr1 = layers[0];
601 auto& lr2 = layers[1];
602
603 lr1.vote = LayerVoteType::Heuristic;
604 lr1.desiredRefreshRate = 60.0f;
605 lr2.vote = LayerVoteType::Explicit;
606 lr2.desiredRefreshRate = 90.0f;
607 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
608
609 lr1.vote = LayerVoteType::Heuristic;
610 lr1.desiredRefreshRate = 90.0f;
611 lr2.vote = LayerVoteType::Explicit;
612 lr2.desiredRefreshRate = 60.0f;
613 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
614}
615
616TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_Explicit) {
617 std::vector<RefreshRateConfigs::InputConfig> configs{
618 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
619 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
620 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800621 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800622
623 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
624 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
625
626 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
627 LayerRequirement{.weight = 1.0f}};
628 auto& lr1 = layers[0];
629 auto& lr2 = layers[1];
630
631 lr1.vote = LayerVoteType::Heuristic;
632 lr1.desiredRefreshRate = 60.0f;
633 lr2.vote = LayerVoteType::Explicit;
634 lr2.desiredRefreshRate = 90.0f;
635 EXPECT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
636
637 lr1.vote = LayerVoteType::Heuristic;
638 lr1.desiredRefreshRate = 90.0f;
639 lr2.vote = LayerVoteType::Explicit;
640 lr2.desiredRefreshRate = 60.0f;
641 EXPECT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContentV2(layers));
Ady Abraham2139f732019-11-13 18:56:40 -0800642}
643
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800644TEST_F(RefreshRateConfigsTest, testInPolicy) {
645 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60_POINT_4, HWC_GROUP_ID_0,
646 "60fps", 60};
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800647 ASSERT_TRUE(expectedDefaultConfig.inPolicy(60.000004f, 60.000004f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800648 ASSERT_TRUE(expectedDefaultConfig.inPolicy(59.0f, 60.1f));
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800649 ASSERT_FALSE(expectedDefaultConfig.inPolicy(75.0f, 90.0f));
650 ASSERT_FALSE(expectedDefaultConfig.inPolicy(60.0011f, 90.0f));
651 ASSERT_FALSE(expectedDefaultConfig.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800652}
653
Ady Abrahamf6b77072020-01-30 14:22:54 -0800654TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContentV2_75HzContent) {
655 std::vector<RefreshRateConfigs::InputConfig> configs{
656 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
657 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
658 auto refreshRateConfigs =
Ana Krulec8c6f3f62020-01-23 15:48:01 -0800659 std::make_unique<RefreshRateConfigs>(configs, /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800660
661 RefreshRate expected30Config = {HWC_CONFIG_ID_30, VSYNC_30, HWC_GROUP_ID_0, "30fps", 30};
662 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
663 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
664
665 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
666 auto& lr = layers[0];
667
668 lr.vote = LayerVoteType::Explicit;
669 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
670 lr.desiredRefreshRate = fps;
671 const auto& refreshRate = refreshRateConfigs->getRefreshRateForContentV2(layers);
672 printf("%.2fHz chooses %s\n", fps, refreshRate.name.c_str());
673 EXPECT_EQ(expected90Config, refreshRate);
674 }
675}
676
Alec Mouri0a1cc962019-03-14 12:33:02 -0700677} // namespace
678} // namespace scheduler
679} // namespace android