blob: cc3c985aa1341c425c0fc3ba57978ed8f2d5de03 [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;
34
35class RefreshRateConfigsTest : public testing::Test {
36protected:
Ady Abraham2139f732019-11-13 18:56:40 -080037 static inline const HwcConfigIndexType HWC_CONFIG_ID_60 = HwcConfigIndexType(0);
38 static inline const HwcConfigIndexType HWC_CONFIG_ID_90 = HwcConfigIndexType(1);
39 static inline const HwcConfigGroupType HWC_GROUP_ID_0 = HwcConfigGroupType(0);
40 static inline const HwcConfigGroupType HWC_GROUP_ID_1 = HwcConfigGroupType(1);
Alec Mouri0a1cc962019-03-14 12:33:02 -070041 static constexpr int64_t VSYNC_60 = 16666667;
Ana Krulec72f0d6e2020-01-06 15:24:47 -080042 static constexpr int64_t VSYNC_60_POINT_4 = 16666665;
Alec Mouri0a1cc962019-03-14 12:33:02 -070043 static constexpr int64_t VSYNC_90 = 11111111;
44
45 RefreshRateConfigsTest();
46 ~RefreshRateConfigsTest();
Alec Mouri0a1cc962019-03-14 12:33:02 -070047};
48
49RefreshRateConfigsTest::RefreshRateConfigsTest() {
50 const ::testing::TestInfo* const test_info =
51 ::testing::UnitTest::GetInstance()->current_test_info();
52 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
53}
54
55RefreshRateConfigsTest::~RefreshRateConfigsTest() {
56 const ::testing::TestInfo* const test_info =
57 ::testing::UnitTest::GetInstance()->current_test_info();
58 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
59}
60
61namespace {
62/* ------------------------------------------------------------------------
63 * Test cases
64 */
Ady Abraham2139f732019-11-13 18:56:40 -080065TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
66 std::vector<RefreshRateConfigs::InputConfig> configs{
67 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070068 auto refreshRateConfigs =
69 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080070 /*currentConfigId=*/HWC_CONFIG_ID_60);
71 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
72}
73
74TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingNotSupported) {
75 std::vector<RefreshRateConfigs::InputConfig> configs{
76 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
77 auto refreshRateConfigs =
78 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/false, configs,
79 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070080 ASSERT_FALSE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -070081}
82
Ana Kruleced3a8cc2019-11-14 00:55:07 +010083TEST_F(RefreshRateConfigsTest, invalidPolicy) {
84 std::vector<RefreshRateConfigs::InputConfig> configs{
85 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
86 auto refreshRateConfigs =
87 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
88 /*currentConfigId=*/HWC_CONFIG_ID_60);
89 ASSERT_LT(refreshRateConfigs->setPolicy(HwcConfigIndexType(10), 60, 60, nullptr), 0);
90 ASSERT_LT(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 20, 40, nullptr), 0);
91}
92
Steven Thomas2bbaabe2019-08-28 16:08:35 -070093TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Ady Abraham2139f732019-11-13 18:56:40 -080094 std::vector<RefreshRateConfigs::InputConfig> configs{
95 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
96 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070097 auto refreshRateConfigs =
98 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080099 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700100
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700101 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700102
Ady Abraham2139f732019-11-13 18:56:40 -0800103 const auto minRate = refreshRateConfigs->getMinRefreshRate();
104 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700105
Ady Abraham2139f732019-11-13 18:56:40 -0800106 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
107 ASSERT_EQ(expectedDefaultConfig, minRate);
108 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
109 90};
110 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
111
112 const auto minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
113 const auto performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
114 ASSERT_EQ(minRateByPolicy, minRate);
115 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700116}
Ady Abraham2139f732019-11-13 18:56:40 -0800117
118TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
119 std::vector<RefreshRateConfigs::InputConfig> configs{
120 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
121 {HWC_CONFIG_ID_90, HWC_GROUP_ID_1, VSYNC_90}}};
122 auto refreshRateConfigs =
123 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
124 /*currentConfigId=*/HWC_CONFIG_ID_60);
125
126 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
127 const auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
128 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
129 const auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
130 const auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
131
132 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
133 ASSERT_EQ(expectedDefaultConfig, minRate);
134 ASSERT_EQ(expectedDefaultConfig, minRate60);
135 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
136
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100137 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 60, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800138 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
139
140 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
141 const auto minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
142 const auto performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
143
144 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_1, "90fps",
145 90};
146 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
147 ASSERT_EQ(expectedPerformanceConfig, minRate90);
148 ASSERT_EQ(expectedPerformanceConfig, performanceRate90);
149}
150
151TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
152 std::vector<RefreshRateConfigs::InputConfig> configs{
153 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
154 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
155 auto refreshRateConfigs =
156 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
157 /*currentConfigId=*/HWC_CONFIG_ID_60);
158 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
159 auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
160 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
161
162 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
163 ASSERT_EQ(expectedDefaultConfig, minRate);
164 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
165 90};
166 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
167
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100168 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800169 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
170
171 auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
172 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
173 ASSERT_EQ(expectedDefaultConfig, minRate60);
174 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
175}
176
177TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
178 std::vector<RefreshRateConfigs::InputConfig> configs{
179 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
180 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
181 auto refreshRateConfigs =
182 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
183 /*currentConfigId=*/HWC_CONFIG_ID_60);
184 {
185 auto current = refreshRateConfigs->getCurrentRefreshRate();
186 EXPECT_EQ(current.configId, HWC_CONFIG_ID_60);
187 }
188
189 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
190 {
191 auto current = refreshRateConfigs->getCurrentRefreshRate();
192 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
193 }
194
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100195 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800196 {
197 auto current = refreshRateConfigs->getCurrentRefreshRate();
198 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
199 }
200}
201
202TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
203 std::vector<RefreshRateConfigs::InputConfig> configs{
204 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
205 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
206 auto refreshRateConfigs =
207 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
208 /*currentConfigId=*/HWC_CONFIG_ID_60);
209
210 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
211
212 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
213 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
214
215 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
216 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
217 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
218 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
219 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
220
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100221 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800222 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
223 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
224 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
225 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
226 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
227
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100228 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800229 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
230 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
231 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
232 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
233 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100234 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800235 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
236 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
237 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
238 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
239 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
240}
241
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800242TEST_F(RefreshRateConfigsTest, testInPolicy) {
243 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60_POINT_4, HWC_GROUP_ID_0,
244 "60fps", 60};
245 ASSERT_TRUE(expectedDefaultConfig.inPolicy(60.000004, 60.000004));
246 ASSERT_TRUE(expectedDefaultConfig.inPolicy(59.0f, 60.1f));
247 ASSERT_FALSE(expectedDefaultConfig.inPolicy(75.0, 90.0));
248 ASSERT_FALSE(expectedDefaultConfig.inPolicy(60.0011, 90.0));
249 ASSERT_FALSE(expectedDefaultConfig.inPolicy(50.0, 59.998));
250}
251
Alec Mouri0a1cc962019-03-14 12:33:02 -0700252} // namespace
253} // namespace scheduler
254} // namespace android