blob: 546e65c1eafd77642773f77ffd9d66ede9ab653c [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;
42 static constexpr int64_t VSYNC_90 = 11111111;
43
44 RefreshRateConfigsTest();
45 ~RefreshRateConfigsTest();
Alec Mouri0a1cc962019-03-14 12:33:02 -070046};
47
48RefreshRateConfigsTest::RefreshRateConfigsTest() {
49 const ::testing::TestInfo* const test_info =
50 ::testing::UnitTest::GetInstance()->current_test_info();
51 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
52}
53
54RefreshRateConfigsTest::~RefreshRateConfigsTest() {
55 const ::testing::TestInfo* const test_info =
56 ::testing::UnitTest::GetInstance()->current_test_info();
57 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
58}
59
60namespace {
61/* ------------------------------------------------------------------------
62 * Test cases
63 */
Ady Abraham2139f732019-11-13 18:56:40 -080064TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
65 std::vector<RefreshRateConfigs::InputConfig> configs{
66 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070067 auto refreshRateConfigs =
68 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080069 /*currentConfigId=*/HWC_CONFIG_ID_60);
70 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
71}
72
73TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingNotSupported) {
74 std::vector<RefreshRateConfigs::InputConfig> configs{
75 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60}}};
76 auto refreshRateConfigs =
77 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/false, configs,
78 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070079 ASSERT_FALSE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -070080}
81
Steven Thomas2bbaabe2019-08-28 16:08:35 -070082TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Ady Abraham2139f732019-11-13 18:56:40 -080083 std::vector<RefreshRateConfigs::InputConfig> configs{
84 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
85 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070086 auto refreshRateConfigs =
87 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080088 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -070089
Steven Thomas2bbaabe2019-08-28 16:08:35 -070090 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -070091
Ady Abraham2139f732019-11-13 18:56:40 -080092 const auto minRate = refreshRateConfigs->getMinRefreshRate();
93 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -070094
Ady Abraham2139f732019-11-13 18:56:40 -080095 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
96 ASSERT_EQ(expectedDefaultConfig, minRate);
97 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
98 90};
99 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
100
101 const auto minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
102 const auto performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
103 ASSERT_EQ(minRateByPolicy, minRate);
104 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700105}
Ady Abraham2139f732019-11-13 18:56:40 -0800106
107TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
108 std::vector<RefreshRateConfigs::InputConfig> configs{
109 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
110 {HWC_CONFIG_ID_90, HWC_GROUP_ID_1, VSYNC_90}}};
111 auto refreshRateConfigs =
112 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
113 /*currentConfigId=*/HWC_CONFIG_ID_60);
114
115 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
116 const auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
117 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
118 const auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
119 const auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
120
121 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
122 ASSERT_EQ(expectedDefaultConfig, minRate);
123 ASSERT_EQ(expectedDefaultConfig, minRate60);
124 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
125
126 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 60, 90);
127 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
128
129 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
130 const auto minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
131 const auto performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
132
133 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_1, "90fps",
134 90};
135 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
136 ASSERT_EQ(expectedPerformanceConfig, minRate90);
137 ASSERT_EQ(expectedPerformanceConfig, performanceRate90);
138}
139
140TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
141 std::vector<RefreshRateConfigs::InputConfig> configs{
142 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
143 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
144 auto refreshRateConfigs =
145 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
146 /*currentConfigId=*/HWC_CONFIG_ID_60);
147 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
148 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
157 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60);
158 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
159
160 auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
161 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
162 ASSERT_EQ(expectedDefaultConfig, minRate60);
163 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
164}
165
166TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
167 std::vector<RefreshRateConfigs::InputConfig> configs{
168 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
169 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
170 auto refreshRateConfigs =
171 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
172 /*currentConfigId=*/HWC_CONFIG_ID_60);
173 {
174 auto current = refreshRateConfigs->getCurrentRefreshRate();
175 EXPECT_EQ(current.configId, HWC_CONFIG_ID_60);
176 }
177
178 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
179 {
180 auto current = refreshRateConfigs->getCurrentRefreshRate();
181 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
182 }
183
184 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 90, 90);
185 {
186 auto current = refreshRateConfigs->getCurrentRefreshRate();
187 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
188 }
189}
190
191TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
192 std::vector<RefreshRateConfigs::InputConfig> configs{
193 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
194 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
195 auto refreshRateConfigs =
196 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
197 /*currentConfigId=*/HWC_CONFIG_ID_60);
198
199 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
200
201 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
202 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
203
204 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
205 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
206 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
207 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
208 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
209
210 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60);
211 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
212 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
213 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
214 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
215 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
216
217 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 90, 90);
218 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
219 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
220 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
221 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
222 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
223 refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120);
224 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
225 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
226 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
227 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
228 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
229}
230
Alec Mouri0a1cc962019-03-14 12:33:02 -0700231} // namespace
232} // namespace scheduler
233} // namespace android