blob: 4762fd4b668d88cfabce209cf2d10eea3a997360 [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);
60
61 // Test configs
62 std::shared_ptr<const HWC2::Display::Config> mConfig60 =
63 createConfig(HWC_CONFIG_ID_60, 0, static_cast<int64_t>(1e9f / 60));
64 std::shared_ptr<const HWC2::Display::Config> mConfig90 =
65 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90));
66 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentGroup =
67 createConfig(HWC_CONFIG_ID_90, 1, static_cast<int64_t>(1e9f / 90));
68 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentResolution =
69 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90), 111, 222);
70 std::shared_ptr<const HWC2::Display::Config> mConfig72 =
71 createConfig(HWC_CONFIG_ID_72, 0, static_cast<int64_t>(1e9f / 72));
72 std::shared_ptr<const HWC2::Display::Config> mConfig72DifferentGroup =
73 createConfig(HWC_CONFIG_ID_72, 1, static_cast<int64_t>(1e9f / 72));
74 std::shared_ptr<const HWC2::Display::Config> mConfig120 =
75 createConfig(HWC_CONFIG_ID_120, 0, static_cast<int64_t>(1e9f / 120));
76 std::shared_ptr<const HWC2::Display::Config> mConfig120DifferentGroup =
77 createConfig(HWC_CONFIG_ID_120, 1, static_cast<int64_t>(1e9f / 120));
78 std::shared_ptr<const HWC2::Display::Config> mConfig30 =
79 createConfig(HWC_CONFIG_ID_30, 0, static_cast<int64_t>(1e9f / 30));
80
81 // Test device configurations
82 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60OnlyConfigDevice = {mConfig60};
83 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90Device = {mConfig60, mConfig90};
84 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentGroups =
85 {mConfig60, mConfig90DifferentGroup};
86 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentResolutions =
87 {mConfig60, mConfig90DifferentResolution};
88 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_72_90Device = {mConfig60,
89 mConfig90,
90 mConfig72};
91 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90_72_120Device = {mConfig60,
92 mConfig90,
93 mConfig72,
94 mConfig120};
95 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90_120Device = {mConfig60,
96 mConfig90,
97 mConfig72,
98 mConfig120,
99 mConfig30};
100 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60Device =
101 {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup, mConfig120DifferentGroup,
102 mConfig30};
103 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90Device =
104 {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup, mConfig30};
105 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_90Device =
106 {mConfig60, mConfig90, mConfig72DifferentGroup, mConfig120DifferentGroup, mConfig30};
107
108 // Expected RefreshRate objects
109 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, "60fps", 60,
110 RefreshRate::ConstructorTag(0)};
111 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
112 createConfig(HWC_CONFIG_ID_60, 0, 16666665), "60fps", 60,
113 RefreshRate::ConstructorTag(0)};
114 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, "90fps", 90,
115 RefreshRate::ConstructorTag(0)};
116 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
117 "90fps", 90, RefreshRate::ConstructorTag(0)};
118 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
119 mConfig90DifferentResolution, "90fps", 90,
120 RefreshRate::ConstructorTag(0)};
121 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, "72fps", 72,
122 RefreshRate::ConstructorTag(0)};
123 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, "30fps", 30,
124 RefreshRate::ConstructorTag(0)};
125 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, "120fps", 120,
126 RefreshRate::ConstructorTag(0)};
127
128 Hwc2::mock::Display mDisplay;
129
130private:
131 std::shared_ptr<const HWC2::Display::Config> createConfig(HwcConfigIndexType configId,
132 int32_t configGroup,
133 int64_t vsyncPeriod,
134 int32_t hight = -1,
135 int32_t width = -1);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700136};
137
Ady Abrahamabc27602020-04-08 17:20:29 -0700138using Builder = HWC2::Display::Config::Builder;
139
Alec Mouri0a1cc962019-03-14 12:33:02 -0700140RefreshRateConfigsTest::RefreshRateConfigsTest() {
141 const ::testing::TestInfo* const test_info =
142 ::testing::UnitTest::GetInstance()->current_test_info();
143 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
144}
145
146RefreshRateConfigsTest::~RefreshRateConfigsTest() {
147 const ::testing::TestInfo* const test_info =
148 ::testing::UnitTest::GetInstance()->current_test_info();
149 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
150}
151
Ady Abrahamabc27602020-04-08 17:20:29 -0700152std::shared_ptr<const HWC2::Display::Config> RefreshRateConfigsTest::createConfig(
153 HwcConfigIndexType configId, int32_t configGroup, int64_t vsyncPeriod, int32_t hight,
154 int32_t width) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700155 return HWC2::Display::Config::Builder(mDisplay, hal::HWConfigId(configId.value()))
Ady Abrahamabc27602020-04-08 17:20:29 -0700156 .setVsyncPeriod(int32_t(vsyncPeriod))
157 .setConfigGroup(configGroup)
158 .setHeight(hight)
159 .setWidth(width)
160 .build();
161}
162
Alec Mouri0a1cc962019-03-14 12:33:02 -0700163namespace {
164/* ------------------------------------------------------------------------
165 * Test cases
166 */
Ady Abraham2139f732019-11-13 18:56:40 -0800167TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700168 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700169 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
170 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700171}
172
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100173TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100174 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700175 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
176 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasf734df42020-04-13 21:09:28 -0700177 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HwcConfigIndexType(10), {60, 60}}), 0);
178 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {20, 40}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100179}
180
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700181TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700182 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700183 std::make_unique<RefreshRateConfigs>(m60_90Device,
184 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700185
Ady Abraham2e1dd892020-03-05 13:48:36 -0800186 const auto& minRate = refreshRateConfigs->getMinRefreshRate();
187 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188
Ady Abrahamabc27602020-04-08 17:20:29 -0700189 ASSERT_EQ(mExpected60Config, minRate);
190 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800191
Ady Abraham2e1dd892020-03-05 13:48:36 -0800192 const auto& minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
193 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800194 ASSERT_EQ(minRateByPolicy, minRate);
195 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700196}
Ady Abraham2139f732019-11-13 18:56:40 -0800197
198TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800199 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700200 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
201 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800202
Ady Abraham2e1dd892020-03-05 13:48:36 -0800203 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
204 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
205 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
206 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800207
Ady Abrahamabc27602020-04-08 17:20:29 -0700208 ASSERT_EQ(mExpected60Config, minRate);
209 ASSERT_EQ(mExpected60Config, minRate60);
210 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800211
Steven Thomasf734df42020-04-13 21:09:28 -0700212 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800213 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
214
Ady Abraham2e1dd892020-03-05 13:48:36 -0800215 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
216 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800217
Ady Abrahamabc27602020-04-08 17:20:29 -0700218 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
219 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
220 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
221}
222
223TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
224 auto refreshRateConfigs =
225 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
226 /*currentConfigId=*/HWC_CONFIG_ID_60);
227
228 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
229 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
230 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
231 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
232
233 ASSERT_EQ(mExpected60Config, minRate);
234 ASSERT_EQ(mExpected60Config, minRate60);
235 ASSERT_EQ(mExpected60Config, performanceRate60);
236
Steven Thomasf734df42020-04-13 21:09:28 -0700237 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700238 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
239
240 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
241 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
242
243 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
244 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
245 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800246}
247
248TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800249 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700250 std::make_unique<RefreshRateConfigs>(m60_90Device,
251 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800252
Ady Abraham2e1dd892020-03-05 13:48:36 -0800253 auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
254 auto& performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800255
Ady Abrahamabc27602020-04-08 17:20:29 -0700256 ASSERT_EQ(mExpected60Config, minRate);
257 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800258
Steven Thomasf734df42020-04-13 21:09:28 -0700259 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800260
Ady Abraham2e1dd892020-03-05 13:48:36 -0800261 auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
262 auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700263 ASSERT_EQ(mExpected60Config, minRate60);
264 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800265}
266
267TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800268 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700269 std::make_unique<RefreshRateConfigs>(m60_90Device,
270 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800271 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800272 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700273 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800274 }
275
276 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
277 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800278 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700279 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800280 }
281
Steven Thomasf734df42020-04-13 21:09:28 -0700282 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800283 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800284 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700285 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800286 }
287}
288
289TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
Ady Abraham2139f732019-11-13 18:56:40 -0800290 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700291 std::make_unique<RefreshRateConfigs>(m60_90Device,
292 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800293
Ady Abraham8a82ba62020-01-17 12:43:17 -0800294 const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> {
Ady Abrahamaae5ed52020-06-26 09:32:43 -0700295 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, /*weight*/ 1.0f,
296 /*focused*/ false}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297 };
298
Ady Abrahamabc27602020-04-08 17:20:29 -0700299 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800300 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700301 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800302 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700303 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800304 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700305 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800306 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700307 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800308 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800309
Steven Thomasf734df42020-04-13 21:09:28 -0700310 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700311 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800312 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700313 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800314 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700315 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800316 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700317 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800318 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700319 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800320 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800321
Steven Thomasf734df42020-04-13 21:09:28 -0700322 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700323 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800324 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700325 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800326 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700327 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800328 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700329 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800330 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700331 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800332 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Steven Thomasf734df42020-04-13 21:09:28 -0700333 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700334 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800335 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700336 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800337 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700338 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800339 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700340 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800341 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700342 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800343 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
344}
345
Steven Thomasbb374322020-04-28 22:47:16 -0700346TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700347 auto refreshRateConfigs =
348 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
349 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800350
Steven Thomasdebafed2020-05-18 17:30:35 -0700351 // If there are no layers we select the default frame rate, which is the max of the primary
352 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800353 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700354 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700355 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800356
Steven Thomasdebafed2020-05-18 17:30:35 -0700357 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700358 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700359 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800360}
361
Steven Thomasbb374322020-04-28 22:47:16 -0700362TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800363 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700364 std::make_unique<RefreshRateConfigs>(m60_90Device,
365 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
367 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
368 auto& lr = layers[0];
369
370 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800371 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700372 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
375 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800376 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700377 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700378 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
380 lr.desiredRefreshRate = 90.0f;
381 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800382 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700383 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700384 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
386 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
391 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800392 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700393 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700394 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
396 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800397 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700398 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700399 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
401 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800402 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700403 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700404 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800406 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700407 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
409 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700410 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700411 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
413 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700414 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700415 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
417 lr.desiredRefreshRate = 90.0f;
418 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700419 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700420 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
422 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700423 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700424 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800425
426 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700427 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700428 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
430 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700431 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700432 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800433
434 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700435 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700436 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
Steven Thomasf734df42020-04-13 21:09:28 -0700438 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
440 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700442 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
444 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700445 EXPECT_EQ(mExpected90Config,
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 = 90.0f;
449 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700450 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700451 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
453 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700454 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700455 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
457 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700458 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700459 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460
461 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700462 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700463 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464
465 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700466 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700467 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800468
Steven Thomasf734df42020-04-13 21:09:28 -0700469 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
474 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700475 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
478 lr.desiredRefreshRate = 90.0f;
479 lr.vote = LayerVoteType::Heuristic;
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 = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700484 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700485 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486
487 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700488 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700489 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490
491 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700492 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700493 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494
495 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700496 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700497 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498}
499
Steven Thomasbb374322020-04-28 22:47:16 -0700500TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700502 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
503 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800504
505 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
506 auto& lr = layers[0];
507
508 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700509 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700510 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800511
512 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700513 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700514 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800515
516 lr.desiredRefreshRate = 90.0f;
517 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700518 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700519 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800520
521 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700522 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700523 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800524
525 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700526 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700527 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800528
529 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700530 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700531 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532
533 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700534 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700535 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800536}
537
Steven Thomasbb374322020-04-28 22:47:16 -0700538TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800539 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700540 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
541 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800542
543 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
544 LayerRequirement{.weight = 1.0f}};
545 auto& lr1 = layers[0];
546 auto& lr2 = layers[1];
547
548 lr1.desiredRefreshRate = 24.0f;
549 lr1.vote = LayerVoteType::Heuristic;
550 lr2.desiredRefreshRate = 60.0f;
551 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700552 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700553 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554
555 lr1.desiredRefreshRate = 24.0f;
556 lr1.vote = LayerVoteType::Heuristic;
557 lr2.desiredRefreshRate = 48.0f;
558 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700559 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700560 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561
562 lr1.desiredRefreshRate = 24.0f;
563 lr1.vote = LayerVoteType::Heuristic;
564 lr2.desiredRefreshRate = 48.0f;
565 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700566 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700567 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800568}
569
Steven Thomasbb374322020-04-28 22:47:16 -0700570TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700572 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
573 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800574
575 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
576 LayerRequirement{.weight = 1.0f}};
577 auto& lr1 = layers[0];
578 auto& lr2 = layers[1];
579
580 lr1.desiredRefreshRate = 24.0f;
581 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800582 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800583 lr2.desiredRefreshRate = 60.0f;
584 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800585 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700586 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700587 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800588
589 lr1.desiredRefreshRate = 24.0f;
590 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800591 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800592 lr2.desiredRefreshRate = 60.0f;
593 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800594 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700595 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700596 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800597
598 lr1.desiredRefreshRate = 24.0f;
599 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800600 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800601 lr2.desiredRefreshRate = 60.0f;
602 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800603 lr2.name = "60Hz ExplicitDefault";
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 = 90.0f;
611 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700613 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700614 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800615
616 lr1.desiredRefreshRate = 24.0f;
617 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
618 lr1.name = "24Hz ExplicitExactOrMultiple";
619 lr2.desiredRefreshRate = 90.0f;
620 lr2.vote = LayerVoteType::ExplicitDefault;
621 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700622 EXPECT_EQ(mExpected72Config,
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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800627 lr1.name = "24Hz ExplicitDefault";
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 Abraham71c437d2020-01-31 15:56:57 -0800633
634 lr1.desiredRefreshRate = 24.0f;
635 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr2.desiredRefreshRate = 90.0f;
638 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr2.name = "90Hz ExplicitDefault";
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::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800645 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr2.desiredRefreshRate = 90.0f;
647 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800648 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700649 EXPECT_EQ(mExpected72Config,
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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800654 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800655 lr2.desiredRefreshRate = 90.0f;
656 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800657 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700658 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700659 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800660}
661
Steven Thomasbb374322020-04-28 22:47:16 -0700662TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800663 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700664 std::make_unique<RefreshRateConfigs>(m30_60Device,
665 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800666
667 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
668 auto& lr = layers[0];
669
670 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700671 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700672 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800673
674 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700675 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700676 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800677
678 lr.desiredRefreshRate = 90.0f;
679 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700680 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700681 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800682
683 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700684 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700685 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800686
687 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700688 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700689 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800690
691 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700692 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700693 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800694
695 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700696 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700697 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800698}
699
Steven Thomasbb374322020-04-28 22:47:16 -0700700TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800701 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700702 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
703 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800704
705 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
706 auto& lr = layers[0];
707
708 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800709 lr.name = "Min";
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.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800714 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700715 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700716 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800717
718 lr.desiredRefreshRate = 90.0f;
719 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800720 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700721 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700722 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800723
724 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800725 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700726 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700727 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700728 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700729 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800730
731 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800732 lr.name = "45Hz Heuristic";
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 Abrahamabc27602020-04-08 17:20:29 -0700735 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700736 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800737
738 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800739 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700740 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700741 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700742 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700743 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
745 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800746 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700747 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700748 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700749 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700750 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800751
752 lr.desiredRefreshRate = 24.0f;
753 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
754 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700755 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700756 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700757 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700758 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800759}
760
Steven Thomasbb374322020-04-28 22:47:16 -0700761TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800762 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700763 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
764 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800765
766 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
767 LayerRequirement{.weight = 1.0f}};
768 auto& lr1 = layers[0];
769 auto& lr2 = layers[1];
770
771 lr1.vote = LayerVoteType::Min;
772 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700773 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700774 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
776 lr1.vote = LayerVoteType::Min;
777 lr2.vote = LayerVoteType::Heuristic;
778 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700779 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700780 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800781
782 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800783 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800784 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700785 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700786 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800787
788 lr1.vote = LayerVoteType::Max;
789 lr2.vote = LayerVoteType::Heuristic;
790 lr2.desiredRefreshRate = 60.0f;
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::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800795 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700797 EXPECT_EQ(mExpected90Config,
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::Heuristic;
801 lr1.desiredRefreshRate = 15.0f;
802 lr2.vote = LayerVoteType::Heuristic;
803 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700804 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700805 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806
807 lr1.vote = LayerVoteType::Heuristic;
808 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800809 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700811 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700812 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813}
814
Steven Thomasbb374322020-04-28 22:47:16 -0700815TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700817 std::make_unique<RefreshRateConfigs>(m60_90Device,
818 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
820 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
821 auto& lr = layers[0];
822
Ady Abraham71c437d2020-01-31 15:56:57 -0800823 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
825 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800826 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700827 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700828 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829 }
830}
831
832TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800833 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700834 std::make_unique<RefreshRateConfigs>(m60_90Device,
835 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800836
837 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
838 LayerRequirement{.weight = 1.0f}};
839 auto& lr1 = layers[0];
840 auto& lr2 = layers[1];
841
842 lr1.vote = LayerVoteType::Heuristic;
843 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800844 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700846 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847
848 lr1.vote = LayerVoteType::Heuristic;
849 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800850 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800851 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700852 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853}
854
Steven Thomasbb374322020-04-28 22:47:16 -0700855TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800856 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700857 std::make_unique<RefreshRateConfigs>(m60_90Device,
858 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800859
860 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
861 LayerRequirement{.weight = 1.0f}};
862 auto& lr1 = layers[0];
863 auto& lr2 = layers[1];
864
865 lr1.vote = LayerVoteType::Heuristic;
866 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800867 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800868 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700869 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800871
872 lr1.vote = LayerVoteType::ExplicitDefault;
873 lr1.desiredRefreshRate = 90.0f;
874 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
875 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700876 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700877 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800878
879 lr1.vote = LayerVoteType::Heuristic;
880 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800881 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800882 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700883 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700884 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800885}
886
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800887TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700888 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
889 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
890 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
891 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
892 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800893}
894
Steven Thomasbb374322020-04-28 22:47:16 -0700895TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800896 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700897 std::make_unique<RefreshRateConfigs>(m60_90Device,
898 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800899
900 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
901 auto& lr = layers[0];
902
Ady Abraham71c437d2020-01-31 15:56:57 -0800903 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800904 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
905 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800906 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700907 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700908 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800909 }
910}
911
Steven Thomasbb374322020-04-28 22:47:16 -0700912TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800913 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700914 std::make_unique<RefreshRateConfigs>(m60_90Device,
915 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800916
917 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
918 LayerRequirement{.weight = 1.0f}};
919 auto& lr1 = layers[0];
920 auto& lr2 = layers[1];
921
922 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
923 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800924 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800925 lr2.vote = LayerVoteType::Heuristic;
926 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800927 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700928 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700929 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800930
931 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
932 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800933 lr1.name = "60Hz ExplicitExactOrMultiple";
934 lr2.vote = LayerVoteType::ExplicitDefault;
935 lr2.desiredRefreshRate = 90.0f;
936 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700937 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700938 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800939
940 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
941 lr1.desiredRefreshRate = 60.0f;
942 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800943 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800944 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700945 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700946 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800947
948 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
949 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800950 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800951 lr2.vote = LayerVoteType::Heuristic;
952 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800953 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700954 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700955 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800956
957 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
958 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800959 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800960 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800961 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700962 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700963 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800964}
965
966TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800967 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700968 std::make_unique<RefreshRateConfigs>(m60_90Device,
969 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800970
971 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
972 LayerRequirement{.weight = 1.0f}};
973 auto& lr1 = layers[0];
974 auto& lr2 = layers[1];
975
976 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
977 lr1.desiredRefreshRate = 60.0f;
978 lr1.name = "60Hz ExplicitExactOrMultiple";
979 lr2.vote = LayerVoteType::NoVote;
980 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700981 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700982 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800983
984 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
985 lr1.desiredRefreshRate = 60.0f;
986 lr1.name = "60Hz ExplicitExactOrMultiple";
987 lr2.vote = LayerVoteType::NoVote;
988 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700989 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700990 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800991
992 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
993 lr1.desiredRefreshRate = 60.0f;
994 lr1.name = "60Hz ExplicitExactOrMultiple";
995 lr2.vote = LayerVoteType::Max;
996 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700997 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700998 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800999
1000 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1001 lr1.desiredRefreshRate = 60.0f;
1002 lr1.name = "60Hz ExplicitExactOrMultiple";
1003 lr2.vote = LayerVoteType::Max;
1004 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001005 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001006 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001007
1008 // The other layer starts to provide buffers
1009 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1010 lr1.desiredRefreshRate = 60.0f;
1011 lr1.name = "60Hz ExplicitExactOrMultiple";
1012 lr2.vote = LayerVoteType::Heuristic;
1013 lr2.desiredRefreshRate = 90.0f;
1014 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001015 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001016 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001017}
1018
1019TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001020 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001021 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001022 std::make_unique<RefreshRateConfigs>(m60_90Device,
1023 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001024
Ady Abrahamdfd62162020-06-10 16:11:56 -07001025 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1026 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001027
Ady Abrahamdfd62162020-06-10 16:11:56 -07001028 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1029 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001030
1031 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1032 LayerRequirement{.weight = 1.0f}};
1033 auto& lr1 = layers[0];
1034 auto& lr2 = layers[1];
1035
1036 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1037 lr1.desiredRefreshRate = 60.0f;
1038 lr1.name = "60Hz ExplicitExactOrMultiple";
1039 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001040 lr2.desiredRefreshRate = 60.0f;
1041 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001042 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1043 &consideredSignals);
1044 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001045
1046 lr1.vote = LayerVoteType::ExplicitDefault;
1047 lr1.desiredRefreshRate = 60.0f;
1048 lr1.name = "60Hz ExplicitExactOrMultiple";
1049 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001050 lr2.desiredRefreshRate = 60.0f;
1051 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001052 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1053 &consideredSignals);
1054 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001055
1056 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1057 lr1.desiredRefreshRate = 60.0f;
1058 lr1.name = "60Hz ExplicitExactOrMultiple";
1059 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001060 lr2.desiredRefreshRate = 60.0f;
1061 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001062 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1063 &consideredSignals);
1064 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001065
1066 lr1.vote = LayerVoteType::ExplicitDefault;
1067 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001068 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001069 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001070 lr2.desiredRefreshRate = 60.0f;
1071 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001072 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1073 &consideredSignals);
1074 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001075}
1076
Steven Thomasbb374322020-04-28 22:47:16 -07001077TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001078 auto refreshRateConfigs =
1079 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1080 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001081
1082 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1083 auto& lr = layers[0];
1084
1085 // Prepare a table with the vote and the expected refresh rate
1086 const std::vector<std::pair<float, float>> testCases = {
1087 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1088
1089 {100, 90}, {90, 90}, {89, 90},
1090
1091 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1092
1093 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1094
1095 {55, 90}, {50, 90}, {45, 90},
1096
1097 {42, 120}, {40, 120}, {39, 120},
1098
1099 {37, 72}, {36, 72}, {35, 72},
1100
1101 {30, 60},
1102 };
1103
1104 for (const auto& test : testCases) {
1105 lr.vote = LayerVoteType::ExplicitDefault;
1106 lr.desiredRefreshRate = test.first;
1107
1108 std::stringstream ss;
1109 ss << "ExplicitDefault " << test.first << " fps";
1110 lr.name = ss.str();
1111
1112 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001113 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamabc27602020-04-08 17:20:29 -07001114 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001115 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1116 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001117}
1118
Alec Mouri11232a22020-05-14 18:06:25 -07001119TEST_F(RefreshRateConfigsTest,
1120 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1121 auto refreshRateConfigs =
1122 std::make_unique<RefreshRateConfigs>(m60_90Device,
1123 /*currentConfigId=*/HWC_CONFIG_ID_90);
1124
1125 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1126 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1127 0);
1128
1129 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1130 auto& lr = layers[0];
1131
Ady Abrahamdfd62162020-06-10 16:11:56 -07001132 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001133 lr.vote = LayerVoteType::ExplicitDefault;
1134 lr.desiredRefreshRate = 60.0f;
1135 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001136 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001137 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001138 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1139 &consideredSignals));
1140 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001141}
1142
1143TEST_F(RefreshRateConfigsTest,
1144 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1145 auto refreshRateConfigs =
1146 std::make_unique<RefreshRateConfigs>(m60_90Device,
1147 /*currentConfigId=*/HWC_CONFIG_ID_60);
1148
1149 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1150 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1151 0);
1152
1153 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1154 auto& lr = layers[0];
1155
Alec Mouri11232a22020-05-14 18:06:25 -07001156 lr.vote = LayerVoteType::ExplicitDefault;
1157 lr.desiredRefreshRate = 90.0f;
1158 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001159 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001160 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001161 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001162}
1163
1164TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001165 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001166 auto refreshRateConfigs =
1167 std::make_unique<RefreshRateConfigs>(m60_90Device,
1168 /*currentConfigId=*/HWC_CONFIG_ID_90);
1169
1170 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1171 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1172 0);
1173
Ady Abrahamdfd62162020-06-10 16:11:56 -07001174 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001175 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001176 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1177 &consideredSignals));
1178 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001179
1180 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1181 auto& lr = layers[0];
1182
1183 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1184 lr.desiredRefreshRate = 60.0f;
1185 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001186 lr.focused = false;
1187 EXPECT_EQ(mExpected90Config,
1188 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1189
1190 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001191 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001192 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001193
1194 lr.vote = LayerVoteType::ExplicitDefault;
1195 lr.desiredRefreshRate = 60.0f;
1196 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001197 lr.focused = false;
1198 EXPECT_EQ(mExpected90Config,
1199 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1200
1201 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001202 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001203 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001204
1205 lr.vote = LayerVoteType::Heuristic;
1206 lr.desiredRefreshRate = 60.0f;
1207 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001208 lr.focused = false;
1209 EXPECT_EQ(mExpected90Config,
1210 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1211
1212 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001213 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001214 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001215
1216 lr.vote = LayerVoteType::Max;
1217 lr.desiredRefreshRate = 60.0f;
1218 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001219 lr.focused = false;
1220 EXPECT_EQ(mExpected90Config,
1221 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1222
1223 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001224 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001225 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001226
1227 lr.vote = LayerVoteType::Min;
1228 lr.desiredRefreshRate = 60.0f;
1229 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001230 lr.focused = false;
1231 EXPECT_EQ(mExpected90Config,
1232 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1233
1234 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001235 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001236 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001237}
1238
Steven Thomasd4071902020-03-24 16:02:53 -07001239TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001240 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001241 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1242 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001243
1244 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1245 auto& layer = layers[0];
1246 layer.vote = LayerVoteType::ExplicitDefault;
1247 layer.desiredRefreshRate = 90.0f;
1248 layer.name = "90Hz ExplicitDefault";
1249
Steven Thomasd4071902020-03-24 16:02:53 -07001250 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001251 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001252 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001253
1254 RefreshRateConfigs::Policy policy;
1255 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1256 policy.allowGroupSwitching = true;
1257 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1258 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001259 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001260 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001261}
1262
Steven Thomasf734df42020-04-13 21:09:28 -07001263TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1264 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001265 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001266 /*currentConfigId=*/HWC_CONFIG_ID_60);
1267
1268 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1269 layers[0].name = "Test layer";
1270
Steven Thomasbb374322020-04-28 22:47:16 -07001271 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001272 // given voteType and fps.
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001273 auto getFrameRate = [&](LayerVoteType voteType, float fps, bool touchActive = false,
1274 bool focused = true) -> HwcConfigIndexType {
Steven Thomasf734df42020-04-13 21:09:28 -07001275 layers[0].vote = voteType;
1276 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001277 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001278 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001279 .getConfigId();
1280 };
1281
1282 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001283 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001284 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001285 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001286 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001287 .getConfigId());
1288 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001289 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001290 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1291 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1292 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
Ady Abraham20c029c2020-07-06 12:58:05 -07001293 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001294
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001295 // Layers not focused are not allowed to override primary config
1296 EXPECT_EQ(HWC_CONFIG_ID_60,
1297 getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/false,
1298 /*focused=*/false));
1299 EXPECT_EQ(HWC_CONFIG_ID_60,
1300 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/false,
1301 /*focused=*/false));
1302
Steven Thomasf734df42020-04-13 21:09:28 -07001303 // Touch boost should be restricted to the primary range.
1304 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1305 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1306 // shouldn't drag us back down to the primary range max.
1307 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001308 EXPECT_EQ(HWC_CONFIG_ID_60,
Steven Thomasf734df42020-04-13 21:09:28 -07001309 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1310
1311 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1312 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1313 0);
1314 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1315 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1316 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1317 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1318 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1319 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1320}
1321
Steven Thomasbb374322020-04-28 22:47:16 -07001322TEST_F(RefreshRateConfigsTest, idle) {
1323 auto refreshRateConfigs =
1324 std::make_unique<RefreshRateConfigs>(m60_90Device,
1325 /*currentConfigId=*/HWC_CONFIG_ID_60);
1326
1327 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1328 layers[0].name = "Test layer";
1329
Ady Abrahamdfd62162020-06-10 16:11:56 -07001330 const auto getIdleFrameRate = [&](LayerVoteType voteType,
1331 bool touchActive) -> HwcConfigIndexType {
Steven Thomasbb374322020-04-28 22:47:16 -07001332 layers[0].vote = voteType;
1333 layers[0].desiredRefreshRate = 90.f;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001334 RefreshRateConfigs::GlobalSignals consideredSignals;
1335 const auto configId =
1336 refreshRateConfigs
1337 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1338 &consideredSignals)
1339 .getConfigId();
1340 // Refresh rate will be chosen by either touch state or idle state
1341 EXPECT_EQ(!touchActive, consideredSignals.idle);
1342 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001343 };
1344
1345 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1346 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1347 0);
1348
1349 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001350 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1351 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1352 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1353 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1354 EXPECT_EQ(HWC_CONFIG_ID_90,
1355 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1356 EXPECT_EQ(HWC_CONFIG_ID_90,
1357 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001358
1359 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001360 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001361 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001362 .getConfigId());
1363
1364 // Idle should be higher precedence than other layer frame rate considerations.
1365 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001366 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1367 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1368 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1369 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1370 EXPECT_EQ(HWC_CONFIG_ID_60,
1371 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1372 EXPECT_EQ(HWC_CONFIG_ID_60,
1373 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001374
1375 // Idle should be applied rather than the current config when there are no layers.
1376 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001377 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001378 .getConfigId());
1379}
1380
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001381TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1382 auto refreshRateConfigs =
1383 std::make_unique<RefreshRateConfigs>(m60_90Device,
1384 /*currentConfigId=*/HWC_CONFIG_ID_60);
1385
1386 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
1387 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, fps);
1388 float expectedFrameRate;
1389 if (fps < 26.91f) {
1390 expectedFrameRate = 24.0f;
1391 } else if (fps < 37.51f) {
1392 expectedFrameRate = 30.0f;
1393 } else if (fps < 52.51f) {
1394 expectedFrameRate = 45.0f;
1395 } else if (fps < 66.01f) {
1396 expectedFrameRate = 60.0f;
1397 } else if (fps < 81.01f) {
1398 expectedFrameRate = 72.0f;
1399 } else {
1400 expectedFrameRate = 90.0f;
1401 }
1402 EXPECT_FLOAT_EQ(expectedFrameRate, knownFrameRate)
1403 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1404 }
1405}
1406
1407TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001408 auto refreshRateConfigs =
1409 std::make_unique<RefreshRateConfigs>(m60_90Device,
1410 /*currentConfigId=*/HWC_CONFIG_ID_60);
1411
1412 struct ExpectedRate {
1413 float rate;
1414 const RefreshRate& expected;
1415 };
1416
1417 /* clang-format off */
1418 std::vector<ExpectedRate> knownFrameRatesExpectations = {
1419 {24.0f, mExpected60Config},
1420 {30.0f, mExpected60Config},
1421 {45.0f, mExpected90Config},
1422 {60.0f, mExpected60Config},
1423 {72.0f, mExpected90Config},
1424 {90.0f, mExpected90Config},
1425 };
1426 /* clang-format on */
1427
1428 // Make sure the test tests all the known frame rate
1429 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
1430 const auto equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1431 knownFrameRatesExpectations.begin(),
1432 [](float a, const ExpectedRate& b) { return a == b.rate; });
1433 EXPECT_TRUE(equal);
1434
1435 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1436 auto& layer = layers[0];
1437 layer.vote = LayerVoteType::Heuristic;
1438 for (const auto& expectedRate : knownFrameRatesExpectations) {
1439 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001440 const auto& refreshRate =
1441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001442 EXPECT_EQ(expectedRate.expected, refreshRate);
1443 }
1444}
1445
Ana Krulecb9afd792020-06-11 13:16:15 -07001446TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1447 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1448 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1449 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1450}
1451
1452TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1453 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1454
1455 auto refreshRateConfigs =
1456 std::make_unique<RefreshRateConfigs>(m60_90Device,
1457 /*currentConfigId=*/HWC_CONFIG_ID_90);
1458 // SetPolicy(60, 90), current 90Hz => TurnOn.
1459 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1460
1461 // SetPolicy(60, 90), current 60Hz => TurnOn.
1462 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 90}}), 0);
1463 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1464
1465 // SetPolicy(60, 60), current 60Hz => NoChange, avoid extra calls.
1466 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
1467 EXPECT_EQ(KernelIdleTimerAction::NoChange, refreshRateConfigs->getIdleTimerAction());
1468
1469 // SetPolicy(90, 90), current 90Hz => TurnOff.
1470 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
1471 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1472}
1473
Ady Abraham0bb6a472020-10-12 10:22:13 -07001474TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUnknownUid) {
1475 auto refreshRateConfigs =
1476 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1477 /*currentConfigId=*/HWC_CONFIG_ID_30);
1478 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(1234));
1479}
1480
1481TEST_F(RefreshRateConfigsTest, RefreshRateDividerForUid) {
1482 auto refreshRateConfigs =
1483 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1484 /*currentConfigId=*/HWC_CONFIG_ID_30);
1485 const uid_t uid = 1234;
1486 refreshRateConfigs->setPreferredRefreshRateForUid(uid, 30);
1487 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1488
1489 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60);
1490 EXPECT_EQ(2, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1491
1492 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_72);
1493 EXPECT_EQ(1, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1494
1495 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1496 EXPECT_EQ(3, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1497
1498 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_120);
1499 EXPECT_EQ(4, refreshRateConfigs->getRefreshRateDividerForUid(uid));
1500}
1501
Alec Mouri0a1cc962019-03-14 12:33:02 -07001502} // namespace
1503} // namespace scheduler
1504} // namespace android