blob: 2fbc72a01a91c744b1b0dfe2f1b7fc379f3ceb9a [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
307TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
Ady Abraham2139f732019-11-13 18:56:40 -0800308 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700309 std::make_unique<RefreshRateConfigs>(m60_90Device,
310 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800311
Ady Abraham8a82ba62020-01-17 12:43:17 -0800312 const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> {
Marin Shalamanov46084422020-10-13 12:33:42 +0200313 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, /*shouldBeSeamless*/ true,
314 /*weight*/ 1.0f, /*focused*/ false}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800315 };
316
Ady Abrahamabc27602020-04-08 17:20:29 -0700317 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800318 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700319 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800320 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700321 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800322 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700323 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800324 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700325 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800326 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800327
Steven Thomasf734df42020-04-13 21:09:28 -0700328 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700329 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800330 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700331 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800332 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700333 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800334 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700335 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800336 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700337 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800339
Steven Thomasf734df42020-04-13 21:09:28 -0700340 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700341 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800342 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700343 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800344 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700345 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800346 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700347 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700349 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800350 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Steven Thomasf734df42020-04-13 21:09:28 -0700351 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700352 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800353 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700354 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800355 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700356 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800357 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700358 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700360 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
362}
363
Steven Thomasbb374322020-04-28 22:47:16 -0700364TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700365 auto refreshRateConfigs =
366 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
367 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800368
Steven Thomasdebafed2020-05-18 17:30:35 -0700369 // If there are no layers we select the default frame rate, which is the max of the primary
370 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800371 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700372 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800374
Steven Thomasdebafed2020-05-18 17:30:35 -0700375 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700376 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700377 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800378}
379
Steven Thomasbb374322020-04-28 22:47:16 -0700380TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700382 std::make_unique<RefreshRateConfigs>(m60_90Device,
383 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
385 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
386 auto& lr = layers[0];
387
388 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800389 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700390 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700391 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
393 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800394 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700395 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700396 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397
398 lr.desiredRefreshRate = 90.0f;
399 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800400 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700401 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700402 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
404 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800405 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected60Config,
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 = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800410 lr.name = "45Hz 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 = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800415 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700416 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700417 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
419 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800420 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700421 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700422 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800424 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700425 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
427 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700428 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700429 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
431 lr.vote = LayerVoteType::Max;
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.desiredRefreshRate = 90.0f;
436 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700437 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700438 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
440 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected60Config,
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 = 45.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 = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected60Config,
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 = 24.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
Steven Thomasf734df42020-04-13 21:09:28 -0700456 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
458 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700459 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700460 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461
462 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700463 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700464 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465
466 lr.desiredRefreshRate = 90.0f;
467 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700468 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700469 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
471 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700472 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700473 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
475 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700476 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700477 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478
479 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700480 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700481 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482
483 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700484 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700485 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486
Steven Thomasf734df42020-04-13 21:09:28 -0700487 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800488 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700489 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700490 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800491
492 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700493 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700494 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800495
496 lr.desiredRefreshRate = 90.0f;
497 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700498 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700499 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500
501 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700502 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700503 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800504
505 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700506 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700507 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800508
509 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700510 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700511 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800512
513 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700514 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700515 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800516}
517
Steven Thomasbb374322020-04-28 22:47:16 -0700518TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800519 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700520 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
521 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800522
523 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
524 auto& lr = layers[0];
525
526 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700527 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700528 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529
530 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700531 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700532 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800533
534 lr.desiredRefreshRate = 90.0f;
535 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700536 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700537 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800538
539 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700540 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700541 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800542
543 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700544 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700545 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800546
547 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700548 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700549 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800550
551 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700552 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700553 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554}
555
Steven Thomasbb374322020-04-28 22:47:16 -0700556TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700558 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
559 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800560
561 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
562 LayerRequirement{.weight = 1.0f}};
563 auto& lr1 = layers[0];
564 auto& lr2 = layers[1];
565
566 lr1.desiredRefreshRate = 24.0f;
567 lr1.vote = LayerVoteType::Heuristic;
568 lr2.desiredRefreshRate = 60.0f;
569 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700570 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700571 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800572
573 lr1.desiredRefreshRate = 24.0f;
574 lr1.vote = LayerVoteType::Heuristic;
575 lr2.desiredRefreshRate = 48.0f;
576 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700577 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700578 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800579
580 lr1.desiredRefreshRate = 24.0f;
581 lr1.vote = LayerVoteType::Heuristic;
582 lr2.desiredRefreshRate = 48.0f;
583 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700584 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700585 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800586}
587
Steven Thomasbb374322020-04-28 22:47:16 -0700588TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800589 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700590 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
591 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800592
593 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
594 LayerRequirement{.weight = 1.0f}};
595 auto& lr1 = layers[0];
596 auto& lr2 = layers[1];
597
598 lr1.desiredRefreshRate = 24.0f;
599 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800600 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800601 lr2.desiredRefreshRate = 60.0f;
602 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800603 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700604 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700605 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800606
607 lr1.desiredRefreshRate = 24.0f;
608 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800609 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800610 lr2.desiredRefreshRate = 60.0f;
611 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700613 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700614 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800615
616 lr1.desiredRefreshRate = 24.0f;
617 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800618 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr2.desiredRefreshRate = 60.0f;
620 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800621 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700622 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700623 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800624
625 lr1.desiredRefreshRate = 24.0f;
626 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800627 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800628 lr2.desiredRefreshRate = 90.0f;
629 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800630 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700631 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700632 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800633
634 lr1.desiredRefreshRate = 24.0f;
635 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
636 lr1.name = "24Hz ExplicitExactOrMultiple";
637 lr2.desiredRefreshRate = 90.0f;
638 lr2.vote = LayerVoteType::ExplicitDefault;
639 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700640 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700641 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800642
643 lr1.desiredRefreshRate = 24.0f;
644 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800645 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr2.desiredRefreshRate = 90.0f;
647 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800648 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700649 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700650 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800651
652 lr1.desiredRefreshRate = 24.0f;
653 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800654 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800655 lr2.desiredRefreshRate = 90.0f;
656 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800657 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700658 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700659 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800660
661 lr1.desiredRefreshRate = 24.0f;
662 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800663 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800664 lr2.desiredRefreshRate = 90.0f;
665 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800666 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700667 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700668 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800669
670 lr1.desiredRefreshRate = 24.0f;
671 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800672 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800673 lr2.desiredRefreshRate = 90.0f;
674 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800675 lr2.name = "90Hz ExplicitExactOrMultiple";
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 Abraham71c437d2020-01-31 15:56:57 -0800678}
679
Steven Thomasbb374322020-04-28 22:47:16 -0700680TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800681 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700682 std::make_unique<RefreshRateConfigs>(m30_60Device,
683 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800684
685 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
686 auto& lr = layers[0];
687
688 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700689 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700690 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691
692 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700693 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700694 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800695
696 lr.desiredRefreshRate = 90.0f;
697 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700698 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700699 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800700
701 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700702 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700703 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800704
705 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700706 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700707 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800708
709 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700710 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700711 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800712
713 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700714 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700715 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800716}
717
Steven Thomasbb374322020-04-28 22:47:16 -0700718TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800719 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700720 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
721 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800722
723 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
724 auto& lr = layers[0];
725
726 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800727 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700728 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700729 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800730
731 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800732 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700733 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700734 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800735
736 lr.desiredRefreshRate = 90.0f;
737 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800738 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700739 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700740 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800741
742 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800743 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700744 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700745 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700746 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700747 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800748
749 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800750 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700751 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700752 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700753 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
756 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800757 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700758 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700759 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700760 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700761 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800762
763 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800764 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700765 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700766 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700767 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700768 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800769
770 lr.desiredRefreshRate = 24.0f;
771 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
772 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700773 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700774 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700775 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700776 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777}
778
Steven Thomasbb374322020-04-28 22:47:16 -0700779TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700781 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
782 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800783
784 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
785 LayerRequirement{.weight = 1.0f}};
786 auto& lr1 = layers[0];
787 auto& lr2 = layers[1];
788
789 lr1.vote = LayerVoteType::Min;
790 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700791 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700792 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800793
794 lr1.vote = LayerVoteType::Min;
795 lr2.vote = LayerVoteType::Heuristic;
796 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700797 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700798 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800799
800 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800801 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800802 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700804 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
806 lr1.vote = LayerVoteType::Max;
807 lr2.vote = LayerVoteType::Heuristic;
808 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700809 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700810 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800811
812 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800813 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700815 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700816 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800817
818 lr1.vote = LayerVoteType::Heuristic;
819 lr1.desiredRefreshRate = 15.0f;
820 lr2.vote = LayerVoteType::Heuristic;
821 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700822 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700823 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
825 lr1.vote = LayerVoteType::Heuristic;
826 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800827 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800828 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700829 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700830 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800831}
832
Steven Thomasbb374322020-04-28 22:47:16 -0700833TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700835 std::make_unique<RefreshRateConfigs>(m60_90Device,
836 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -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 Abraham8a82ba62020-01-17 12:43:17 -0800842 for (float fps = 23.0f; fps < 25.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(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847 }
848}
849
850TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800851 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700852 std::make_unique<RefreshRateConfigs>(m60_90Device,
853 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -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::Heuristic;
861 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800862 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800863 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700864 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800865
866 lr1.vote = LayerVoteType::Heuristic;
867 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800868 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800869 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800871}
872
Steven Thomasbb374322020-04-28 22:47:16 -0700873TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800874 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 std::make_unique<RefreshRateConfigs>(m60_90Device,
876 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800877
878 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
879 LayerRequirement{.weight = 1.0f}};
880 auto& lr1 = layers[0];
881 auto& lr2 = layers[1];
882
883 lr1.vote = LayerVoteType::Heuristic;
884 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800885 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800886 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700887 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700888 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800889
890 lr1.vote = LayerVoteType::ExplicitDefault;
891 lr1.desiredRefreshRate = 90.0f;
892 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
893 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700894 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700895 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800896
897 lr1.vote = LayerVoteType::Heuristic;
898 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800899 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800900 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700901 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700902 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800903}
904
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800905TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700906 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
907 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
908 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
909 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
910 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800911}
912
Steven Thomasbb374322020-04-28 22:47:16 -0700913TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800914 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700915 std::make_unique<RefreshRateConfigs>(m60_90Device,
916 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800917
918 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
919 auto& lr = layers[0];
920
Ady Abraham71c437d2020-01-31 15:56:57 -0800921 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800922 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
923 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800924 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700925 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700926 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800927 }
928}
929
Steven Thomasbb374322020-04-28 22:47:16 -0700930TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800931 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700932 std::make_unique<RefreshRateConfigs>(m60_90Device,
933 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800934
935 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
936 LayerRequirement{.weight = 1.0f}};
937 auto& lr1 = layers[0];
938 auto& lr2 = layers[1];
939
940 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
941 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800942 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800943 lr2.vote = LayerVoteType::Heuristic;
944 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700946 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700947 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800948
949 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
950 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951 lr1.name = "60Hz ExplicitExactOrMultiple";
952 lr2.vote = LayerVoteType::ExplicitDefault;
953 lr2.desiredRefreshRate = 90.0f;
954 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700955 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700956 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800957
958 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
959 lr1.desiredRefreshRate = 60.0f;
960 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800961 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800962 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700963 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700964 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800965
966 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
967 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800968 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800969 lr2.vote = LayerVoteType::Heuristic;
970 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800971 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700972 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700973 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800974
975 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
976 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800977 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800978 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800979 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700980 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700981 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800982}
983
984TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800985 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700986 std::make_unique<RefreshRateConfigs>(m60_90Device,
987 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800988
989 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
990 LayerRequirement{.weight = 1.0f}};
991 auto& lr1 = layers[0];
992 auto& lr2 = layers[1];
993
994 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
995 lr1.desiredRefreshRate = 60.0f;
996 lr1.name = "60Hz ExplicitExactOrMultiple";
997 lr2.vote = LayerVoteType::NoVote;
998 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700999 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001000 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001001
1002 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1003 lr1.desiredRefreshRate = 60.0f;
1004 lr1.name = "60Hz ExplicitExactOrMultiple";
1005 lr2.vote = LayerVoteType::NoVote;
1006 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001007 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001008 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001009
1010 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1011 lr1.desiredRefreshRate = 60.0f;
1012 lr1.name = "60Hz ExplicitExactOrMultiple";
1013 lr2.vote = LayerVoteType::Max;
1014 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001015 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001016 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001017
1018 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1019 lr1.desiredRefreshRate = 60.0f;
1020 lr1.name = "60Hz ExplicitExactOrMultiple";
1021 lr2.vote = LayerVoteType::Max;
1022 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001023 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001024 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001025
1026 // The other layer starts to provide buffers
1027 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1028 lr1.desiredRefreshRate = 60.0f;
1029 lr1.name = "60Hz ExplicitExactOrMultiple";
1030 lr2.vote = LayerVoteType::Heuristic;
1031 lr2.desiredRefreshRate = 90.0f;
1032 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001033 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001034 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001035}
1036
1037TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001038 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001039 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001040 std::make_unique<RefreshRateConfigs>(m60_90Device,
1041 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001042
Ady Abrahamdfd62162020-06-10 16:11:56 -07001043 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1044 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001045
Ady Abrahamdfd62162020-06-10 16:11:56 -07001046 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1047 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001048
1049 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1050 LayerRequirement{.weight = 1.0f}};
1051 auto& lr1 = layers[0];
1052 auto& lr2 = layers[1];
1053
1054 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1055 lr1.desiredRefreshRate = 60.0f;
1056 lr1.name = "60Hz ExplicitExactOrMultiple";
1057 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001058 lr2.desiredRefreshRate = 60.0f;
1059 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001060 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1061 &consideredSignals);
1062 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001063
1064 lr1.vote = LayerVoteType::ExplicitDefault;
1065 lr1.desiredRefreshRate = 60.0f;
1066 lr1.name = "60Hz ExplicitExactOrMultiple";
1067 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001068 lr2.desiredRefreshRate = 60.0f;
1069 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001070 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1071 &consideredSignals);
1072 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001073
1074 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1075 lr1.desiredRefreshRate = 60.0f;
1076 lr1.name = "60Hz ExplicitExactOrMultiple";
1077 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001078 lr2.desiredRefreshRate = 60.0f;
1079 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1081 &consideredSignals);
1082 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001083
1084 lr1.vote = LayerVoteType::ExplicitDefault;
1085 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001086 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001087 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001088 lr2.desiredRefreshRate = 60.0f;
1089 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001090 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1091 &consideredSignals);
1092 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001093}
1094
Steven Thomasbb374322020-04-28 22:47:16 -07001095TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001096 auto refreshRateConfigs =
1097 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1098 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001099
1100 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1101 auto& lr = layers[0];
1102
1103 // Prepare a table with the vote and the expected refresh rate
1104 const std::vector<std::pair<float, float>> testCases = {
1105 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1106
1107 {100, 90}, {90, 90}, {89, 90},
1108
1109 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1110
1111 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1112
1113 {55, 90}, {50, 90}, {45, 90},
1114
1115 {42, 120}, {40, 120}, {39, 120},
1116
1117 {37, 72}, {36, 72}, {35, 72},
1118
1119 {30, 60},
1120 };
1121
1122 for (const auto& test : testCases) {
1123 lr.vote = LayerVoteType::ExplicitDefault;
1124 lr.desiredRefreshRate = test.first;
1125
1126 std::stringstream ss;
1127 ss << "ExplicitDefault " << test.first << " fps";
1128 lr.name = ss.str();
1129
1130 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001131 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamabc27602020-04-08 17:20:29 -07001132 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001133 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1134 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001135}
1136
Alec Mouri11232a22020-05-14 18:06:25 -07001137TEST_F(RefreshRateConfigsTest,
1138 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1139 auto refreshRateConfigs =
1140 std::make_unique<RefreshRateConfigs>(m60_90Device,
1141 /*currentConfigId=*/HWC_CONFIG_ID_90);
1142
1143 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1144 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1145 0);
1146
1147 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1148 auto& lr = layers[0];
1149
Ady Abrahamdfd62162020-06-10 16:11:56 -07001150 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001151 lr.vote = LayerVoteType::ExplicitDefault;
1152 lr.desiredRefreshRate = 60.0f;
1153 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001154 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001155 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001156 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1157 &consideredSignals));
1158 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001159}
1160
1161TEST_F(RefreshRateConfigsTest,
1162 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1163 auto refreshRateConfigs =
1164 std::make_unique<RefreshRateConfigs>(m60_90Device,
1165 /*currentConfigId=*/HWC_CONFIG_ID_60);
1166
1167 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1168 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1169 0);
1170
1171 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1172 auto& lr = layers[0];
1173
Alec Mouri11232a22020-05-14 18:06:25 -07001174 lr.vote = LayerVoteType::ExplicitDefault;
1175 lr.desiredRefreshRate = 90.0f;
1176 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001177 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001178 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001179 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001180}
1181
1182TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001183 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001184 auto refreshRateConfigs =
1185 std::make_unique<RefreshRateConfigs>(m60_90Device,
1186 /*currentConfigId=*/HWC_CONFIG_ID_90);
1187
1188 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1189 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1190 0);
1191
Ady Abrahamdfd62162020-06-10 16:11:56 -07001192 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001193 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001194 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1195 &consideredSignals));
1196 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001197
1198 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1199 auto& lr = layers[0];
1200
1201 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1202 lr.desiredRefreshRate = 60.0f;
1203 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001204 lr.focused = false;
1205 EXPECT_EQ(mExpected90Config,
1206 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1207
1208 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001209 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001210 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001211
1212 lr.vote = LayerVoteType::ExplicitDefault;
1213 lr.desiredRefreshRate = 60.0f;
1214 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001215 lr.focused = false;
1216 EXPECT_EQ(mExpected90Config,
1217 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1218
1219 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001220 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001221 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001222
1223 lr.vote = LayerVoteType::Heuristic;
1224 lr.desiredRefreshRate = 60.0f;
1225 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001226 lr.focused = false;
1227 EXPECT_EQ(mExpected90Config,
1228 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1229
1230 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001231 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001232 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001233
1234 lr.vote = LayerVoteType::Max;
1235 lr.desiredRefreshRate = 60.0f;
1236 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001237 lr.focused = false;
1238 EXPECT_EQ(mExpected90Config,
1239 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1240
1241 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001242 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001243 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001244
1245 lr.vote = LayerVoteType::Min;
1246 lr.desiredRefreshRate = 60.0f;
1247 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001248 lr.focused = false;
1249 EXPECT_EQ(mExpected90Config,
1250 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1251
1252 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001253 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001254 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001255}
1256
Steven Thomasd4071902020-03-24 16:02:53 -07001257TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001258 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001259 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1260 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001261
1262 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1263 auto& layer = layers[0];
1264 layer.vote = LayerVoteType::ExplicitDefault;
1265 layer.desiredRefreshRate = 90.0f;
Marin Shalamanov46084422020-10-13 12:33:42 +02001266 layer.shouldBeSeamless = false;
Steven Thomasd4071902020-03-24 16:02:53 -07001267 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001268 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001269
Steven Thomasd4071902020-03-24 16:02:53 -07001270 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001271 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001272 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001273
1274 RefreshRateConfigs::Policy policy;
1275 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1276 policy.allowGroupSwitching = true;
1277 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1278 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001279 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001280 .getConfigId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001281
1282 // Verify that we won't change the group if seamless switch is required.
1283 layer.shouldBeSeamless = true;
1284 ASSERT_EQ(HWC_CONFIG_ID_60,
1285 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1286 .getConfigId());
1287
1288 // At this point the default config in the DisplayManager policy with be 60Hz.
1289 // Verify that if the current config is in another group and there are no layers with
1290 // shouldBeSeamless=false we'll go back to the default group.
1291 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1292 layer.desiredRefreshRate = 60.0f;
1293 layer.name = "60Hz ExplicitDefault";
1294 layer.shouldBeSeamless = true;
1295 ASSERT_EQ(HWC_CONFIG_ID_60,
1296 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1297 .getConfigId());
1298
1299 // If there's a layer with shouldBeSeamless=false, another layer with shouldBeSeamless=true
1300 // can't change the config group.
1301 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1302 auto layer2 = LayerRequirement{.weight = 0.5f};
1303 layer2.vote = LayerVoteType::ExplicitDefault;
1304 layer2.desiredRefreshRate = 90.0f;
1305 layer2.name = "90Hz ExplicitDefault";
1306 layer2.shouldBeSeamless = false;
1307 layer2.focused = false;
1308 layers.push_back(layer2);
1309 ASSERT_EQ(HWC_CONFIG_ID_90,
1310 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1311 .getConfigId());
1312}
1313
1314TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1315 auto refreshRateConfigs =
1316 std::make_unique<RefreshRateConfigs>(m30_60Device,
1317 /*currentConfigId=*/HWC_CONFIG_ID_60);
1318
1319 // Allow group switching.
1320 RefreshRateConfigs::Policy policy;
1321 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1322 policy.allowGroupSwitching = true;
1323 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1324
1325 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1326 auto& layer = layers[0];
1327 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
1328 layer.desiredRefreshRate = 60.0f;
1329 layer.shouldBeSeamless = false;
1330 layer.name = "60Hz ExplicitExactOrMultiple";
1331 layer.focused = true;
1332
1333 ASSERT_EQ(HWC_CONFIG_ID_60,
1334 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1335 .getConfigId());
1336
1337 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_120);
1338 ASSERT_EQ(HWC_CONFIG_ID_120,
1339 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1340 .getConfigId());
1341}
1342
1343TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1344 auto refreshRateConfigs =
1345 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1346 /*currentConfigId=*/HWC_CONFIG_ID_60);
1347
1348 // Allow group switching.
1349 RefreshRateConfigs::Policy policy;
1350 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1351 policy.allowGroupSwitching = true;
1352 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1353
1354 auto layers = std::vector<
1355 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1356 .vote = LayerVoteType::ExplicitDefault,
1357 .desiredRefreshRate = 60.0f,
1358 .shouldBeSeamless = false,
1359 .weight = 0.5f,
1360 .focused = false},
1361 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1362 .vote = LayerVoteType::ExplicitExactOrMultiple,
1363 .desiredRefreshRate = 25.0f,
1364 .shouldBeSeamless = true,
1365 .weight = 1.0f,
1366 .focused = true}};
1367 auto& seamedLayer = layers[0];
1368
1369 ASSERT_EQ(HWC_CONFIG_ID_50,
1370 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1371 .getConfigId());
1372
1373 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = 30.0f;
1374 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_30);
1375
1376 ASSERT_EQ(HWC_CONFIG_ID_25,
1377 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1378 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001379}
1380
Steven Thomasf734df42020-04-13 21:09:28 -07001381TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1382 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001383 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001384 /*currentConfigId=*/HWC_CONFIG_ID_60);
1385
1386 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1387 layers[0].name = "Test layer";
1388
Steven Thomasbb374322020-04-28 22:47:16 -07001389 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001390 // given voteType and fps.
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001391 auto getFrameRate = [&](LayerVoteType voteType, float fps, bool touchActive = false,
1392 bool focused = true) -> HwcConfigIndexType {
Steven Thomasf734df42020-04-13 21:09:28 -07001393 layers[0].vote = voteType;
1394 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001395 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001396 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001397 .getConfigId();
1398 };
1399
1400 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001401 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001402 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001403 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001404 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001405 .getConfigId());
1406 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001407 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001408 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1409 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1410 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
Ady Abraham20c029c2020-07-06 12:58:05 -07001411 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001412
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001413 // Layers not focused are not allowed to override primary config
1414 EXPECT_EQ(HWC_CONFIG_ID_60,
1415 getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/false,
1416 /*focused=*/false));
1417 EXPECT_EQ(HWC_CONFIG_ID_60,
1418 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/false,
1419 /*focused=*/false));
1420
Steven Thomasf734df42020-04-13 21:09:28 -07001421 // Touch boost should be restricted to the primary range.
1422 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1423 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1424 // shouldn't drag us back down to the primary range max.
1425 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001426 EXPECT_EQ(HWC_CONFIG_ID_60,
Steven Thomasf734df42020-04-13 21:09:28 -07001427 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1428
1429 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1430 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1431 0);
1432 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1433 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1434 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1435 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1436 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1437 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1438}
1439
Steven Thomasbb374322020-04-28 22:47:16 -07001440TEST_F(RefreshRateConfigsTest, idle) {
1441 auto refreshRateConfigs =
1442 std::make_unique<RefreshRateConfigs>(m60_90Device,
1443 /*currentConfigId=*/HWC_CONFIG_ID_60);
1444
1445 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1446 layers[0].name = "Test layer";
1447
Ady Abrahamdfd62162020-06-10 16:11:56 -07001448 const auto getIdleFrameRate = [&](LayerVoteType voteType,
1449 bool touchActive) -> HwcConfigIndexType {
Steven Thomasbb374322020-04-28 22:47:16 -07001450 layers[0].vote = voteType;
1451 layers[0].desiredRefreshRate = 90.f;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001452 RefreshRateConfigs::GlobalSignals consideredSignals;
1453 const auto configId =
1454 refreshRateConfigs
1455 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1456 &consideredSignals)
1457 .getConfigId();
1458 // Refresh rate will be chosen by either touch state or idle state
1459 EXPECT_EQ(!touchActive, consideredSignals.idle);
1460 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001461 };
1462
1463 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1464 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1465 0);
1466
1467 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001468 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1469 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1470 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1471 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1472 EXPECT_EQ(HWC_CONFIG_ID_90,
1473 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1474 EXPECT_EQ(HWC_CONFIG_ID_90,
1475 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001476
1477 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001478 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001479 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001480 .getConfigId());
1481
1482 // Idle should be higher precedence than other layer frame rate considerations.
1483 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001484 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1485 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1486 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1487 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1488 EXPECT_EQ(HWC_CONFIG_ID_60,
1489 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1490 EXPECT_EQ(HWC_CONFIG_ID_60,
1491 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001492
1493 // Idle should be applied rather than the current config when there are no layers.
1494 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001495 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001496 .getConfigId());
1497}
1498
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001499TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1500 auto refreshRateConfigs =
1501 std::make_unique<RefreshRateConfigs>(m60_90Device,
1502 /*currentConfigId=*/HWC_CONFIG_ID_60);
1503
1504 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
1505 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, fps);
1506 float expectedFrameRate;
1507 if (fps < 26.91f) {
1508 expectedFrameRate = 24.0f;
1509 } else if (fps < 37.51f) {
1510 expectedFrameRate = 30.0f;
1511 } else if (fps < 52.51f) {
1512 expectedFrameRate = 45.0f;
1513 } else if (fps < 66.01f) {
1514 expectedFrameRate = 60.0f;
1515 } else if (fps < 81.01f) {
1516 expectedFrameRate = 72.0f;
1517 } else {
1518 expectedFrameRate = 90.0f;
1519 }
1520 EXPECT_FLOAT_EQ(expectedFrameRate, knownFrameRate)
1521 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1522 }
1523}
1524
1525TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001526 auto refreshRateConfigs =
1527 std::make_unique<RefreshRateConfigs>(m60_90Device,
1528 /*currentConfigId=*/HWC_CONFIG_ID_60);
1529
1530 struct ExpectedRate {
1531 float rate;
1532 const RefreshRate& expected;
1533 };
1534
1535 /* clang-format off */
1536 std::vector<ExpectedRate> knownFrameRatesExpectations = {
1537 {24.0f, mExpected60Config},
1538 {30.0f, mExpected60Config},
1539 {45.0f, mExpected90Config},
1540 {60.0f, mExpected60Config},
1541 {72.0f, mExpected90Config},
1542 {90.0f, mExpected90Config},
1543 };
1544 /* clang-format on */
1545
1546 // Make sure the test tests all the known frame rate
1547 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
1548 const auto equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1549 knownFrameRatesExpectations.begin(),
1550 [](float a, const ExpectedRate& b) { return a == b.rate; });
1551 EXPECT_TRUE(equal);
1552
1553 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1554 auto& layer = layers[0];
1555 layer.vote = LayerVoteType::Heuristic;
1556 for (const auto& expectedRate : knownFrameRatesExpectations) {
1557 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001558 const auto& refreshRate =
1559 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001560 EXPECT_EQ(expectedRate.expected, refreshRate);
1561 }
1562}
1563
Ana Krulecb9afd792020-06-11 13:16:15 -07001564TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1565 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1566 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1567 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1568}
1569
1570TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1571 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1572
1573 auto refreshRateConfigs =
1574 std::make_unique<RefreshRateConfigs>(m60_90Device,
1575 /*currentConfigId=*/HWC_CONFIG_ID_90);
1576 // SetPolicy(60, 90), current 90Hz => TurnOn.
1577 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1578
1579 // SetPolicy(60, 90), current 60Hz => TurnOn.
1580 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 90}}), 0);
1581 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1582
1583 // SetPolicy(60, 60), current 60Hz => NoChange, avoid extra calls.
1584 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
1585 EXPECT_EQ(KernelIdleTimerAction::NoChange, refreshRateConfigs->getIdleTimerAction());
1586
1587 // SetPolicy(90, 90), current 90Hz => TurnOff.
1588 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
1589 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1590}
1591
Ady Abraham0bb6a472020-10-12 10:22:13 -07001592TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUnknownUid) {
1593 auto refreshRateConfigs =
1594 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1595 /*currentConfigId=*/HWC_CONFIG_ID_30);
1596 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(1234));
1597}
1598
1599TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUid) {
1600 auto refreshRateConfigs =
1601 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1602 /*currentConfigId=*/HWC_CONFIG_ID_30);
1603 const uid_t uid = 1234;
Ady Abraham62f216c2020-10-13 19:07:23 -07001604 refreshRateConfigs->setPreferredRefreshRateForUid({uid, 30});
Ady Abraham0bb6a472020-10-12 10:22:13 -07001605 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1606
1607 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60);
1608 EXPECT_EQ(2, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1609
1610 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_72);
1611 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1612
1613 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1614 EXPECT_EQ(3, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1615
1616 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_120);
1617 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDividerForUid(uid));
Ady Abraham62f216c2020-10-13 19:07:23 -07001618
1619 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1620 refreshRateConfigs->setPreferredRefreshRateForUid({uid, 22.5});
1621 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1622 refreshRateConfigs->setPreferredRefreshRateForUid({uid, 22.6f});
1623 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDividerForUid(uid));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001624}
1625
Alec Mouri0a1cc962019-03-14 12:33:02 -07001626} // namespace
1627} // namespace scheduler
1628} // namespace android