blob: 82cf22cd88b7ec2bf8a42a5678dcaaf168df64e4 [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
Ady Abraham6fb599b2020-03-05 13:48:22 -080024#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070025#include "DisplayHardware/HWC2.h"
26#include "Scheduler/RefreshRateConfigs.h"
Ady Abrahamabc27602020-04-08 17:20:29 -070027#include "mock/DisplayHardware/MockDisplay.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070028
29using namespace std::chrono_literals;
30using testing::_;
31
32namespace android {
33namespace scheduler {
34
Peiyong Line9d809e2020-04-14 13:10:48 -070035namespace hal = android::hardware::graphics::composer::hal;
36
Alec Mouri0a1cc962019-03-14 12:33:02 -070037using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080038using LayerVoteType = RefreshRateConfigs::LayerVoteType;
39using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070040
41class RefreshRateConfigsTest : public testing::Test {
42protected:
Alec Mouri0a1cc962019-03-14 12:33:02 -070043 RefreshRateConfigsTest();
44 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070045
Ady Abrahamb1b9d412020-06-01 19:53:52 -070046 float findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, float frameRate) {
47 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
48 }
49
50 std::vector<float> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
51 return refreshRateConfigs.mKnownFrameRates;
52 }
53
Ady Abrahamabc27602020-04-08 17:20:29 -070054 // Test config IDs
55 static inline const HwcConfigIndexType HWC_CONFIG_ID_60 = HwcConfigIndexType(0);
56 static inline const HwcConfigIndexType HWC_CONFIG_ID_90 = HwcConfigIndexType(1);
57 static inline const HwcConfigIndexType HWC_CONFIG_ID_72 = HwcConfigIndexType(2);
58 static inline const HwcConfigIndexType HWC_CONFIG_ID_120 = HwcConfigIndexType(3);
59 static inline const HwcConfigIndexType HWC_CONFIG_ID_30 = HwcConfigIndexType(4);
Marin Shalamanov46084422020-10-13 12:33:42 +020060 static inline const HwcConfigIndexType HWC_CONFIG_ID_25 = HwcConfigIndexType(5);
61 static inline const HwcConfigIndexType HWC_CONFIG_ID_50 = HwcConfigIndexType(6);
Ady Abrahamabc27602020-04-08 17:20:29 -070062
63 // Test configs
64 std::shared_ptr<const HWC2::Display::Config> mConfig60 =
65 createConfig(HWC_CONFIG_ID_60, 0, static_cast<int64_t>(1e9f / 60));
66 std::shared_ptr<const HWC2::Display::Config> mConfig90 =
67 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90));
68 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentGroup =
69 createConfig(HWC_CONFIG_ID_90, 1, static_cast<int64_t>(1e9f / 90));
70 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentResolution =
71 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90), 111, 222);
72 std::shared_ptr<const HWC2::Display::Config> mConfig72 =
73 createConfig(HWC_CONFIG_ID_72, 0, static_cast<int64_t>(1e9f / 72));
74 std::shared_ptr<const HWC2::Display::Config> mConfig72DifferentGroup =
75 createConfig(HWC_CONFIG_ID_72, 1, static_cast<int64_t>(1e9f / 72));
76 std::shared_ptr<const HWC2::Display::Config> mConfig120 =
77 createConfig(HWC_CONFIG_ID_120, 0, static_cast<int64_t>(1e9f / 120));
78 std::shared_ptr<const HWC2::Display::Config> mConfig120DifferentGroup =
79 createConfig(HWC_CONFIG_ID_120, 1, static_cast<int64_t>(1e9f / 120));
80 std::shared_ptr<const HWC2::Display::Config> mConfig30 =
81 createConfig(HWC_CONFIG_ID_30, 0, static_cast<int64_t>(1e9f / 30));
Marin Shalamanov46084422020-10-13 12:33:42 +020082 std::shared_ptr<const HWC2::Display::Config> mConfig30DifferentGroup =
83 createConfig(HWC_CONFIG_ID_30, 1, static_cast<int64_t>(1e9f / 30));
84 std::shared_ptr<const HWC2::Display::Config> mConfig25DifferentGroup =
85 createConfig(HWC_CONFIG_ID_25, 1, static_cast<int64_t>(1e9f / 25));
86 std::shared_ptr<const HWC2::Display::Config> mConfig50 =
87 createConfig(HWC_CONFIG_ID_50, 0, static_cast<int64_t>(1e9f / 50));
Ady Abrahamabc27602020-04-08 17:20:29 -070088
89 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +020090 // The positions of the configs in the arrays below MUST match their IDs. For example,
91 // the first config should always be 60Hz, the second 90Hz etc.
Ady Abrahamabc27602020-04-08 17:20:29 -070092 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60OnlyConfigDevice = {mConfig60};
93 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90Device = {mConfig60, mConfig90};
94 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentGroups =
95 {mConfig60, mConfig90DifferentGroup};
96 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentResolutions =
97 {mConfig60, mConfig90DifferentResolution};
98 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_72_90Device = {mConfig60,
99 mConfig90,
100 mConfig72};
101 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90_72_120Device = {mConfig60,
102 mConfig90,
103 mConfig72,
104 mConfig120};
105 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90_120Device = {mConfig60,
106 mConfig90,
107 mConfig72,
108 mConfig120,
109 mConfig30};
110 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60Device =
111 {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup, mConfig120DifferentGroup,
112 mConfig30};
113 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90Device =
114 {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup, mConfig30};
115 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_90Device =
116 {mConfig60, mConfig90, mConfig72DifferentGroup, mConfig120DifferentGroup, mConfig30};
Marin Shalamanov46084422020-10-13 12:33:42 +0200117 std::vector<std::shared_ptr<const HWC2::Display::Config>> m25_30_50_60Device =
118 {mConfig60,
119 mConfig90,
120 mConfig72DifferentGroup,
121 mConfig120DifferentGroup,
122 mConfig30DifferentGroup,
123 mConfig25DifferentGroup,
124 mConfig50};
Ady Abrahamabc27602020-04-08 17:20:29 -0700125
126 // Expected RefreshRate objects
127 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, "60fps", 60,
128 RefreshRate::ConstructorTag(0)};
129 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
130 createConfig(HWC_CONFIG_ID_60, 0, 16666665), "60fps", 60,
131 RefreshRate::ConstructorTag(0)};
132 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, "90fps", 90,
133 RefreshRate::ConstructorTag(0)};
134 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
135 "90fps", 90, RefreshRate::ConstructorTag(0)};
136 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
137 mConfig90DifferentResolution, "90fps", 90,
138 RefreshRate::ConstructorTag(0)};
139 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, "72fps", 72,
140 RefreshRate::ConstructorTag(0)};
141 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, "30fps", 30,
142 RefreshRate::ConstructorTag(0)};
143 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, "120fps", 120,
144 RefreshRate::ConstructorTag(0)};
145
146 Hwc2::mock::Display mDisplay;
147
148private:
149 std::shared_ptr<const HWC2::Display::Config> createConfig(HwcConfigIndexType configId,
150 int32_t configGroup,
151 int64_t vsyncPeriod,
152 int32_t hight = -1,
153 int32_t width = -1);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700154};
155
Ady Abrahamabc27602020-04-08 17:20:29 -0700156using Builder = HWC2::Display::Config::Builder;
157
Alec Mouri0a1cc962019-03-14 12:33:02 -0700158RefreshRateConfigsTest::RefreshRateConfigsTest() {
159 const ::testing::TestInfo* const test_info =
160 ::testing::UnitTest::GetInstance()->current_test_info();
161 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
162}
163
164RefreshRateConfigsTest::~RefreshRateConfigsTest() {
165 const ::testing::TestInfo* const test_info =
166 ::testing::UnitTest::GetInstance()->current_test_info();
167 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
168}
169
Ady Abrahamabc27602020-04-08 17:20:29 -0700170std::shared_ptr<const HWC2::Display::Config> RefreshRateConfigsTest::createConfig(
171 HwcConfigIndexType configId, int32_t configGroup, int64_t vsyncPeriod, int32_t hight,
172 int32_t width) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700173 return HWC2::Display::Config::Builder(mDisplay, hal::HWConfigId(configId.value()))
Ady Abrahamabc27602020-04-08 17:20:29 -0700174 .setVsyncPeriod(int32_t(vsyncPeriod))
175 .setConfigGroup(configGroup)
176 .setHeight(hight)
177 .setWidth(width)
178 .build();
179}
180
Alec Mouri0a1cc962019-03-14 12:33:02 -0700181namespace {
182/* ------------------------------------------------------------------------
183 * Test cases
184 */
Ady Abraham2139f732019-11-13 18:56:40 -0800185TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700186 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700187 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
188 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700189}
190
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100191TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100192 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700193 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
194 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasf734df42020-04-13 21:09:28 -0700195 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HwcConfigIndexType(10), {60, 60}}), 0);
196 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {20, 40}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100197}
198
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700199TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700200 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700201 std::make_unique<RefreshRateConfigs>(m60_90Device,
202 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700203
Ady Abraham2e1dd892020-03-05 13:48:36 -0800204 const auto& minRate = refreshRateConfigs->getMinRefreshRate();
205 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700206
Ady Abrahamabc27602020-04-08 17:20:29 -0700207 ASSERT_EQ(mExpected60Config, minRate);
208 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800209
Ady Abraham2e1dd892020-03-05 13:48:36 -0800210 const auto& minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
211 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800212 ASSERT_EQ(minRateByPolicy, minRate);
213 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700214}
Ady Abraham2139f732019-11-13 18:56:40 -0800215
216TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800217 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700218 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
219 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800220
Ady Abraham2e1dd892020-03-05 13:48:36 -0800221 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
222 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
223 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
224 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800225
Ady Abrahamabc27602020-04-08 17:20:29 -0700226 ASSERT_EQ(mExpected60Config, minRate);
227 ASSERT_EQ(mExpected60Config, minRate60);
228 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800229
Steven Thomasf734df42020-04-13 21:09:28 -0700230 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800231 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
232
Ady Abraham2e1dd892020-03-05 13:48:36 -0800233 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
234 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800235
Ady Abrahamabc27602020-04-08 17:20:29 -0700236 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
237 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
238 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
239}
240
241TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
242 auto refreshRateConfigs =
243 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
244 /*currentConfigId=*/HWC_CONFIG_ID_60);
245
246 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
247 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
248 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
249 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
250
251 ASSERT_EQ(mExpected60Config, minRate);
252 ASSERT_EQ(mExpected60Config, minRate60);
253 ASSERT_EQ(mExpected60Config, performanceRate60);
254
Steven Thomasf734df42020-04-13 21:09:28 -0700255 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700256 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
257
258 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
259 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
260
261 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
262 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
263 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800264}
265
266TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800267 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700268 std::make_unique<RefreshRateConfigs>(m60_90Device,
269 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800270
Ady Abraham2e1dd892020-03-05 13:48:36 -0800271 auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
272 auto& performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800273
Ady Abrahamabc27602020-04-08 17:20:29 -0700274 ASSERT_EQ(mExpected60Config, minRate);
275 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800276
Steven Thomasf734df42020-04-13 21:09:28 -0700277 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800278
Ady Abraham2e1dd892020-03-05 13:48:36 -0800279 auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
280 auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700281 ASSERT_EQ(mExpected60Config, minRate60);
282 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800283}
284
285TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800286 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700287 std::make_unique<RefreshRateConfigs>(m60_90Device,
288 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800289 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800290 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700291 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800292 }
293
294 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
295 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800296 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700297 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800298 }
299
Steven Thomasf734df42020-04-13 21:09:28 -0700300 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800301 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800302 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700303 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800304 }
305}
306
Steven Thomasbb374322020-04-28 22:47:16 -0700307TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700308 auto refreshRateConfigs =
309 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
310 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800311
Steven Thomasdebafed2020-05-18 17:30:35 -0700312 // If there are no layers we select the default frame rate, which is the max of the primary
313 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800314 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700315 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700316 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800317
Steven Thomasdebafed2020-05-18 17:30:35 -0700318 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700319 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700320 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800321}
322
Steven Thomasbb374322020-04-28 22:47:16 -0700323TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800324 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700325 std::make_unique<RefreshRateConfigs>(m60_90Device,
326 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327
328 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
329 auto& lr = layers[0];
330
331 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800332 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700333 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700334 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800335
336 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800337 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700338 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700339 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340
341 lr.desiredRefreshRate = 90.0f;
342 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800343 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700344 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700345 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800346
347 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800348 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700349 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700350 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
352 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800353 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700354 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700355 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800356
357 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800358 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700359 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700360 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
362 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800363 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700364 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700365 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800367 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700368 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
370 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700371 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700372 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800373
374 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700375 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700376 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377
378 lr.desiredRefreshRate = 90.0f;
379 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700380 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700381 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800382
383 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700384 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700385 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
387 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
391 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700392 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700393 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
395 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700396 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700397 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Steven Thomasf734df42020-04-13 21:09:28 -0700399 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
401 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700402 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700403 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
405 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700407 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
409 lr.desiredRefreshRate = 90.0f;
410 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700411 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700412 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
414 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700415 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700416 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800417
418 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700419 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700420 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
422 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700423 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700424 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800425
426 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700427 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700428 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
Steven Thomasf734df42020-04-13 21:09:28 -0700430 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700432 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700433 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
435 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700436 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700437 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438
439 lr.desiredRefreshRate = 90.0f;
440 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700442 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
444 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700445 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700446 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
448 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
452 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700453 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
456 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700457 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459}
460
Steven Thomasbb374322020-04-28 22:47:16 -0700461TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700463 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
464 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465
466 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
467 auto& lr = layers[0];
468
469 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700470 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700471 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
473 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700474 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476
477 lr.desiredRefreshRate = 90.0f;
478 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481
482 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700483 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700484 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800485
486 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700488 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489
490 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700491 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700492 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800493
494 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700495 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800497}
498
Steven Thomasbb374322020-04-28 22:47:16 -0700499TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700501 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
502 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800503
504 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
505 LayerRequirement{.weight = 1.0f}};
506 auto& lr1 = layers[0];
507 auto& lr2 = layers[1];
508
509 lr1.desiredRefreshRate = 24.0f;
510 lr1.vote = LayerVoteType::Heuristic;
511 lr2.desiredRefreshRate = 60.0f;
512 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700513 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700514 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800515
516 lr1.desiredRefreshRate = 24.0f;
517 lr1.vote = LayerVoteType::Heuristic;
518 lr2.desiredRefreshRate = 48.0f;
519 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700520 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700521 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800522
523 lr1.desiredRefreshRate = 24.0f;
524 lr1.vote = LayerVoteType::Heuristic;
525 lr2.desiredRefreshRate = 48.0f;
526 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700527 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700528 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529}
530
Steven Thomasbb374322020-04-28 22:47:16 -0700531TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800532 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700533 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
534 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800535
536 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
537 LayerRequirement{.weight = 1.0f}};
538 auto& lr1 = layers[0];
539 auto& lr2 = layers[1];
540
541 lr1.desiredRefreshRate = 24.0f;
542 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800543 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800544 lr2.desiredRefreshRate = 60.0f;
545 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800546 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700547 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700548 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800549
550 lr1.desiredRefreshRate = 24.0f;
551 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800552 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800553 lr2.desiredRefreshRate = 60.0f;
554 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800555 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700556 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700557 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800558
559 lr1.desiredRefreshRate = 24.0f;
560 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800561 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800562 lr2.desiredRefreshRate = 60.0f;
563 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800564 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700565 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700566 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800567
568 lr1.desiredRefreshRate = 24.0f;
569 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800570 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 lr2.desiredRefreshRate = 90.0f;
572 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800573 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700574 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700575 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800576
577 lr1.desiredRefreshRate = 24.0f;
578 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
579 lr1.name = "24Hz ExplicitExactOrMultiple";
580 lr2.desiredRefreshRate = 90.0f;
581 lr2.vote = LayerVoteType::ExplicitDefault;
582 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700583 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700584 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800585
586 lr1.desiredRefreshRate = 24.0f;
587 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800588 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800589 lr2.desiredRefreshRate = 90.0f;
590 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800591 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700592 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700593 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800594
595 lr1.desiredRefreshRate = 24.0f;
596 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800597 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800598 lr2.desiredRefreshRate = 90.0f;
599 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800600 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700601 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700602 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800603
604 lr1.desiredRefreshRate = 24.0f;
605 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800606 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800607 lr2.desiredRefreshRate = 90.0f;
608 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800609 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700610 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700611 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800612
613 lr1.desiredRefreshRate = 24.0f;
614 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800615 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800616 lr2.desiredRefreshRate = 90.0f;
617 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800618 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700619 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700620 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800621}
622
Steven Thomasbb374322020-04-28 22:47:16 -0700623TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800624 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700625 std::make_unique<RefreshRateConfigs>(m30_60Device,
626 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800627
628 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
629 auto& lr = layers[0];
630
631 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700632 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700633 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800634
635 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700636 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700637 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800638
639 lr.desiredRefreshRate = 90.0f;
640 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700641 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700642 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800643
644 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700645 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700646 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800647
648 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700649 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700650 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800651
652 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700653 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700654 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800655
656 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700657 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700658 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800659}
660
Steven Thomasbb374322020-04-28 22:47:16 -0700661TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800662 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700663 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
664 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800665
666 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
667 auto& lr = layers[0];
668
669 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800670 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700671 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700672 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800673
674 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800675 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700676 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700677 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800678
679 lr.desiredRefreshRate = 90.0f;
680 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800681 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700682 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700683 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800684
685 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800686 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700687 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700688 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700689 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700690 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691
692 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800693 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700694 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700695 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700696 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700697 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800698
699 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800700 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700701 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700702 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700703 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700704 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800705
706 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800707 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700708 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700709 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700710 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700711 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800712
713 lr.desiredRefreshRate = 24.0f;
714 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
715 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700716 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700717 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700718 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800720}
721
Steven Thomasbb374322020-04-28 22:47:16 -0700722TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800723 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700724 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
725 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800726
727 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
728 LayerRequirement{.weight = 1.0f}};
729 auto& lr1 = layers[0];
730 auto& lr2 = layers[1];
731
732 lr1.vote = LayerVoteType::Min;
733 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700734 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700735 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800736
737 lr1.vote = LayerVoteType::Min;
738 lr2.vote = LayerVoteType::Heuristic;
739 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700740 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700741 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800742
743 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800744 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800745 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700746 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700747 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800748
749 lr1.vote = LayerVoteType::Max;
750 lr2.vote = LayerVoteType::Heuristic;
751 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700752 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800754
755 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800756 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800757 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700758 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700759 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800760
761 lr1.vote = LayerVoteType::Heuristic;
762 lr1.desiredRefreshRate = 15.0f;
763 lr2.vote = LayerVoteType::Heuristic;
764 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700765 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700766 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800767
768 lr1.vote = LayerVoteType::Heuristic;
769 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800770 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700772 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700773 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800774}
775
Steven Thomasbb374322020-04-28 22:47:16 -0700776TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700778 std::make_unique<RefreshRateConfigs>(m60_90Device,
779 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780
781 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
782 auto& lr = layers[0];
783
Ady Abraham71c437d2020-01-31 15:56:57 -0800784 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
786 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800787 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700788 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700789 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800790 }
791}
792
Steven Thomasbb374322020-04-28 22:47:16 -0700793TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800794 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700795 std::make_unique<RefreshRateConfigs>(m60_90Device,
796 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800797
798 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
799 LayerRequirement{.weight = 1.0f}};
800 auto& lr1 = layers[0];
801 auto& lr2 = layers[1];
802
803 lr1.vote = LayerVoteType::Heuristic;
804 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800805 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700807 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700808 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800809
810 lr1.vote = LayerVoteType::ExplicitDefault;
811 lr1.desiredRefreshRate = 90.0f;
812 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
813 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700814 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700815 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816
817 lr1.vote = LayerVoteType::Heuristic;
818 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800819 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800820 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700821 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700822 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800823}
824
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800825TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700826 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
827 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
828 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
829 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
830 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800831}
832
Steven Thomasbb374322020-04-28 22:47:16 -0700833TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800834 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700835 std::make_unique<RefreshRateConfigs>(m60_90Device,
836 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800837
838 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
839 auto& lr = layers[0];
840
Ady Abraham71c437d2020-01-31 15:56:57 -0800841 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800842 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
843 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800844 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700845 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700846 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800847 }
848}
849
Steven Thomasbb374322020-04-28 22:47:16 -0700850TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800851 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700852 std::make_unique<RefreshRateConfigs>(m60_90Device,
853 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800854
855 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
856 LayerRequirement{.weight = 1.0f}};
857 auto& lr1 = layers[0];
858 auto& lr2 = layers[1];
859
860 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
861 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800862 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800863 lr2.vote = LayerVoteType::Heuristic;
864 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800865 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700866 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700867 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800868
869 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
870 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800871 lr1.name = "60Hz ExplicitExactOrMultiple";
872 lr2.vote = LayerVoteType::ExplicitDefault;
873 lr2.desiredRefreshRate = 90.0f;
874 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700876 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800877
878 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
879 lr1.desiredRefreshRate = 60.0f;
880 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800881 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800882 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700883 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700884 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800885
886 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
887 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800888 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800889 lr2.vote = LayerVoteType::Heuristic;
890 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800891 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700892 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700893 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800894
895 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
896 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800897 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800898 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800899 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700900 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700901 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902}
903
904TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700906 std::make_unique<RefreshRateConfigs>(m60_90Device,
907 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800908
909 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
910 LayerRequirement{.weight = 1.0f}};
911 auto& lr1 = layers[0];
912 auto& lr2 = layers[1];
913
914 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
915 lr1.desiredRefreshRate = 60.0f;
916 lr1.name = "60Hz ExplicitExactOrMultiple";
917 lr2.vote = LayerVoteType::NoVote;
918 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700919 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700920 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800921
922 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
923 lr1.desiredRefreshRate = 60.0f;
924 lr1.name = "60Hz ExplicitExactOrMultiple";
925 lr2.vote = LayerVoteType::NoVote;
926 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800929
930 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
931 lr1.desiredRefreshRate = 60.0f;
932 lr1.name = "60Hz ExplicitExactOrMultiple";
933 lr2.vote = LayerVoteType::Max;
934 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700935 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700936 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800937
938 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
939 lr1.desiredRefreshRate = 60.0f;
940 lr1.name = "60Hz ExplicitExactOrMultiple";
941 lr2.vote = LayerVoteType::Max;
942 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700943 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700944 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945
946 // The other layer starts to provide buffers
947 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
948 lr1.desiredRefreshRate = 60.0f;
949 lr1.name = "60Hz ExplicitExactOrMultiple";
950 lr2.vote = LayerVoteType::Heuristic;
951 lr2.desiredRefreshRate = 90.0f;
952 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700953 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700954 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800955}
956
957TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -0700958 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800959 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700960 std::make_unique<RefreshRateConfigs>(m60_90Device,
961 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800962
Ady Abrahamdfd62162020-06-10 16:11:56 -0700963 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
964 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800965
Ady Abrahamdfd62162020-06-10 16:11:56 -0700966 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
967 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800968
969 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
970 LayerRequirement{.weight = 1.0f}};
971 auto& lr1 = layers[0];
972 auto& lr2 = layers[1];
973
974 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
975 lr1.desiredRefreshRate = 60.0f;
976 lr1.name = "60Hz ExplicitExactOrMultiple";
977 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -0700978 lr2.desiredRefreshRate = 60.0f;
979 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -0700980 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
981 &consideredSignals);
982 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800983
984 lr1.vote = LayerVoteType::ExplicitDefault;
985 lr1.desiredRefreshRate = 60.0f;
986 lr1.name = "60Hz ExplicitExactOrMultiple";
987 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -0700988 lr2.desiredRefreshRate = 60.0f;
989 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -0700990 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
991 &consideredSignals);
992 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800993
994 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
995 lr1.desiredRefreshRate = 60.0f;
996 lr1.name = "60Hz ExplicitExactOrMultiple";
997 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -0700998 lr2.desiredRefreshRate = 60.0f;
999 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001000 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1001 &consideredSignals);
1002 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001003
1004 lr1.vote = LayerVoteType::ExplicitDefault;
1005 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001006 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001007 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001008 lr2.desiredRefreshRate = 60.0f;
1009 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001010 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1011 &consideredSignals);
1012 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001013}
1014
Steven Thomasbb374322020-04-28 22:47:16 -07001015TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001016 auto refreshRateConfigs =
1017 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1018 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001019
1020 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1021 auto& lr = layers[0];
1022
1023 // Prepare a table with the vote and the expected refresh rate
1024 const std::vector<std::pair<float, float>> testCases = {
1025 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1026
1027 {100, 90}, {90, 90}, {89, 90},
1028
1029 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1030
1031 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1032
1033 {55, 90}, {50, 90}, {45, 90},
1034
1035 {42, 120}, {40, 120}, {39, 120},
1036
1037 {37, 72}, {36, 72}, {35, 72},
1038
1039 {30, 60},
1040 };
1041
1042 for (const auto& test : testCases) {
1043 lr.vote = LayerVoteType::ExplicitDefault;
1044 lr.desiredRefreshRate = test.first;
1045
1046 std::stringstream ss;
1047 ss << "ExplicitDefault " << test.first << " fps";
1048 lr.name = ss.str();
1049
1050 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001051 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamabc27602020-04-08 17:20:29 -07001052 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001053 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1054 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001055}
1056
Alec Mouri11232a22020-05-14 18:06:25 -07001057TEST_F(RefreshRateConfigsTest,
1058 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1059 auto refreshRateConfigs =
1060 std::make_unique<RefreshRateConfigs>(m60_90Device,
1061 /*currentConfigId=*/HWC_CONFIG_ID_90);
1062
1063 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1064 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1065 0);
1066
1067 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1068 auto& lr = layers[0];
1069
Ady Abrahamdfd62162020-06-10 16:11:56 -07001070 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001071 lr.vote = LayerVoteType::ExplicitDefault;
1072 lr.desiredRefreshRate = 60.0f;
1073 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001074 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001075 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001076 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1077 &consideredSignals));
1078 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001079}
1080
1081TEST_F(RefreshRateConfigsTest,
1082 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1083 auto refreshRateConfigs =
1084 std::make_unique<RefreshRateConfigs>(m60_90Device,
1085 /*currentConfigId=*/HWC_CONFIG_ID_60);
1086
1087 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1088 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1089 0);
1090
1091 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1092 auto& lr = layers[0];
1093
Alec Mouri11232a22020-05-14 18:06:25 -07001094 lr.vote = LayerVoteType::ExplicitDefault;
1095 lr.desiredRefreshRate = 90.0f;
1096 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001097 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001098 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001099 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001100}
1101
1102TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001103 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001104 auto refreshRateConfigs =
1105 std::make_unique<RefreshRateConfigs>(m60_90Device,
1106 /*currentConfigId=*/HWC_CONFIG_ID_90);
1107
1108 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1109 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1110 0);
1111
Ady Abrahamdfd62162020-06-10 16:11:56 -07001112 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001113 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001114 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1115 &consideredSignals));
1116 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001117
1118 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1119 auto& lr = layers[0];
1120
1121 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1122 lr.desiredRefreshRate = 60.0f;
1123 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001124 lr.focused = false;
1125 EXPECT_EQ(mExpected90Config,
1126 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1127
1128 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001129 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001130 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001131
1132 lr.vote = LayerVoteType::ExplicitDefault;
1133 lr.desiredRefreshRate = 60.0f;
1134 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001135 lr.focused = false;
1136 EXPECT_EQ(mExpected90Config,
1137 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1138
1139 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001140 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001141 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001142
1143 lr.vote = LayerVoteType::Heuristic;
1144 lr.desiredRefreshRate = 60.0f;
1145 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001146 lr.focused = false;
1147 EXPECT_EQ(mExpected90Config,
1148 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1149
1150 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001151 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001152 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001153
1154 lr.vote = LayerVoteType::Max;
1155 lr.desiredRefreshRate = 60.0f;
1156 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001157 lr.focused = false;
1158 EXPECT_EQ(mExpected90Config,
1159 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1160
1161 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001162 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001163 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001164
1165 lr.vote = LayerVoteType::Min;
1166 lr.desiredRefreshRate = 60.0f;
1167 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001168 lr.focused = false;
1169 EXPECT_EQ(mExpected90Config,
1170 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1171
1172 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001173 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001174 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001175}
1176
Steven Thomasd4071902020-03-24 16:02:53 -07001177TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001178 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001179 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1180 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001181
1182 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1183 auto& layer = layers[0];
1184 layer.vote = LayerVoteType::ExplicitDefault;
1185 layer.desiredRefreshRate = 90.0f;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001186 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001187 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001188 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001189
Steven Thomasd4071902020-03-24 16:02:53 -07001190 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001191 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001192 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001193
1194 RefreshRateConfigs::Policy policy;
1195 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1196 policy.allowGroupSwitching = true;
1197 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1198 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001199 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001200 .getConfigId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001201
1202 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001203 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001204 ASSERT_EQ(HWC_CONFIG_ID_60,
1205 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1206 .getConfigId());
1207
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001208 // Verify that we won't do a seamless switch if we request the same mode as the default
Marin Shalamanov46084422020-10-13 12:33:42 +02001209 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1210 layer.desiredRefreshRate = 60.0f;
1211 layer.name = "60Hz ExplicitDefault";
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001212 layer.seamlessness = Seamlessness::OnlySeamless;
1213 ASSERT_EQ(HWC_CONFIG_ID_90,
1214 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1215 .getConfigId());
1216
1217 // Verify that if the current config is in another group and there are no layers with
1218 // seamlessness=SeamedAndSeamless we'll go back to the default group.
1219 layer.desiredRefreshRate = 60.0f;
1220 layer.name = "60Hz ExplicitDefault";
1221 layer.seamlessness = Seamlessness::Default;
Marin Shalamanov46084422020-10-13 12:33:42 +02001222 ASSERT_EQ(HWC_CONFIG_ID_60,
1223 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1224 .getConfigId());
1225
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001226 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
1227 // seamlessness=OnlySeamless can't change the config group.
Marin Shalamanov46084422020-10-13 12:33:42 +02001228 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001229 layer.seamlessness = Seamlessness::OnlySeamless;
1230
1231 layers.push_back(LayerRequirement{.weight = 0.5f});
1232 auto& layer2 = layers[layers.size() - 1];
Marin Shalamanov46084422020-10-13 12:33:42 +02001233 layer2.vote = LayerVoteType::ExplicitDefault;
1234 layer2.desiredRefreshRate = 90.0f;
1235 layer2.name = "90Hz ExplicitDefault";
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001236 layer2.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001237 layer2.focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001238
1239 ASSERT_EQ(HWC_CONFIG_ID_90,
1240 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1241 .getConfigId());
1242
1243 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
1244 // seamlessness=Default can't change the config group.
1245 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanov46084422020-10-13 12:33:42 +02001246 ASSERT_EQ(HWC_CONFIG_ID_90,
1247 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1248 .getConfigId());
1249}
1250
1251TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1252 auto refreshRateConfigs =
1253 std::make_unique<RefreshRateConfigs>(m30_60Device,
1254 /*currentConfigId=*/HWC_CONFIG_ID_60);
1255
1256 // Allow group switching.
1257 RefreshRateConfigs::Policy policy;
1258 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1259 policy.allowGroupSwitching = true;
1260 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1261
1262 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1263 auto& layer = layers[0];
1264 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
1265 layer.desiredRefreshRate = 60.0f;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001266 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001267 layer.name = "60Hz ExplicitExactOrMultiple";
1268 layer.focused = true;
1269
1270 ASSERT_EQ(HWC_CONFIG_ID_60,
1271 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1272 .getConfigId());
1273
1274 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_120);
1275 ASSERT_EQ(HWC_CONFIG_ID_120,
1276 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1277 .getConfigId());
1278}
1279
1280TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1281 auto refreshRateConfigs =
1282 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1283 /*currentConfigId=*/HWC_CONFIG_ID_60);
1284
1285 // Allow group switching.
1286 RefreshRateConfigs::Policy policy;
1287 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1288 policy.allowGroupSwitching = true;
1289 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1290
1291 auto layers = std::vector<
1292 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1293 .vote = LayerVoteType::ExplicitDefault,
1294 .desiredRefreshRate = 60.0f,
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001295 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001296 .weight = 0.5f,
1297 .focused = false},
1298 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1299 .vote = LayerVoteType::ExplicitExactOrMultiple,
1300 .desiredRefreshRate = 25.0f,
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001301 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001302 .weight = 1.0f,
1303 .focused = true}};
1304 auto& seamedLayer = layers[0];
1305
1306 ASSERT_EQ(HWC_CONFIG_ID_50,
1307 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1308 .getConfigId());
1309
1310 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = 30.0f;
1311 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_30);
1312
1313 ASSERT_EQ(HWC_CONFIG_ID_25,
1314 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1315 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001316}
1317
Steven Thomasf734df42020-04-13 21:09:28 -07001318TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1319 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001320 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001321 /*currentConfigId=*/HWC_CONFIG_ID_60);
1322
1323 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1324 layers[0].name = "Test layer";
1325
Steven Thomasbb374322020-04-28 22:47:16 -07001326 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001327 // given voteType and fps.
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001328 auto getFrameRate = [&](LayerVoteType voteType, float fps, bool touchActive = false,
1329 bool focused = true) -> HwcConfigIndexType {
Steven Thomasf734df42020-04-13 21:09:28 -07001330 layers[0].vote = voteType;
1331 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001332 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001333 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001334 .getConfigId();
1335 };
1336
1337 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001338 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001339 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001340 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001341 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001342 .getConfigId());
1343 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001344 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001345 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1346 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1347 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
Ady Abraham20c029c2020-07-06 12:58:05 -07001348 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001349
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001350 // Layers not focused are not allowed to override primary config
1351 EXPECT_EQ(HWC_CONFIG_ID_60,
1352 getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/false,
1353 /*focused=*/false));
1354 EXPECT_EQ(HWC_CONFIG_ID_60,
1355 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/false,
1356 /*focused=*/false));
1357
Steven Thomasf734df42020-04-13 21:09:28 -07001358 // Touch boost should be restricted to the primary range.
1359 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1360 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1361 // shouldn't drag us back down to the primary range max.
1362 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001363 EXPECT_EQ(HWC_CONFIG_ID_60,
Steven Thomasf734df42020-04-13 21:09:28 -07001364 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1365
1366 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1367 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1368 0);
1369 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1370 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1371 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1372 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1373 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1374 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1375}
1376
Steven Thomasbb374322020-04-28 22:47:16 -07001377TEST_F(RefreshRateConfigsTest, idle) {
1378 auto refreshRateConfigs =
1379 std::make_unique<RefreshRateConfigs>(m60_90Device,
1380 /*currentConfigId=*/HWC_CONFIG_ID_60);
1381
1382 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1383 layers[0].name = "Test layer";
1384
Ady Abrahamdfd62162020-06-10 16:11:56 -07001385 const auto getIdleFrameRate = [&](LayerVoteType voteType,
1386 bool touchActive) -> HwcConfigIndexType {
Steven Thomasbb374322020-04-28 22:47:16 -07001387 layers[0].vote = voteType;
1388 layers[0].desiredRefreshRate = 90.f;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001389 RefreshRateConfigs::GlobalSignals consideredSignals;
1390 const auto configId =
1391 refreshRateConfigs
1392 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1393 &consideredSignals)
1394 .getConfigId();
1395 // Refresh rate will be chosen by either touch state or idle state
1396 EXPECT_EQ(!touchActive, consideredSignals.idle);
1397 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001398 };
1399
1400 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1401 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1402 0);
1403
1404 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001405 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1406 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1407 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1408 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1409 EXPECT_EQ(HWC_CONFIG_ID_90,
1410 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1411 EXPECT_EQ(HWC_CONFIG_ID_90,
1412 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001413
1414 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001415 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001416 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001417 .getConfigId());
1418
1419 // Idle should be higher precedence than other layer frame rate considerations.
1420 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001421 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1422 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1423 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1424 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1425 EXPECT_EQ(HWC_CONFIG_ID_60,
1426 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1427 EXPECT_EQ(HWC_CONFIG_ID_60,
1428 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001429
1430 // Idle should be applied rather than the current config when there are no layers.
1431 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001432 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001433 .getConfigId());
1434}
1435
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001436TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1437 auto refreshRateConfigs =
1438 std::make_unique<RefreshRateConfigs>(m60_90Device,
1439 /*currentConfigId=*/HWC_CONFIG_ID_60);
1440
1441 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
1442 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, fps);
1443 float expectedFrameRate;
1444 if (fps < 26.91f) {
1445 expectedFrameRate = 24.0f;
1446 } else if (fps < 37.51f) {
1447 expectedFrameRate = 30.0f;
1448 } else if (fps < 52.51f) {
1449 expectedFrameRate = 45.0f;
1450 } else if (fps < 66.01f) {
1451 expectedFrameRate = 60.0f;
1452 } else if (fps < 81.01f) {
1453 expectedFrameRate = 72.0f;
1454 } else {
1455 expectedFrameRate = 90.0f;
1456 }
1457 EXPECT_FLOAT_EQ(expectedFrameRate, knownFrameRate)
1458 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1459 }
1460}
1461
1462TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001463 auto refreshRateConfigs =
1464 std::make_unique<RefreshRateConfigs>(m60_90Device,
1465 /*currentConfigId=*/HWC_CONFIG_ID_60);
1466
1467 struct ExpectedRate {
1468 float rate;
1469 const RefreshRate& expected;
1470 };
1471
1472 /* clang-format off */
1473 std::vector<ExpectedRate> knownFrameRatesExpectations = {
1474 {24.0f, mExpected60Config},
1475 {30.0f, mExpected60Config},
1476 {45.0f, mExpected90Config},
1477 {60.0f, mExpected60Config},
1478 {72.0f, mExpected90Config},
1479 {90.0f, mExpected90Config},
1480 };
1481 /* clang-format on */
1482
1483 // Make sure the test tests all the known frame rate
1484 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
1485 const auto equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1486 knownFrameRatesExpectations.begin(),
1487 [](float a, const ExpectedRate& b) { return a == b.rate; });
1488 EXPECT_TRUE(equal);
1489
1490 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1491 auto& layer = layers[0];
1492 layer.vote = LayerVoteType::Heuristic;
1493 for (const auto& expectedRate : knownFrameRatesExpectations) {
1494 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001495 const auto& refreshRate =
1496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001497 EXPECT_EQ(expectedRate.expected, refreshRate);
1498 }
1499}
1500
Ana Krulecb9afd792020-06-11 13:16:15 -07001501TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1502 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1503 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1504 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1505}
1506
1507TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1508 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1509
1510 auto refreshRateConfigs =
1511 std::make_unique<RefreshRateConfigs>(m60_90Device,
1512 /*currentConfigId=*/HWC_CONFIG_ID_90);
1513 // SetPolicy(60, 90), current 90Hz => TurnOn.
1514 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1515
1516 // SetPolicy(60, 90), current 60Hz => TurnOn.
1517 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 90}}), 0);
1518 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1519
1520 // SetPolicy(60, 60), current 60Hz => NoChange, avoid extra calls.
1521 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
1522 EXPECT_EQ(KernelIdleTimerAction::NoChange, refreshRateConfigs->getIdleTimerAction());
1523
1524 // SetPolicy(90, 90), current 90Hz => TurnOff.
1525 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
1526 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1527}
1528
Ady Abraham0bb6a472020-10-12 10:22:13 -07001529TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUnknownUid) {
1530 auto refreshRateConfigs =
1531 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1532 /*currentConfigId=*/HWC_CONFIG_ID_30);
1533 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(1234));
1534}
1535
1536TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUid) {
1537 auto refreshRateConfigs =
1538 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1539 /*currentConfigId=*/HWC_CONFIG_ID_30);
1540 const uid_t uid = 1234;
1541 refreshRateConfigs->setPreferredRefreshRateForUid(uid, 30);
1542 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1543
1544 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60);
1545 EXPECT_EQ(2, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1546
1547 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_72);
1548 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1549
1550 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1551 EXPECT_EQ(3, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1552
1553 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_120);
1554 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1555}
1556
Alec Mouri0a1cc962019-03-14 12:33:02 -07001557} // namespace
1558} // namespace scheduler
1559} // namespace android