blob: fed591cb1984af95ba71b04d054c66cb398b7385 [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> {
295 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, 1.0f}};
296 };
297
Ady Abrahamabc27602020-04-08 17:20:29 -0700298 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700300 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800301 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700302 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800303 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700304 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800305 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700306 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800307 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800308
Steven Thomasf734df42020-04-13 21:09:28 -0700309 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700310 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800311 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700312 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800313 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700314 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800315 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700316 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800317 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700318 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800319 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800320
Steven Thomasf734df42020-04-13 21:09:28 -0700321 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700322 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800323 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700324 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800325 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700326 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800327 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700328 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800329 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700330 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800331 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Steven Thomasf734df42020-04-13 21:09:28 -0700332 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700333 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800334 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700335 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800336 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700337 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800338 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700339 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800340 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700341 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800342 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
343}
344
Steven Thomasbb374322020-04-28 22:47:16 -0700345TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700346 auto refreshRateConfigs =
347 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
348 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800349
Steven Thomasdebafed2020-05-18 17:30:35 -0700350 // If there are no layers we select the default frame rate, which is the max of the primary
351 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800352 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700353 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700354 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800355
Steven Thomasdebafed2020-05-18 17:30:35 -0700356 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700357 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700358 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800359}
360
Steven Thomasbb374322020-04-28 22:47:16 -0700361TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700363 std::make_unique<RefreshRateConfigs>(m60_90Device,
364 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365
366 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
367 auto& lr = layers[0];
368
369 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800370 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700371 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700372 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800373
374 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800375 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700376 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700377 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
379 lr.desiredRefreshRate = 90.0f;
380 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700382 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
385 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800386 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700387 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700388 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
390 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800391 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700392 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700393 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
395 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800396 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700397 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700398 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
400 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800401 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700402 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700403 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800405 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700406 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
408 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700409 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700410 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
412 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700413 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700414 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
416 lr.desiredRefreshRate = 90.0f;
417 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700418 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700419 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
421 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700422 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700423 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
425 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700426 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700427 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
429 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700430 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700431 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
433 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700434 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700435 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
Steven Thomasf734df42020-04-13 21:09:28 -0700437 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438
439 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700440 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
443 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700444 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
447 lr.desiredRefreshRate = 90.0f;
448 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
452 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700453 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
456 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700457 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
460 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700461 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700462 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
464 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700465 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467
Steven Thomasf734df42020-04-13 21:09:28 -0700468 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700470 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700471 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
473 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700474 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476
477 lr.desiredRefreshRate = 90.0f;
478 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481
482 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700483 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700484 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800485
486 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700488 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489
490 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700491 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700492 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800493
494 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700495 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800497}
498
Steven Thomasbb374322020-04-28 22:47:16 -0700499TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700501 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
502 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800503
504 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
505 auto& lr = layers[0];
506
507 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700508 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700509 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800510
511 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700512 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700513 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800514
515 lr.desiredRefreshRate = 90.0f;
516 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700517 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700518 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800519
520 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700521 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700522 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800523
524 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700525 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700526 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800527
528 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700529 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700530 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800531
532 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700533 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700534 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800535}
536
Steven Thomasbb374322020-04-28 22:47:16 -0700537TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800538 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700539 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
540 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541
542 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
543 LayerRequirement{.weight = 1.0f}};
544 auto& lr1 = layers[0];
545 auto& lr2 = layers[1];
546
547 lr1.desiredRefreshRate = 24.0f;
548 lr1.vote = LayerVoteType::Heuristic;
549 lr2.desiredRefreshRate = 60.0f;
550 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700551 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700552 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553
554 lr1.desiredRefreshRate = 24.0f;
555 lr1.vote = LayerVoteType::Heuristic;
556 lr2.desiredRefreshRate = 48.0f;
557 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700558 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700559 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800560
561 lr1.desiredRefreshRate = 24.0f;
562 lr1.vote = LayerVoteType::Heuristic;
563 lr2.desiredRefreshRate = 48.0f;
564 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700565 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700566 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800567}
568
Steven Thomasbb374322020-04-28 22:47:16 -0700569TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800570 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700571 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
572 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800573
574 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
575 LayerRequirement{.weight = 1.0f}};
576 auto& lr1 = layers[0];
577 auto& lr2 = layers[1];
578
579 lr1.desiredRefreshRate = 24.0f;
580 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800581 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800582 lr2.desiredRefreshRate = 60.0f;
583 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800584 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700585 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700586 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800587
588 lr1.desiredRefreshRate = 24.0f;
589 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800590 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800591 lr2.desiredRefreshRate = 60.0f;
592 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800593 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700594 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700595 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800596
597 lr1.desiredRefreshRate = 24.0f;
598 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800600 lr2.desiredRefreshRate = 60.0f;
601 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800602 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700603 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700604 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800605
606 lr1.desiredRefreshRate = 24.0f;
607 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800608 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800609 lr2.desiredRefreshRate = 90.0f;
610 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800611 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700612 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700613 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800614
615 lr1.desiredRefreshRate = 24.0f;
616 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
617 lr1.name = "24Hz ExplicitExactOrMultiple";
618 lr2.desiredRefreshRate = 90.0f;
619 lr2.vote = LayerVoteType::ExplicitDefault;
620 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700621 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700622 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800623
624 lr1.desiredRefreshRate = 24.0f;
625 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800626 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr2.desiredRefreshRate = 90.0f;
628 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700630 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700631 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800632
633 lr1.desiredRefreshRate = 24.0f;
634 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800635 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr2.desiredRefreshRate = 90.0f;
637 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700639 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700640 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800641
642 lr1.desiredRefreshRate = 24.0f;
643 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800644 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800645 lr2.desiredRefreshRate = 90.0f;
646 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700648 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700649 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800650
651 lr1.desiredRefreshRate = 24.0f;
652 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800653 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800654 lr2.desiredRefreshRate = 90.0f;
655 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700657 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700658 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800659}
660
Steven Thomasbb374322020-04-28 22:47:16 -0700661TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800662 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700663 std::make_unique<RefreshRateConfigs>(m30_60Device,
664 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800665
666 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
667 auto& lr = layers[0];
668
669 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700670 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700671 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800672
673 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700674 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700675 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800676
677 lr.desiredRefreshRate = 90.0f;
678 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700679 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700680 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800681
682 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700683 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700684 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800685
686 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700687 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700688 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800689
690 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700691 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700692 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800693
694 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700695 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700696 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800697}
698
Steven Thomasbb374322020-04-28 22:47:16 -0700699TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800700 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700701 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
702 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800703
704 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
705 auto& lr = layers[0];
706
707 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800708 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700709 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700710 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800711
712 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800713 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700714 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700715 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800716
717 lr.desiredRefreshRate = 90.0f;
718 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800719 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700720 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700721 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800722
723 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800724 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700725 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700726 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700727 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700728 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729
730 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800731 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700732 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700733 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700734 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700735 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800736
737 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800738 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700739 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700740 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700741 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700742 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800743
744 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800745 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700746 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700747 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700748 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700749 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800750
751 lr.desiredRefreshRate = 24.0f;
752 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
753 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700754 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700755 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700756 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700757 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800758}
759
Steven Thomasbb374322020-04-28 22:47:16 -0700760TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800761 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700762 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
763 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800764
765 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
766 LayerRequirement{.weight = 1.0f}};
767 auto& lr1 = layers[0];
768 auto& lr2 = layers[1];
769
770 lr1.vote = LayerVoteType::Min;
771 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700772 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700773 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800774
775 lr1.vote = LayerVoteType::Min;
776 lr2.vote = LayerVoteType::Heuristic;
777 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700778 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700779 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780
781 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800782 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800783 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700784 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700785 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800786
787 lr1.vote = LayerVoteType::Max;
788 lr2.vote = LayerVoteType::Heuristic;
789 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700790 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700791 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800792
793 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800794 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700796 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700797 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
799 lr1.vote = LayerVoteType::Heuristic;
800 lr1.desiredRefreshRate = 15.0f;
801 lr2.vote = LayerVoteType::Heuristic;
802 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 EXPECT_EQ(mExpected90Config,
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::Heuristic;
807 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800808 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700811 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812}
813
Steven Thomasbb374322020-04-28 22:47:16 -0700814TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700816 std::make_unique<RefreshRateConfigs>(m60_90Device,
817 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800818
819 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
820 auto& lr = layers[0];
821
Ady Abraham71c437d2020-01-31 15:56:57 -0800822 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800823 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
824 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800825 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700826 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700827 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800828 }
829}
830
831TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800832 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700833 std::make_unique<RefreshRateConfigs>(m60_90Device,
834 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
836 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
837 LayerRequirement{.weight = 1.0f}};
838 auto& lr1 = layers[0];
839 auto& lr2 = layers[1];
840
841 lr1.vote = LayerVoteType::Heuristic;
842 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800843 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700845 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800846
847 lr1.vote = LayerVoteType::Heuristic;
848 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800849 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800850 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700851 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852}
853
Steven Thomasbb374322020-04-28 22:47:16 -0700854TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800855 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700856 std::make_unique<RefreshRateConfigs>(m60_90Device,
857 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858
859 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
860 LayerRequirement{.weight = 1.0f}};
861 auto& lr1 = layers[0];
862 auto& lr2 = layers[1];
863
864 lr1.vote = LayerVoteType::Heuristic;
865 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800866 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800867 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700868 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700869 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800870
871 lr1.vote = LayerVoteType::ExplicitDefault;
872 lr1.desiredRefreshRate = 90.0f;
873 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
874 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700876 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800877
878 lr1.vote = LayerVoteType::Heuristic;
879 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800880 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800881 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700882 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700883 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800884}
885
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800886TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700887 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
888 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
889 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
890 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
891 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800892}
893
Steven Thomasbb374322020-04-28 22:47:16 -0700894TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800895 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700896 std::make_unique<RefreshRateConfigs>(m60_90Device,
897 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800898
899 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
900 auto& lr = layers[0];
901
Ady Abraham71c437d2020-01-31 15:56:57 -0800902 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800903 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
904 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700906 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700907 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800908 }
909}
910
Steven Thomasbb374322020-04-28 22:47:16 -0700911TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800912 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700913 std::make_unique<RefreshRateConfigs>(m60_90Device,
914 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800915
916 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
917 LayerRequirement{.weight = 1.0f}};
918 auto& lr1 = layers[0];
919 auto& lr2 = layers[1];
920
921 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
922 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800923 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800924 lr2.vote = LayerVoteType::Heuristic;
925 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800926 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800929
930 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
931 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800932 lr1.name = "60Hz ExplicitExactOrMultiple";
933 lr2.vote = LayerVoteType::ExplicitDefault;
934 lr2.desiredRefreshRate = 90.0f;
935 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700936 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700937 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800938
939 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
940 lr1.desiredRefreshRate = 60.0f;
941 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800942 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800943 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700944 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700945 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800946
947 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
948 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800949 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800950 lr2.vote = LayerVoteType::Heuristic;
951 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800952 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700953 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700954 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800955
956 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
957 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800959 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800960 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700961 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700962 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800963}
964
965TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800966 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700967 std::make_unique<RefreshRateConfigs>(m60_90Device,
968 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800969
970 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
971 LayerRequirement{.weight = 1.0f}};
972 auto& lr1 = layers[0];
973 auto& lr2 = layers[1];
974
975 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
976 lr1.desiredRefreshRate = 60.0f;
977 lr1.name = "60Hz ExplicitExactOrMultiple";
978 lr2.vote = LayerVoteType::NoVote;
979 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700980 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700981 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800982
983 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
984 lr1.desiredRefreshRate = 60.0f;
985 lr1.name = "60Hz ExplicitExactOrMultiple";
986 lr2.vote = LayerVoteType::NoVote;
987 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700988 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700989 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800990
991 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
992 lr1.desiredRefreshRate = 60.0f;
993 lr1.name = "60Hz ExplicitExactOrMultiple";
994 lr2.vote = LayerVoteType::Max;
995 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700996 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700997 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800998
999 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1000 lr1.desiredRefreshRate = 60.0f;
1001 lr1.name = "60Hz ExplicitExactOrMultiple";
1002 lr2.vote = LayerVoteType::Max;
1003 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001004 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001005 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006
1007 // The other layer starts to provide buffers
1008 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1009 lr1.desiredRefreshRate = 60.0f;
1010 lr1.name = "60Hz ExplicitExactOrMultiple";
1011 lr2.vote = LayerVoteType::Heuristic;
1012 lr2.desiredRefreshRate = 90.0f;
1013 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001014 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001015 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001016}
1017
1018TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001019 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001020 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001021 std::make_unique<RefreshRateConfigs>(m60_90Device,
1022 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001023
Ady Abrahamdfd62162020-06-10 16:11:56 -07001024 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1025 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001026
Ady Abrahamdfd62162020-06-10 16:11:56 -07001027 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1028 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001029
1030 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1031 LayerRequirement{.weight = 1.0f}};
1032 auto& lr1 = layers[0];
1033 auto& lr2 = layers[1];
1034
1035 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1036 lr1.desiredRefreshRate = 60.0f;
1037 lr1.name = "60Hz ExplicitExactOrMultiple";
1038 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001039 lr2.desiredRefreshRate = 60.0f;
1040 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001041 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1042 &consideredSignals);
1043 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001044
1045 lr1.vote = LayerVoteType::ExplicitDefault;
1046 lr1.desiredRefreshRate = 60.0f;
1047 lr1.name = "60Hz ExplicitExactOrMultiple";
1048 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001049 lr2.desiredRefreshRate = 60.0f;
1050 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001051 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1052 &consideredSignals);
1053 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001054
1055 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1056 lr1.desiredRefreshRate = 60.0f;
1057 lr1.name = "60Hz ExplicitExactOrMultiple";
1058 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001059 lr2.desiredRefreshRate = 60.0f;
1060 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001061 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1062 &consideredSignals);
1063 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001064
1065 lr1.vote = LayerVoteType::ExplicitDefault;
1066 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001067 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001068 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001069 lr2.desiredRefreshRate = 60.0f;
1070 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001071 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1072 &consideredSignals);
1073 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001074}
1075
Steven Thomasbb374322020-04-28 22:47:16 -07001076TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001077 auto refreshRateConfigs =
1078 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1079 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001080
1081 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1082 auto& lr = layers[0];
1083
1084 // Prepare a table with the vote and the expected refresh rate
1085 const std::vector<std::pair<float, float>> testCases = {
1086 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1087
1088 {100, 90}, {90, 90}, {89, 90},
1089
1090 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1091
1092 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1093
1094 {55, 90}, {50, 90}, {45, 90},
1095
1096 {42, 120}, {40, 120}, {39, 120},
1097
1098 {37, 72}, {36, 72}, {35, 72},
1099
1100 {30, 60},
1101 };
1102
1103 for (const auto& test : testCases) {
1104 lr.vote = LayerVoteType::ExplicitDefault;
1105 lr.desiredRefreshRate = test.first;
1106
1107 std::stringstream ss;
1108 ss << "ExplicitDefault " << test.first << " fps";
1109 lr.name = ss.str();
1110
1111 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001112 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamabc27602020-04-08 17:20:29 -07001113 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001114 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1115 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001116}
1117
Alec Mouri11232a22020-05-14 18:06:25 -07001118TEST_F(RefreshRateConfigsTest,
1119 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1120 auto refreshRateConfigs =
1121 std::make_unique<RefreshRateConfigs>(m60_90Device,
1122 /*currentConfigId=*/HWC_CONFIG_ID_90);
1123
1124 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1125 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1126 0);
1127
1128 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1129 auto& lr = layers[0];
1130
Ady Abrahamdfd62162020-06-10 16:11:56 -07001131 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001132 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1133 lr.desiredRefreshRate = 60.0f;
1134 lr.name = "60Hz ExplicitExactOrMultiple";
1135 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001136 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1137 &consideredSignals));
1138 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001139
1140 lr.vote = LayerVoteType::ExplicitDefault;
1141 lr.desiredRefreshRate = 60.0f;
1142 lr.name = "60Hz ExplicitDefault";
1143 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001144 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1145 &consideredSignals));
1146 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001147}
1148
1149TEST_F(RefreshRateConfigsTest,
1150 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1151 auto refreshRateConfigs =
1152 std::make_unique<RefreshRateConfigs>(m60_90Device,
1153 /*currentConfigId=*/HWC_CONFIG_ID_60);
1154
1155 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1156 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1157 0);
1158
1159 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1160 auto& lr = layers[0];
1161
Alec Mouri11232a22020-05-14 18:06:25 -07001162 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1163 lr.desiredRefreshRate = 90.0f;
1164 lr.name = "90Hz ExplicitExactOrMultiple";
1165 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001166 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001167
1168 lr.vote = LayerVoteType::ExplicitDefault;
1169 lr.desiredRefreshRate = 90.0f;
1170 lr.name = "90Hz ExplicitDefault";
1171 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001172 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001173}
1174
1175TEST_F(RefreshRateConfigsTest,
1176 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitLayers) {
1177 auto refreshRateConfigs =
1178 std::make_unique<RefreshRateConfigs>(m60_90Device,
1179 /*currentConfigId=*/HWC_CONFIG_ID_90);
1180
1181 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1182 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1183 0);
1184
Ady Abrahamdfd62162020-06-10 16:11:56 -07001185 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001186 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001187 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1188 &consideredSignals));
1189 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001190
1191 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1192 auto& lr = layers[0];
1193
1194 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1195 lr.desiredRefreshRate = 60.0f;
1196 lr.name = "60Hz ExplicitExactOrMultiple";
1197 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001198 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001199
1200 lr.vote = LayerVoteType::ExplicitDefault;
1201 lr.desiredRefreshRate = 60.0f;
1202 lr.name = "60Hz ExplicitDefault";
1203 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001204 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001205
1206 lr.vote = LayerVoteType::Heuristic;
1207 lr.desiredRefreshRate = 60.0f;
1208 lr.name = "60Hz Heuristic";
1209 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::Max;
1213 lr.desiredRefreshRate = 60.0f;
1214 lr.name = "60Hz Max";
1215 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001216 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001217
1218 lr.vote = LayerVoteType::Min;
1219 lr.desiredRefreshRate = 60.0f;
1220 lr.name = "60Hz Min";
1221 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001222 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001223}
1224
Steven Thomasd4071902020-03-24 16:02:53 -07001225TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001226 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001227 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1228 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001229
1230 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1231 auto& layer = layers[0];
1232 layer.vote = LayerVoteType::ExplicitDefault;
1233 layer.desiredRefreshRate = 90.0f;
1234 layer.name = "90Hz ExplicitDefault";
1235
Steven Thomasd4071902020-03-24 16:02:53 -07001236 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001237 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001238 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001239
1240 RefreshRateConfigs::Policy policy;
1241 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1242 policy.allowGroupSwitching = true;
1243 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1244 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001245 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Ady Abrahamabc27602020-04-08 17:20:29 -07001246 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001247}
1248
Steven Thomasf734df42020-04-13 21:09:28 -07001249TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1250 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001251 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001252 /*currentConfigId=*/HWC_CONFIG_ID_60);
1253
1254 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1255 layers[0].name = "Test layer";
1256
Steven Thomasbb374322020-04-28 22:47:16 -07001257 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001258 // given voteType and fps.
1259 auto getFrameRate = [&](LayerVoteType voteType, float fps,
1260 bool touchActive = false) -> HwcConfigIndexType {
1261 layers[0].vote = voteType;
1262 layers[0].desiredRefreshRate = fps;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001263 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001264 .getConfigId();
1265 };
1266
1267 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001268 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001269 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001270 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001271 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Steven Thomasf734df42020-04-13 21:09:28 -07001272 .getConfigId());
1273 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001274 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001275 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1276 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1277 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1278 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1279
1280 // Touch boost should be restricted to the primary range.
1281 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1282 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1283 // shouldn't drag us back down to the primary range max.
1284 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
1285 EXPECT_EQ(HWC_CONFIG_ID_90,
1286 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1287
1288 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1289 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1290 0);
1291 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1292 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1293 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1294 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1295 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1296 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1297}
1298
Steven Thomasbb374322020-04-28 22:47:16 -07001299TEST_F(RefreshRateConfigsTest, idle) {
1300 auto refreshRateConfigs =
1301 std::make_unique<RefreshRateConfigs>(m60_90Device,
1302 /*currentConfigId=*/HWC_CONFIG_ID_60);
1303
1304 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1305 layers[0].name = "Test layer";
1306
Ady Abrahamdfd62162020-06-10 16:11:56 -07001307 const auto getIdleFrameRate = [&](LayerVoteType voteType,
1308 bool touchActive) -> HwcConfigIndexType {
Steven Thomasbb374322020-04-28 22:47:16 -07001309 layers[0].vote = voteType;
1310 layers[0].desiredRefreshRate = 90.f;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001311 RefreshRateConfigs::GlobalSignals consideredSignals;
1312 const auto configId =
1313 refreshRateConfigs
1314 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1315 &consideredSignals)
1316 .getConfigId();
1317 // Refresh rate will be chosen by either touch state or idle state
1318 EXPECT_EQ(!touchActive, consideredSignals.idle);
1319 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001320 };
1321
1322 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1323 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1324 0);
1325
1326 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001327 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1328 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1329 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1330 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1331 EXPECT_EQ(HWC_CONFIG_ID_90,
1332 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1333 EXPECT_EQ(HWC_CONFIG_ID_90,
1334 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001335
1336 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001337 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001338 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001339 .getConfigId());
1340
1341 // Idle should be higher precedence than other layer frame rate considerations.
1342 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001343 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1344 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1345 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1346 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1347 EXPECT_EQ(HWC_CONFIG_ID_60,
1348 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1349 EXPECT_EQ(HWC_CONFIG_ID_60,
1350 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001351
1352 // Idle should be applied rather than the current config when there are no layers.
1353 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001354 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Steven Thomasbb374322020-04-28 22:47:16 -07001355 .getConfigId());
1356}
1357
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001358TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1359 auto refreshRateConfigs =
1360 std::make_unique<RefreshRateConfigs>(m60_90Device,
1361 /*currentConfigId=*/HWC_CONFIG_ID_60);
1362
1363 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
1364 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, fps);
1365 float expectedFrameRate;
1366 if (fps < 26.91f) {
1367 expectedFrameRate = 24.0f;
1368 } else if (fps < 37.51f) {
1369 expectedFrameRate = 30.0f;
1370 } else if (fps < 52.51f) {
1371 expectedFrameRate = 45.0f;
1372 } else if (fps < 66.01f) {
1373 expectedFrameRate = 60.0f;
1374 } else if (fps < 81.01f) {
1375 expectedFrameRate = 72.0f;
1376 } else {
1377 expectedFrameRate = 90.0f;
1378 }
1379 EXPECT_FLOAT_EQ(expectedFrameRate, knownFrameRate)
1380 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1381 }
1382}
1383
1384TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001385 auto refreshRateConfigs =
1386 std::make_unique<RefreshRateConfigs>(m60_90Device,
1387 /*currentConfigId=*/HWC_CONFIG_ID_60);
1388
1389 struct ExpectedRate {
1390 float rate;
1391 const RefreshRate& expected;
1392 };
1393
1394 /* clang-format off */
1395 std::vector<ExpectedRate> knownFrameRatesExpectations = {
1396 {24.0f, mExpected60Config},
1397 {30.0f, mExpected60Config},
1398 {45.0f, mExpected90Config},
1399 {60.0f, mExpected60Config},
1400 {72.0f, mExpected90Config},
1401 {90.0f, mExpected90Config},
1402 };
1403 /* clang-format on */
1404
1405 // Make sure the test tests all the known frame rate
1406 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
1407 const auto equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1408 knownFrameRatesExpectations.begin(),
1409 [](float a, const ExpectedRate& b) { return a == b.rate; });
1410 EXPECT_TRUE(equal);
1411
1412 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1413 auto& layer = layers[0];
1414 layer.vote = LayerVoteType::Heuristic;
1415 for (const auto& expectedRate : knownFrameRatesExpectations) {
1416 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001417 const auto& refreshRate =
1418 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001419 EXPECT_EQ(expectedRate.expected, refreshRate);
1420 }
1421}
1422
Ana Krulecb9afd792020-06-11 13:16:15 -07001423TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1424 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1425 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1426 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1427}
1428
1429TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1430 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1431
1432 auto refreshRateConfigs =
1433 std::make_unique<RefreshRateConfigs>(m60_90Device,
1434 /*currentConfigId=*/HWC_CONFIG_ID_90);
1435 // SetPolicy(60, 90), current 90Hz => TurnOn.
1436 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1437
1438 // SetPolicy(60, 90), current 60Hz => TurnOn.
1439 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 90}}), 0);
1440 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1441
1442 // SetPolicy(60, 60), current 60Hz => NoChange, avoid extra calls.
1443 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
1444 EXPECT_EQ(KernelIdleTimerAction::NoChange, refreshRateConfigs->getIdleTimerAction());
1445
1446 // SetPolicy(90, 90), current 90Hz => TurnOff.
1447 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
1448 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1449}
1450
Alec Mouri0a1cc962019-03-14 12:33:02 -07001451} // namespace
1452} // namespace scheduler
1453} // namespace android