blob: 4fa84555b7129f47d5e761fc6c41f9a371d7d3ee [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 Abraham6fb599b2020-03-05 13:48:22 -0800346 bool ignored;
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,
Steven Thomasbb374322020-04-28 22:47:16 -0700355 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/
356 false, /*idle*/ false, &ignored));
Ana Krulec3d367c82020-02-25 15:02:01 -0800357
Steven Thomasdebafed2020-05-18 17:30:35 -0700358 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700359 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700360 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/
361 false, /*idle*/ false, &ignored));
Ana Krulec3d367c82020-02-25 15:02:01 -0800362}
363
Steven Thomasbb374322020-04-28 22:47:16 -0700364TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800365 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 std::make_unique<RefreshRateConfigs>(m60_90Device,
368 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
370 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
371 auto& lr = layers[0];
372
373 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800374 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700375 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700376 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
377 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
379 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800380 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700381 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700382 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
383 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
385 lr.desiredRefreshRate = 90.0f;
386 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700389 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
390 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
392 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800393 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700394 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700395 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
396 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397
398 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800399 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700400 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700401 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
402 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
404 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800405 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700407 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
408 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800409
410 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800411 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700412 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700413 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
414 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800416 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700417 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
419 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700420 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700421 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
422 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
424 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700425 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700426 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
427 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
429 lr.desiredRefreshRate = 90.0f;
430 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700431 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700432 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
433 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
435 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700436 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700437 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
438 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
440 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700442 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
443 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800444
445 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700446 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700447 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
448 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
450 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700451 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700452 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
453 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454
Steven Thomasf734df42020-04-13 21:09:28 -0700455 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
457 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700458 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700459 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
460 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461
462 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700463 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700464 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
465 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
467 lr.desiredRefreshRate = 90.0f;
468 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700469 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700470 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
471 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
473 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700474 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700475 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
476 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
478 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700480 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
481 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482
483 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700484 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700485 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
486 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487
488 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700489 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700490 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
491 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492
Steven Thomasf734df42020-04-13 21:09:28 -0700493 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700495 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700496 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
497 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498
499 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700500 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700501 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
502 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800503
504 lr.desiredRefreshRate = 90.0f;
505 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700506 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700507 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
508 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800509
510 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700511 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700512 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
513 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800514
515 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700516 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700517 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
518 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800519
520 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700521 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700522 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
523 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800524
525 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700526 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700527 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
528 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529}
530
Steven Thomasbb374322020-04-28 22:47:16 -0700531TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800532 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800533 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700534 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
535 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800536
537 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
538 auto& lr = layers[0];
539
540 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700541 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700542 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
543 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800544
545 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700546 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700547 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
548 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800549
550 lr.desiredRefreshRate = 90.0f;
551 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700552 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700553 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
554 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555
556 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700557 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700558 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
559 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800560
561 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700562 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700563 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
564 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800565
566 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700567 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700568 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
569 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800570
571 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700572 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700573 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
574 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800575}
576
Steven Thomasbb374322020-04-28 22:47:16 -0700577TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800578 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800579 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700580 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
581 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800582
583 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
584 LayerRequirement{.weight = 1.0f}};
585 auto& lr1 = layers[0];
586 auto& lr2 = layers[1];
587
588 lr1.desiredRefreshRate = 24.0f;
589 lr1.vote = LayerVoteType::Heuristic;
590 lr2.desiredRefreshRate = 60.0f;
591 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700592 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700593 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
594 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595
596 lr1.desiredRefreshRate = 24.0f;
597 lr1.vote = LayerVoteType::Heuristic;
598 lr2.desiredRefreshRate = 48.0f;
599 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700600 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700601 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
602 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800603
604 lr1.desiredRefreshRate = 24.0f;
605 lr1.vote = LayerVoteType::Heuristic;
606 lr2.desiredRefreshRate = 48.0f;
607 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700608 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700609 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
610 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800611}
612
Steven Thomasbb374322020-04-28 22:47:16 -0700613TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800614 bool ignored;
Ady Abraham71c437d2020-01-31 15:56:57 -0800615 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700616 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
617 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800618
619 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
620 LayerRequirement{.weight = 1.0f}};
621 auto& lr1 = layers[0];
622 auto& lr2 = layers[1];
623
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 = 60.0f;
628 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700630 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700631 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
632 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800633
634 lr1.desiredRefreshRate = 24.0f;
635 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr2.desiredRefreshRate = 60.0f;
638 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700640 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700641 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
642 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800643
644 lr1.desiredRefreshRate = 24.0f;
645 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800646 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800647 lr2.desiredRefreshRate = 60.0f;
648 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700650 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700651 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
652 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800653
654 lr1.desiredRefreshRate = 24.0f;
655 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800657 lr2.desiredRefreshRate = 90.0f;
658 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800659 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700660 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700661 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
662 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800663
664 lr1.desiredRefreshRate = 24.0f;
665 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
666 lr1.name = "24Hz ExplicitExactOrMultiple";
667 lr2.desiredRefreshRate = 90.0f;
668 lr2.vote = LayerVoteType::ExplicitDefault;
669 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700670 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700671 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
672 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800673
674 lr1.desiredRefreshRate = 24.0f;
675 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800676 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800677 lr2.desiredRefreshRate = 90.0f;
678 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800679 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700680 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700681 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
682 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800683
684 lr1.desiredRefreshRate = 24.0f;
685 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800686 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800687 lr2.desiredRefreshRate = 90.0f;
688 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800689 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700690 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700691 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
692 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800693
694 lr1.desiredRefreshRate = 24.0f;
695 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800696 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800697 lr2.desiredRefreshRate = 90.0f;
698 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800699 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700700 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700701 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
702 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800703
704 lr1.desiredRefreshRate = 24.0f;
705 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800706 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800707 lr2.desiredRefreshRate = 90.0f;
708 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800709 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700710 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700711 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
712 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800713}
714
Steven Thomasbb374322020-04-28 22:47:16 -0700715TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800716 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800717 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700718 std::make_unique<RefreshRateConfigs>(m30_60Device,
719 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800720
721 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
722 auto& lr = layers[0];
723
724 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700725 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700726 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
727 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800728
729 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700730 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700731 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
732 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800733
734 lr.desiredRefreshRate = 90.0f;
735 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700736 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700737 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
738 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800739
740 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700741 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700742 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
743 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
745 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700746 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700747 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
748 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800749
750 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700751 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700752 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
753 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800754
755 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700756 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700757 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
758 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800759}
760
Steven Thomasbb374322020-04-28 22:47:16 -0700761TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800762 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800763 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700764 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
765 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800766
767 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
768 auto& lr = layers[0];
769
770 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800771 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700772 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700773 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
774 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
776 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800777 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700778 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700779 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
780 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800781
782 lr.desiredRefreshRate = 90.0f;
783 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800784 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700785 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700786 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
787 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
789 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800790 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700791 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700792 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
793 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700794 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700795 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
796 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800797
798 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800799 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700800 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700801 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
802 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700804 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
805 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806
807 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800808 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700809 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700810 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
811 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700812 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700813 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
814 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815
816 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800817 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700818 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700819 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
820 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700821 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700822 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
823 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800824
825 lr.desiredRefreshRate = 24.0f;
826 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
827 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700828 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700829 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
830 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700831 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700832 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
833 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834}
835
Steven Thomasbb374322020-04-28 22:47:16 -0700836TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800837 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800838 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700839 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
840 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841
842 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
843 LayerRequirement{.weight = 1.0f}};
844 auto& lr1 = layers[0];
845 auto& lr2 = layers[1];
846
847 lr1.vote = LayerVoteType::Min;
848 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700850 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
851 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
853 lr1.vote = LayerVoteType::Min;
854 lr2.vote = LayerVoteType::Heuristic;
855 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700856 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700857 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
858 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800859
860 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800861 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700864 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
865 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800866
867 lr1.vote = LayerVoteType::Max;
868 lr2.vote = LayerVoteType::Heuristic;
869 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700871 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
872 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800873
874 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800875 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800876 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700877 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700878 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
879 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800880
881 lr1.vote = LayerVoteType::Heuristic;
882 lr1.desiredRefreshRate = 15.0f;
883 lr2.vote = LayerVoteType::Heuristic;
884 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700885 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700886 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
887 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800888
889 lr1.vote = LayerVoteType::Heuristic;
890 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800891 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800892 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700893 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700894 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
895 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800896}
897
Steven Thomasbb374322020-04-28 22:47:16 -0700898TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800899 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800900 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700901 std::make_unique<RefreshRateConfigs>(m60_90Device,
902 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800903
904 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
905 auto& lr = layers[0];
906
Ady Abraham71c437d2020-01-31 15:56:57 -0800907 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800908 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
909 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800910 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700911 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
912 /*idle*/ false, &ignored);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700913 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800914 }
915}
916
917TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800918 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700919 std::make_unique<RefreshRateConfigs>(m60_90Device,
920 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921
922 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
923 LayerRequirement{.weight = 1.0f}};
924 auto& lr1 = layers[0];
925 auto& lr2 = layers[1];
926
927 lr1.vote = LayerVoteType::Heuristic;
928 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800929 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800930 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700931 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800932
933 lr1.vote = LayerVoteType::Heuristic;
934 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800935 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800936 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700937 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800938}
939
Steven Thomasbb374322020-04-28 22:47:16 -0700940TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800941 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800942 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700943 std::make_unique<RefreshRateConfigs>(m60_90Device,
944 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800945
946 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
947 LayerRequirement{.weight = 1.0f}};
948 auto& lr1 = layers[0];
949 auto& lr2 = layers[1];
950
951 lr1.vote = LayerVoteType::Heuristic;
952 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800953 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800954 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700955 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700956 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
957 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958
959 lr1.vote = LayerVoteType::ExplicitDefault;
960 lr1.desiredRefreshRate = 90.0f;
961 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
962 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700963 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700964 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
965 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800966
967 lr1.vote = LayerVoteType::Heuristic;
968 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800969 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800970 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700971 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700972 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
973 /*idle*/ false, &ignored));
Ady Abraham2139f732019-11-13 18:56:40 -0800974}
975
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800976TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700977 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
978 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
979 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
980 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
981 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800982}
983
Steven Thomasbb374322020-04-28 22:47:16 -0700984TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800985 bool ignored;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800986 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700987 std::make_unique<RefreshRateConfigs>(m60_90Device,
988 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800989
990 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
991 auto& lr = layers[0];
992
Ady Abraham71c437d2020-01-31 15:56:57 -0800993 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800994 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
995 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800996 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700997 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
998 /*idle*/ false, &ignored);
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700999 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001000 }
1001}
1002
Steven Thomasbb374322020-04-28 22:47:16 -07001003TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham6fb599b2020-03-05 13:48:22 -08001004 bool ignored;
Ady Abraham34702102020-02-10 14:12:05 -08001005 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001006 std::make_unique<RefreshRateConfigs>(m60_90Device,
1007 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001008
1009 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1010 LayerRequirement{.weight = 1.0f}};
1011 auto& lr1 = layers[0];
1012 auto& lr2 = layers[1];
1013
1014 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1015 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001016 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001017 lr2.vote = LayerVoteType::Heuristic;
1018 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001019 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001020 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001021 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1022 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001023
1024 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1025 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001026 lr1.name = "60Hz ExplicitExactOrMultiple";
1027 lr2.vote = LayerVoteType::ExplicitDefault;
1028 lr2.desiredRefreshRate = 90.0f;
1029 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001030 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001031 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1032 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001033
1034 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1035 lr1.desiredRefreshRate = 60.0f;
1036 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001037 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001038 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001039 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001040 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1041 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001042
1043 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1044 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001045 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001046 lr2.vote = LayerVoteType::Heuristic;
1047 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001048 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001049 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001050 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1051 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001052
1053 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1054 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001055 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001056 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001057 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001058 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001059 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1060 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001061}
1062
1063TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -08001064 bool ignored;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001065 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001066 std::make_unique<RefreshRateConfigs>(m60_90Device,
1067 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001068
1069 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1070 LayerRequirement{.weight = 1.0f}};
1071 auto& lr1 = layers[0];
1072 auto& lr2 = layers[1];
1073
1074 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1075 lr1.desiredRefreshRate = 60.0f;
1076 lr1.name = "60Hz ExplicitExactOrMultiple";
1077 lr2.vote = LayerVoteType::NoVote;
1078 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001079 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001080 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001081
1082 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1083 lr1.desiredRefreshRate = 60.0f;
1084 lr1.name = "60Hz ExplicitExactOrMultiple";
1085 lr2.vote = LayerVoteType::NoVote;
1086 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001087 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001088 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001089
1090 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1091 lr1.desiredRefreshRate = 60.0f;
1092 lr1.name = "60Hz ExplicitExactOrMultiple";
1093 lr2.vote = LayerVoteType::Max;
1094 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001095 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001096 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001097
1098 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1099 lr1.desiredRefreshRate = 60.0f;
1100 lr1.name = "60Hz ExplicitExactOrMultiple";
1101 lr2.vote = LayerVoteType::Max;
1102 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001103 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001104 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001105
1106 // The other layer starts to provide buffers
1107 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1108 lr1.desiredRefreshRate = 60.0f;
1109 lr1.name = "60Hz ExplicitExactOrMultiple";
1110 lr2.vote = LayerVoteType::Heuristic;
1111 lr2.desiredRefreshRate = 90.0f;
1112 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001113 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001114 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001115}
1116
1117TEST_F(RefreshRateConfigsTest, touchConsidered) {
1118 bool touchConsidered;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001119 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001120 std::make_unique<RefreshRateConfigs>(m60_90Device,
1121 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001122
Steven Thomasbb374322020-04-28 22:47:16 -07001123 refreshRateConfigs->getBestRefreshRate({}, false, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001124 EXPECT_EQ(false, touchConsidered);
1125
Steven Thomasbb374322020-04-28 22:47:16 -07001126 refreshRateConfigs->getBestRefreshRate({}, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001127 EXPECT_EQ(true, touchConsidered);
1128
1129 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1130 LayerRequirement{.weight = 1.0f}};
1131 auto& lr1 = layers[0];
1132 auto& lr2 = layers[1];
1133
1134 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1135 lr1.desiredRefreshRate = 60.0f;
1136 lr1.name = "60Hz ExplicitExactOrMultiple";
1137 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001138 lr2.desiredRefreshRate = 60.0f;
1139 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001140 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001141 EXPECT_EQ(true, touchConsidered);
1142
1143 lr1.vote = LayerVoteType::ExplicitDefault;
1144 lr1.desiredRefreshRate = 60.0f;
1145 lr1.name = "60Hz ExplicitExactOrMultiple";
1146 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001147 lr2.desiredRefreshRate = 60.0f;
1148 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001149 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001150 EXPECT_EQ(false, touchConsidered);
1151
1152 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1153 lr1.desiredRefreshRate = 60.0f;
1154 lr1.name = "60Hz ExplicitExactOrMultiple";
1155 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001156 lr2.desiredRefreshRate = 60.0f;
1157 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001158 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001159 EXPECT_EQ(true, touchConsidered);
1160
1161 lr1.vote = LayerVoteType::ExplicitDefault;
1162 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001163 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001164 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001165 lr2.desiredRefreshRate = 60.0f;
1166 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001167 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001168 EXPECT_EQ(false, touchConsidered);
Ady Abraham34702102020-02-10 14:12:05 -08001169}
1170
Steven Thomasbb374322020-04-28 22:47:16 -07001171TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001172 bool ignored;
Ady Abrahamabc27602020-04-08 17:20:29 -07001173 auto refreshRateConfigs =
1174 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1175 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001176
1177 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1178 auto& lr = layers[0];
1179
1180 // Prepare a table with the vote and the expected refresh rate
1181 const std::vector<std::pair<float, float>> testCases = {
1182 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1183
1184 {100, 90}, {90, 90}, {89, 90},
1185
1186 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1187
1188 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1189
1190 {55, 90}, {50, 90}, {45, 90},
1191
1192 {42, 120}, {40, 120}, {39, 120},
1193
1194 {37, 72}, {36, 72}, {35, 72},
1195
1196 {30, 60},
1197 };
1198
1199 for (const auto& test : testCases) {
1200 lr.vote = LayerVoteType::ExplicitDefault;
1201 lr.desiredRefreshRate = test.first;
1202
1203 std::stringstream ss;
1204 ss << "ExplicitDefault " << test.first << " fps";
1205 lr.name = ss.str();
1206
1207 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -07001208 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -07001209 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001210 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1211 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001212}
1213
Alec Mouri11232a22020-05-14 18:06:25 -07001214TEST_F(RefreshRateConfigsTest,
1215 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1216 auto refreshRateConfigs =
1217 std::make_unique<RefreshRateConfigs>(m60_90Device,
1218 /*currentConfigId=*/HWC_CONFIG_ID_90);
1219
1220 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1221 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1222 0);
1223
1224 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1225 auto& lr = layers[0];
1226
1227 bool touchConsidered = false;
1228 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1229 lr.desiredRefreshRate = 60.0f;
1230 lr.name = "60Hz ExplicitExactOrMultiple";
1231 EXPECT_EQ(mExpected60Config,
1232 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true, /*idle*/ false,
1233 &touchConsidered));
1234 EXPECT_EQ(false, touchConsidered);
1235
1236 lr.vote = LayerVoteType::ExplicitDefault;
1237 lr.desiredRefreshRate = 60.0f;
1238 lr.name = "60Hz ExplicitDefault";
1239 EXPECT_EQ(mExpected60Config,
1240 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true, /*idle*/ false,
1241 &touchConsidered));
1242 EXPECT_EQ(false, touchConsidered);
1243}
1244
1245TEST_F(RefreshRateConfigsTest,
1246 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1247 auto refreshRateConfigs =
1248 std::make_unique<RefreshRateConfigs>(m60_90Device,
1249 /*currentConfigId=*/HWC_CONFIG_ID_60);
1250
1251 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1252 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1253 0);
1254
1255 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1256 auto& lr = layers[0];
1257
1258 bool touchConsidered = false;
1259 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1260 lr.desiredRefreshRate = 90.0f;
1261 lr.name = "90Hz ExplicitExactOrMultiple";
1262 EXPECT_EQ(mExpected90Config,
1263 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ true,
1264 &touchConsidered));
1265
1266 lr.vote = LayerVoteType::ExplicitDefault;
1267 lr.desiredRefreshRate = 90.0f;
1268 lr.name = "90Hz ExplicitDefault";
1269 EXPECT_EQ(mExpected90Config,
1270 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ true,
1271 &touchConsidered));
1272}
1273
1274TEST_F(RefreshRateConfigsTest,
1275 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitLayers) {
1276 auto refreshRateConfigs =
1277 std::make_unique<RefreshRateConfigs>(m60_90Device,
1278 /*currentConfigId=*/HWC_CONFIG_ID_90);
1279
1280 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1281 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1282 0);
1283
1284 bool touchConsidered = false;
1285 EXPECT_EQ(mExpected90Config,
1286 refreshRateConfigs->getBestRefreshRate({}, /*touchActive*/ false, /*idle*/ false,
1287 &touchConsidered));
1288 EXPECT_EQ(false, touchConsidered);
1289
1290 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1291 auto& lr = layers[0];
1292
1293 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1294 lr.desiredRefreshRate = 60.0f;
1295 lr.name = "60Hz ExplicitExactOrMultiple";
1296 EXPECT_EQ(mExpected60Config,
1297 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1298 &touchConsidered));
1299
1300 lr.vote = LayerVoteType::ExplicitDefault;
1301 lr.desiredRefreshRate = 60.0f;
1302 lr.name = "60Hz ExplicitDefault";
1303 EXPECT_EQ(mExpected60Config,
1304 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1305 &touchConsidered));
1306
1307 lr.vote = LayerVoteType::Heuristic;
1308 lr.desiredRefreshRate = 60.0f;
1309 lr.name = "60Hz Heuristic";
1310 EXPECT_EQ(mExpected90Config,
1311 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1312 &touchConsidered));
1313
1314 lr.vote = LayerVoteType::Max;
1315 lr.desiredRefreshRate = 60.0f;
1316 lr.name = "60Hz Max";
1317 EXPECT_EQ(mExpected90Config,
1318 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1319 &touchConsidered));
1320
1321 lr.vote = LayerVoteType::Min;
1322 lr.desiredRefreshRate = 60.0f;
1323 lr.name = "60Hz Min";
1324 EXPECT_EQ(mExpected90Config,
1325 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1326 &touchConsidered));
1327}
1328
Steven Thomasd4071902020-03-24 16:02:53 -07001329TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001330 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001331 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1332 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001333
1334 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1335 auto& layer = layers[0];
1336 layer.vote = LayerVoteType::ExplicitDefault;
1337 layer.desiredRefreshRate = 90.0f;
1338 layer.name = "90Hz ExplicitDefault";
1339
1340 bool touchConsidered;
1341 ASSERT_EQ(HWC_CONFIG_ID_60,
Steven Thomasbb374322020-04-28 22:47:16 -07001342 refreshRateConfigs
1343 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001344 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001345
1346 RefreshRateConfigs::Policy policy;
1347 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1348 policy.allowGroupSwitching = true;
1349 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1350 ASSERT_EQ(HWC_CONFIG_ID_90,
Steven Thomasbb374322020-04-28 22:47:16 -07001351 refreshRateConfigs
1352 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001353 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001354}
1355
Steven Thomasf734df42020-04-13 21:09:28 -07001356TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1357 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001358 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001359 /*currentConfigId=*/HWC_CONFIG_ID_60);
1360
1361 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1362 layers[0].name = "Test layer";
1363
Steven Thomasbb374322020-04-28 22:47:16 -07001364 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001365 // given voteType and fps.
1366 auto getFrameRate = [&](LayerVoteType voteType, float fps,
1367 bool touchActive = false) -> HwcConfigIndexType {
1368 layers[0].vote = voteType;
1369 layers[0].desiredRefreshRate = fps;
1370 bool touchConsidered;
Steven Thomasbb374322020-04-28 22:47:16 -07001371 return refreshRateConfigs
1372 ->getBestRefreshRate(layers, touchActive, /*idle*/ false, &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001373 .getConfigId();
1374 };
1375
1376 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001377 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001378 0);
1379 bool touchConsidered;
1380 EXPECT_EQ(HWC_CONFIG_ID_60,
1381 refreshRateConfigs
Steven Thomasbb374322020-04-28 22:47:16 -07001382 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle*/ false,
1383 &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001384 .getConfigId());
1385 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001386 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001387 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1388 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1389 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1390 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1391
1392 // Touch boost should be restricted to the primary range.
1393 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1394 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1395 // shouldn't drag us back down to the primary range max.
1396 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
1397 EXPECT_EQ(HWC_CONFIG_ID_90,
1398 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1399
1400 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1401 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1402 0);
1403 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1404 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1405 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1406 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1407 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1408 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1409}
1410
Steven Thomasbb374322020-04-28 22:47:16 -07001411TEST_F(RefreshRateConfigsTest, idle) {
1412 auto refreshRateConfigs =
1413 std::make_unique<RefreshRateConfigs>(m60_90Device,
1414 /*currentConfigId=*/HWC_CONFIG_ID_60);
1415
1416 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1417 layers[0].name = "Test layer";
1418
1419 auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> HwcConfigIndexType {
1420 layers[0].vote = voteType;
1421 layers[0].desiredRefreshRate = 90.f;
1422 bool touchConsidered;
1423 return refreshRateConfigs
1424 ->getBestRefreshRate(layers, touchActive, /*idle=*/true, &touchConsidered)
1425 .getConfigId();
1426 };
1427
1428 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1429 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1430 0);
1431
1432 // Idle should be lower priority than touch boost.
1433 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, true));
1434 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, true));
1435 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, true));
1436 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, true));
1437 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitDefault, true));
1438 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, true));
1439
1440 // With no layers, idle should still be lower priority than touch boost.
1441 bool touchConsidered;
1442 EXPECT_EQ(HWC_CONFIG_ID_90,
1443 refreshRateConfigs
1444 ->getBestRefreshRate({}, /*touchActive=*/true, /*idle=*/true,
1445 &touchConsidered)
1446 .getConfigId());
1447
1448 // Idle should be higher precedence than other layer frame rate considerations.
1449 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1450 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, false));
1451 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, false));
1452 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, false));
1453 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, false));
1454 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitDefault, false));
1455 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, false));
1456
1457 // Idle should be applied rather than the current config when there are no layers.
1458 EXPECT_EQ(HWC_CONFIG_ID_60,
1459 refreshRateConfigs
1460 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle=*/true,
1461 &touchConsidered)
1462 .getConfigId());
1463}
1464
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001465TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1466 auto refreshRateConfigs =
1467 std::make_unique<RefreshRateConfigs>(m60_90Device,
1468 /*currentConfigId=*/HWC_CONFIG_ID_60);
1469
1470 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
1471 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, fps);
1472 float expectedFrameRate;
1473 if (fps < 26.91f) {
1474 expectedFrameRate = 24.0f;
1475 } else if (fps < 37.51f) {
1476 expectedFrameRate = 30.0f;
1477 } else if (fps < 52.51f) {
1478 expectedFrameRate = 45.0f;
1479 } else if (fps < 66.01f) {
1480 expectedFrameRate = 60.0f;
1481 } else if (fps < 81.01f) {
1482 expectedFrameRate = 72.0f;
1483 } else {
1484 expectedFrameRate = 90.0f;
1485 }
1486 EXPECT_FLOAT_EQ(expectedFrameRate, knownFrameRate)
1487 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1488 }
1489}
1490
1491TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
1492 bool ignored;
1493 auto refreshRateConfigs =
1494 std::make_unique<RefreshRateConfigs>(m60_90Device,
1495 /*currentConfigId=*/HWC_CONFIG_ID_60);
1496
1497 struct ExpectedRate {
1498 float rate;
1499 const RefreshRate& expected;
1500 };
1501
1502 /* clang-format off */
1503 std::vector<ExpectedRate> knownFrameRatesExpectations = {
1504 {24.0f, mExpected60Config},
1505 {30.0f, mExpected60Config},
1506 {45.0f, mExpected90Config},
1507 {60.0f, mExpected60Config},
1508 {72.0f, mExpected90Config},
1509 {90.0f, mExpected90Config},
1510 };
1511 /* clang-format on */
1512
1513 // Make sure the test tests all the known frame rate
1514 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
1515 const auto equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1516 knownFrameRatesExpectations.begin(),
1517 [](float a, const ExpectedRate& b) { return a == b.rate; });
1518 EXPECT_TRUE(equal);
1519
1520 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1521 auto& layer = layers[0];
1522 layer.vote = LayerVoteType::Heuristic;
1523 for (const auto& expectedRate : knownFrameRatesExpectations) {
1524 layer.desiredRefreshRate = expectedRate.rate;
1525 const auto& refreshRate = refreshRateConfigs->getBestRefreshRate(layers,
1526 /*touchActive*/ false,
1527 /*idle*/ false, &ignored);
1528 EXPECT_EQ(expectedRate.expected, refreshRate);
1529 }
1530}
1531
Alec Mouri0a1cc962019-03-14 12:33:02 -07001532} // namespace
1533} // namespace scheduler
1534} // namespace android