blob: ed620efe0f9d1eae2a0b0b4b8b8fc7eae5773fc7 [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
Ana Kruleced3a8cc2019-11-14 00:55:07 +010082TEST_F(RefreshRateConfigsTest, invalidPolicy) {
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=*/true, configs,
87 /*currentConfigId=*/HWC_CONFIG_ID_60);
88 ASSERT_LT(refreshRateConfigs->setPolicy(HwcConfigIndexType(10), 60, 60, nullptr), 0);
89 ASSERT_LT(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 20, 40, nullptr), 0);
90}
91
Steven Thomas2bbaabe2019-08-28 16:08:35 -070092TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Ady Abraham2139f732019-11-13 18:56:40 -080093 std::vector<RefreshRateConfigs::InputConfig> configs{
94 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
95 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
Steven Thomas2bbaabe2019-08-28 16:08:35 -070096 auto refreshRateConfigs =
97 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
Ady Abraham2139f732019-11-13 18:56:40 -080098 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -070099
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700100 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700101
Ady Abraham2139f732019-11-13 18:56:40 -0800102 const auto minRate = refreshRateConfigs->getMinRefreshRate();
103 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700104
Ady Abraham2139f732019-11-13 18:56:40 -0800105 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
106 ASSERT_EQ(expectedDefaultConfig, minRate);
107 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
108 90};
109 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
110
111 const auto minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
112 const auto performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
113 ASSERT_EQ(minRateByPolicy, minRate);
114 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700115}
Ady Abraham2139f732019-11-13 18:56:40 -0800116
117TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
118 std::vector<RefreshRateConfigs::InputConfig> configs{
119 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
120 {HWC_CONFIG_ID_90, HWC_GROUP_ID_1, VSYNC_90}}};
121 auto refreshRateConfigs =
122 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
123 /*currentConfigId=*/HWC_CONFIG_ID_60);
124
125 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
126 const auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
127 const auto performanceRate = refreshRateConfigs->getMaxRefreshRate();
128 const auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
129 const auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
130
131 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
132 ASSERT_EQ(expectedDefaultConfig, minRate);
133 ASSERT_EQ(expectedDefaultConfig, minRate60);
134 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
135
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100136 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 60, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800137 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
138
139 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
140 const auto minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
141 const auto performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
142
143 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_1, "90fps",
144 90};
145 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
146 ASSERT_EQ(expectedPerformanceConfig, minRate90);
147 ASSERT_EQ(expectedPerformanceConfig, performanceRate90);
148}
149
150TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
151 std::vector<RefreshRateConfigs::InputConfig> configs{
152 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
153 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
154 auto refreshRateConfigs =
155 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
156 /*currentConfigId=*/HWC_CONFIG_ID_60);
157 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
158 auto minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
159 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
160
161 RefreshRate expectedDefaultConfig = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
162 ASSERT_EQ(expectedDefaultConfig, minRate);
163 RefreshRate expectedPerformanceConfig = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps",
164 90};
165 ASSERT_EQ(expectedPerformanceConfig, performanceRate);
166
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100167 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800168 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
169
170 auto minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
171 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
172 ASSERT_EQ(expectedDefaultConfig, minRate60);
173 ASSERT_EQ(expectedDefaultConfig, performanceRate60);
174}
175
176TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
177 std::vector<RefreshRateConfigs::InputConfig> configs{
178 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
179 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
180 auto refreshRateConfigs =
181 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
182 /*currentConfigId=*/HWC_CONFIG_ID_60);
183 {
184 auto current = refreshRateConfigs->getCurrentRefreshRate();
185 EXPECT_EQ(current.configId, HWC_CONFIG_ID_60);
186 }
187
188 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
189 {
190 auto current = refreshRateConfigs->getCurrentRefreshRate();
191 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
192 }
193
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100194 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800195 {
196 auto current = refreshRateConfigs->getCurrentRefreshRate();
197 EXPECT_EQ(current.configId, HWC_CONFIG_ID_90);
198 }
199}
200
201TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
202 std::vector<RefreshRateConfigs::InputConfig> configs{
203 {{HWC_CONFIG_ID_60, HWC_GROUP_ID_0, VSYNC_60},
204 {HWC_CONFIG_ID_90, HWC_GROUP_ID_0, VSYNC_90}}};
205 auto refreshRateConfigs =
206 std::make_unique<RefreshRateConfigs>(/*refreshRateSwitching=*/true, configs,
207 /*currentConfigId=*/HWC_CONFIG_ID_60);
208
209 ASSERT_TRUE(refreshRateConfigs->refreshRateSwitchingSupported());
210
211 RefreshRate expected60Config = {HWC_CONFIG_ID_60, VSYNC_60, HWC_GROUP_ID_0, "60fps", 60};
212 RefreshRate expected90Config = {HWC_CONFIG_ID_90, VSYNC_90, HWC_GROUP_ID_0, "90fps", 90};
213
214 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
215 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
216 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
217 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
218 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
219
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100220 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 60, 60, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800221 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
222 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
223 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
224 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
225 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
226
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100227 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_90, 90, 90, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800228 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
229 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
230 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
231 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
232 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100233 ASSERT_GE(refreshRateConfigs->setPolicy(HWC_CONFIG_ID_60, 0, 120, nullptr), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800234 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(90.0f));
235 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(60.0f));
236 ASSERT_EQ(expected90Config, refreshRateConfigs->getRefreshRateForContent(45.0f));
237 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(30.0f));
238 ASSERT_EQ(expected60Config, refreshRateConfigs->getRefreshRateForContent(24.0f));
239}
240
Alec Mouri0a1cc962019-03-14 12:33:02 -0700241} // namespace
242} // namespace scheduler
243} // namespace android