blob: 2b168b2cf2abc50e4bc69ab878a80b1729bf586c [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
46 // Test config IDs
47 static inline const HwcConfigIndexType HWC_CONFIG_ID_60 = HwcConfigIndexType(0);
48 static inline const HwcConfigIndexType HWC_CONFIG_ID_90 = HwcConfigIndexType(1);
49 static inline const HwcConfigIndexType HWC_CONFIG_ID_72 = HwcConfigIndexType(2);
50 static inline const HwcConfigIndexType HWC_CONFIG_ID_120 = HwcConfigIndexType(3);
51 static inline const HwcConfigIndexType HWC_CONFIG_ID_30 = HwcConfigIndexType(4);
52
53 // Test configs
54 std::shared_ptr<const HWC2::Display::Config> mConfig60 =
55 createConfig(HWC_CONFIG_ID_60, 0, static_cast<int64_t>(1e9f / 60));
56 std::shared_ptr<const HWC2::Display::Config> mConfig90 =
57 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90));
58 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentGroup =
59 createConfig(HWC_CONFIG_ID_90, 1, static_cast<int64_t>(1e9f / 90));
60 std::shared_ptr<const HWC2::Display::Config> mConfig90DifferentResolution =
61 createConfig(HWC_CONFIG_ID_90, 0, static_cast<int64_t>(1e9f / 90), 111, 222);
62 std::shared_ptr<const HWC2::Display::Config> mConfig72 =
63 createConfig(HWC_CONFIG_ID_72, 0, static_cast<int64_t>(1e9f / 72));
64 std::shared_ptr<const HWC2::Display::Config> mConfig72DifferentGroup =
65 createConfig(HWC_CONFIG_ID_72, 1, static_cast<int64_t>(1e9f / 72));
66 std::shared_ptr<const HWC2::Display::Config> mConfig120 =
67 createConfig(HWC_CONFIG_ID_120, 0, static_cast<int64_t>(1e9f / 120));
68 std::shared_ptr<const HWC2::Display::Config> mConfig120DifferentGroup =
69 createConfig(HWC_CONFIG_ID_120, 1, static_cast<int64_t>(1e9f / 120));
70 std::shared_ptr<const HWC2::Display::Config> mConfig30 =
71 createConfig(HWC_CONFIG_ID_30, 0, static_cast<int64_t>(1e9f / 30));
72
73 // Test device configurations
74 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60OnlyConfigDevice = {mConfig60};
75 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90Device = {mConfig60, mConfig90};
76 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentGroups =
77 {mConfig60, mConfig90DifferentGroup};
78 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90DeviceWithDifferentResolutions =
79 {mConfig60, mConfig90DifferentResolution};
80 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_72_90Device = {mConfig60,
81 mConfig90,
82 mConfig72};
83 std::vector<std::shared_ptr<const HWC2::Display::Config>> m60_90_72_120Device = {mConfig60,
84 mConfig90,
85 mConfig72,
86 mConfig120};
87 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90_120Device = {mConfig60,
88 mConfig90,
89 mConfig72,
90 mConfig120,
91 mConfig30};
92 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60Device =
93 {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup, mConfig120DifferentGroup,
94 mConfig30};
95 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_72_90Device =
96 {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup, mConfig30};
97 std::vector<std::shared_ptr<const HWC2::Display::Config>> m30_60_90Device =
98 {mConfig60, mConfig90, mConfig72DifferentGroup, mConfig120DifferentGroup, mConfig30};
99
100 // Expected RefreshRate objects
101 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, "60fps", 60,
102 RefreshRate::ConstructorTag(0)};
103 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
104 createConfig(HWC_CONFIG_ID_60, 0, 16666665), "60fps", 60,
105 RefreshRate::ConstructorTag(0)};
106 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, "90fps", 90,
107 RefreshRate::ConstructorTag(0)};
108 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
109 "90fps", 90, RefreshRate::ConstructorTag(0)};
110 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
111 mConfig90DifferentResolution, "90fps", 90,
112 RefreshRate::ConstructorTag(0)};
113 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, "72fps", 72,
114 RefreshRate::ConstructorTag(0)};
115 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, "30fps", 30,
116 RefreshRate::ConstructorTag(0)};
117 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, "120fps", 120,
118 RefreshRate::ConstructorTag(0)};
119
120 Hwc2::mock::Display mDisplay;
121
122private:
123 std::shared_ptr<const HWC2::Display::Config> createConfig(HwcConfigIndexType configId,
124 int32_t configGroup,
125 int64_t vsyncPeriod,
126 int32_t hight = -1,
127 int32_t width = -1);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700128};
129
Ady Abrahamabc27602020-04-08 17:20:29 -0700130using Builder = HWC2::Display::Config::Builder;
131
Alec Mouri0a1cc962019-03-14 12:33:02 -0700132RefreshRateConfigsTest::RefreshRateConfigsTest() {
133 const ::testing::TestInfo* const test_info =
134 ::testing::UnitTest::GetInstance()->current_test_info();
135 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
136}
137
138RefreshRateConfigsTest::~RefreshRateConfigsTest() {
139 const ::testing::TestInfo* const test_info =
140 ::testing::UnitTest::GetInstance()->current_test_info();
141 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
142}
143
Ady Abrahamabc27602020-04-08 17:20:29 -0700144std::shared_ptr<const HWC2::Display::Config> RefreshRateConfigsTest::createConfig(
145 HwcConfigIndexType configId, int32_t configGroup, int64_t vsyncPeriod, int32_t hight,
146 int32_t width) {
Peiyong Line9d809e2020-04-14 13:10:48 -0700147 return HWC2::Display::Config::Builder(mDisplay, hal::HWConfigId(configId.value()))
Ady Abrahamabc27602020-04-08 17:20:29 -0700148 .setVsyncPeriod(int32_t(vsyncPeriod))
149 .setConfigGroup(configGroup)
150 .setHeight(hight)
151 .setWidth(width)
152 .build();
153}
154
Alec Mouri0a1cc962019-03-14 12:33:02 -0700155namespace {
156/* ------------------------------------------------------------------------
157 * Test cases
158 */
Ady Abraham2139f732019-11-13 18:56:40 -0800159TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700160 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700161 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
162 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700163}
164
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100165TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100166 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700167 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
168 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasf734df42020-04-13 21:09:28 -0700169 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HwcConfigIndexType(10), {60, 60}}), 0);
170 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {20, 40}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100171}
172
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700173TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700174 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700175 std::make_unique<RefreshRateConfigs>(m60_90Device,
176 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700177
Ady Abraham2e1dd892020-03-05 13:48:36 -0800178 const auto& minRate = refreshRateConfigs->getMinRefreshRate();
179 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
Alec Mouri0a1cc962019-03-14 12:33:02 -0700180
Ady Abrahamabc27602020-04-08 17:20:29 -0700181 ASSERT_EQ(mExpected60Config, minRate);
182 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800183
Ady Abraham2e1dd892020-03-05 13:48:36 -0800184 const auto& minRateByPolicy = refreshRateConfigs->getMinRefreshRateByPolicy();
185 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800186 ASSERT_EQ(minRateByPolicy, minRate);
187 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188}
Ady Abraham2139f732019-11-13 18:56:40 -0800189
190TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800191 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700192 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
193 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800194
Ady Abraham2e1dd892020-03-05 13:48:36 -0800195 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
196 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
197 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
198 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800199
Ady Abrahamabc27602020-04-08 17:20:29 -0700200 ASSERT_EQ(mExpected60Config, minRate);
201 ASSERT_EQ(mExpected60Config, minRate60);
202 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800203
Steven Thomasf734df42020-04-13 21:09:28 -0700204 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800205 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
206
Ady Abraham2e1dd892020-03-05 13:48:36 -0800207 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
208 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800209
Ady Abrahamabc27602020-04-08 17:20:29 -0700210 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
211 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
212 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
213}
214
215TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
216 auto refreshRateConfigs =
217 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
218 /*currentConfigId=*/HWC_CONFIG_ID_60);
219
220 const auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
221 const auto& performanceRate = refreshRateConfigs->getMaxRefreshRate();
222 const auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
223 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
224
225 ASSERT_EQ(mExpected60Config, minRate);
226 ASSERT_EQ(mExpected60Config, minRate60);
227 ASSERT_EQ(mExpected60Config, performanceRate60);
228
Steven Thomasf734df42020-04-13 21:09:28 -0700229 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700230 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
231
232 const auto& minRate90 = refreshRateConfigs->getMinRefreshRateByPolicy();
233 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
234
235 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
236 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
237 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800238}
239
240TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800241 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700242 std::make_unique<RefreshRateConfigs>(m60_90Device,
243 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800244
Ady Abraham2e1dd892020-03-05 13:48:36 -0800245 auto& minRate = refreshRateConfigs->getMinRefreshRateByPolicy();
246 auto& performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800247
Ady Abrahamabc27602020-04-08 17:20:29 -0700248 ASSERT_EQ(mExpected60Config, minRate);
249 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800250
Steven Thomasf734df42020-04-13 21:09:28 -0700251 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800252
Ady Abraham2e1dd892020-03-05 13:48:36 -0800253 auto& minRate60 = refreshRateConfigs->getMinRefreshRateByPolicy();
254 auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700255 ASSERT_EQ(mExpected60Config, minRate60);
256 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800257}
258
259TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800260 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700261 std::make_unique<RefreshRateConfigs>(m60_90Device,
262 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800263 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800264 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700265 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800266 }
267
268 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
269 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800270 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700271 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800272 }
273
Steven Thomasf734df42020-04-13 21:09:28 -0700274 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800275 {
Ady Abraham2e1dd892020-03-05 13:48:36 -0800276 auto& current = refreshRateConfigs->getCurrentRefreshRate();
Ady Abrahamabc27602020-04-08 17:20:29 -0700277 EXPECT_EQ(current.getConfigId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800278 }
279}
280
281TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent) {
Ady Abraham2139f732019-11-13 18:56:40 -0800282 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700283 std::make_unique<RefreshRateConfigs>(m60_90Device,
284 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800285
Ady Abraham8a82ba62020-01-17 12:43:17 -0800286 const auto makeLayerRequirements = [](float refreshRate) -> std::vector<LayerRequirement> {
287 return {{"testLayer", LayerVoteType::Heuristic, refreshRate, 1.0f}};
288 };
289
Ady Abrahamabc27602020-04-08 17:20:29 -0700290 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800291 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700292 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800293 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700294 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800295 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700296 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800297 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700298 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800299 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800300
Steven Thomasf734df42020-04-13 21:09:28 -0700301 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700302 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800303 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700304 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800305 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700306 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800307 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700308 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800309 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700310 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800311 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Ady Abraham2139f732019-11-13 18:56:40 -0800312
Steven Thomasf734df42020-04-13 21:09:28 -0700313 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700314 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800315 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700316 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800317 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700318 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800319 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700320 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800321 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700322 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800323 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
Steven Thomasf734df42020-04-13 21:09:28 -0700324 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700325 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800326 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(90.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700327 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800328 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(60.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700329 EXPECT_EQ(mExpected90Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800330 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(45.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700331 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800332 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(30.0f)));
Ady Abrahamabc27602020-04-08 17:20:29 -0700333 EXPECT_EQ(mExpected60Config,
Ady Abraham8a82ba62020-01-17 12:43:17 -0800334 refreshRateConfigs->getRefreshRateForContent(makeLayerRequirements(24.0f)));
335}
336
Steven Thomasbb374322020-04-28 22:47:16 -0700337TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800338 bool ignored;
Ady Abrahamabc27602020-04-08 17:20:29 -0700339 auto refreshRateConfigs =
340 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
341 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800342
343 // If there are not layers, there is not content detection, so return the current
344 // refresh rate.
345 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamabc27602020-04-08 17:20:29 -0700346 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700347 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/
348 false, /*idle*/ false, &ignored));
Ana Krulec3d367c82020-02-25 15:02:01 -0800349
350 // Current refresh rate can always be changed.
351 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60);
Ady Abrahamabc27602020-04-08 17:20:29 -0700352 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700353 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/
354 false, /*idle*/ false, &ignored));
Ana Krulec3d367c82020-02-25 15:02:01 -0800355}
356
Steven Thomasbb374322020-04-28 22:47:16 -0700357TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800358 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700360 std::make_unique<RefreshRateConfigs>(m60_90Device,
361 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
363 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
364 auto& lr = layers[0];
365
366 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800367 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700368 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700369 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
370 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
372 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800373 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700374 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700375 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
376 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377
378 lr.desiredRefreshRate = 90.0f;
379 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800380 lr.name = "90Hz Heuristic";
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 = 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,
Steven Thomasbb374322020-04-28 22:47:16 -0700388 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
389 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
391 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800392 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700393 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700394 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
395 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800396
397 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800398 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700399 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700400 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
401 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
403 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800404 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700405 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700406 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
407 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800409 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700410 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
412 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700413 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700414 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
415 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
417 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700418 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700419 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
420 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
422 lr.desiredRefreshRate = 90.0f;
423 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700424 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700425 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
426 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
428 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700429 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700430 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
431 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
433 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700434 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700435 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
436 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
438 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700439 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700440 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
441 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
443 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700444 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700445 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
446 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
Steven Thomasf734df42020-04-13 21:09:28 -0700448 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
450 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700451 EXPECT_EQ(mExpected90Config,
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
455 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700456 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700457 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
458 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
460 lr.desiredRefreshRate = 90.0f;
461 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700462 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700463 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
464 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465
466 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700467 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700468 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
469 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
471 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700472 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700473 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
474 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
476 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700477 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700478 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
479 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
481 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700482 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700483 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
484 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800485
Steven Thomasf734df42020-04-13 21:09:28 -0700486 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700488 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700489 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
490 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800491
492 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700493 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700494 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
495 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800496
497 lr.desiredRefreshRate = 90.0f;
498 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700499 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700500 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
501 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800502
503 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700504 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700505 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
506 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800507
508 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700509 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700510 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
511 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800512
513 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700514 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700515 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
516 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800517
518 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700519 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700520 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
521 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800522}
523
Steven Thomasbb374322020-04-28 22:47:16 -0700524TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800525 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800526 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700527 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
528 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529
530 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
531 auto& lr = layers[0];
532
533 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700534 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700535 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
536 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800537
538 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700539 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700540 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
541 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800542
543 lr.desiredRefreshRate = 90.0f;
544 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700545 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700546 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
547 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548
549 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700550 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700551 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
552 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553
554 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700556 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
557 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800558
559 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700560 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700561 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
562 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800563
564 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700565 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700566 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
567 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800568}
569
Steven Thomasbb374322020-04-28 22:47:16 -0700570TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800571 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800572 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700573 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
574 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800575
576 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
577 LayerRequirement{.weight = 1.0f}};
578 auto& lr1 = layers[0];
579 auto& lr2 = layers[1];
580
581 lr1.desiredRefreshRate = 24.0f;
582 lr1.vote = LayerVoteType::Heuristic;
583 lr2.desiredRefreshRate = 60.0f;
584 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700585 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700586 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
587 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800588
589 lr1.desiredRefreshRate = 24.0f;
590 lr1.vote = LayerVoteType::Heuristic;
591 lr2.desiredRefreshRate = 48.0f;
592 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700593 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700594 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
595 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800596
597 lr1.desiredRefreshRate = 24.0f;
598 lr1.vote = LayerVoteType::Heuristic;
599 lr2.desiredRefreshRate = 48.0f;
600 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700601 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700602 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
603 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800604}
605
Steven Thomasbb374322020-04-28 22:47:16 -0700606TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800607 bool ignored;
Ady Abraham71c437d2020-01-31 15:56:57 -0800608 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700609 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
610 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800611
612 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
613 LayerRequirement{.weight = 1.0f}};
614 auto& lr1 = layers[0];
615 auto& lr2 = layers[1];
616
617 lr1.desiredRefreshRate = 24.0f;
618 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800619 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800620 lr2.desiredRefreshRate = 60.0f;
621 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800622 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700623 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700624 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
625 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800626
627 lr1.desiredRefreshRate = 24.0f;
628 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800630 lr2.desiredRefreshRate = 60.0f;
631 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800632 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700633 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700634 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
635 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800636
637 lr1.desiredRefreshRate = 24.0f;
638 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800640 lr2.desiredRefreshRate = 60.0f;
641 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800642 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700643 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700644 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
645 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800646
647 lr1.desiredRefreshRate = 24.0f;
648 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800650 lr2.desiredRefreshRate = 90.0f;
651 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800652 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700653 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700654 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
655 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656
657 lr1.desiredRefreshRate = 24.0f;
658 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
659 lr1.name = "24Hz ExplicitExactOrMultiple";
660 lr2.desiredRefreshRate = 90.0f;
661 lr2.vote = LayerVoteType::ExplicitDefault;
662 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700663 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700664 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
665 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800666
667 lr1.desiredRefreshRate = 24.0f;
668 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800669 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800670 lr2.desiredRefreshRate = 90.0f;
671 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800672 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700673 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700674 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
675 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800676
677 lr1.desiredRefreshRate = 24.0f;
678 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800679 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800680 lr2.desiredRefreshRate = 90.0f;
681 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800682 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700683 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700684 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
685 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800686
687 lr1.desiredRefreshRate = 24.0f;
688 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800689 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800690 lr2.desiredRefreshRate = 90.0f;
691 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800692 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700693 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700694 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
695 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800696
697 lr1.desiredRefreshRate = 24.0f;
698 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800699 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800700 lr2.desiredRefreshRate = 90.0f;
701 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800702 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700703 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700704 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
705 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800706}
707
Steven Thomasbb374322020-04-28 22:47:16 -0700708TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800709 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800710 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700711 std::make_unique<RefreshRateConfigs>(m30_60Device,
712 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800713
714 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
715 auto& lr = layers[0];
716
717 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700718 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700719 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
720 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800721
722 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700723 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700724 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
725 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800726
727 lr.desiredRefreshRate = 90.0f;
728 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700729 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700730 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
731 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800732
733 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700734 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700735 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
736 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800737
738 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700739 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700740 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
741 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800742
743 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700744 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700745 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
746 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800747
748 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700749 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700750 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
751 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752}
753
Steven Thomasbb374322020-04-28 22:47:16 -0700754TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800755 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800756 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700757 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
758 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800759
760 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
761 auto& lr = layers[0];
762
763 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800764 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700765 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700766 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
767 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800768
769 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800770 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700771 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700772 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
773 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800774
775 lr.desiredRefreshRate = 90.0f;
776 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800777 lr.name = "90Hz Heuristic";
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 = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800783 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700784 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700785 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
786 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700787 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700788 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
789 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800790
791 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800792 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700793 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700794 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
795 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700796 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700797 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
798 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800799
800 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800801 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700802 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700803 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
804 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700805 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700806 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
807 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808
809 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800810 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700811 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700812 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
813 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700814 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700815 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
816 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800817
818 lr.desiredRefreshRate = 24.0f;
819 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
820 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700821 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700822 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
823 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700824 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700825 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
826 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800827}
828
Steven Thomasbb374322020-04-28 22:47:16 -0700829TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800830 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800831 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700832 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
833 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834
835 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
836 LayerRequirement{.weight = 1.0f}};
837 auto& lr1 = layers[0];
838 auto& lr2 = layers[1];
839
840 lr1.vote = LayerVoteType::Min;
841 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700842 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700843 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
844 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845
846 lr1.vote = LayerVoteType::Min;
847 lr2.vote = LayerVoteType::Heuristic;
848 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 EXPECT_EQ(mExpected60Config,
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;
Ady Abraham71c437d2020-01-31 15:56:57 -0800854 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800855 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::Max;
861 lr2.vote = LayerVoteType::Heuristic;
862 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 EXPECT_EQ(mExpected90Config,
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;
Ady Abraham71c437d2020-01-31 15:56:57 -0800868 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800869 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(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::Heuristic;
875 lr1.desiredRefreshRate = 15.0f;
876 lr2.vote = LayerVoteType::Heuristic;
877 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700878 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700879 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
880 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800881
882 lr1.vote = LayerVoteType::Heuristic;
883 lr1.desiredRefreshRate = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800884 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800885 lr2.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700886 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700887 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
888 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800889}
890
Steven Thomasbb374322020-04-28 22:47:16 -0700891TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800892 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800893 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700894 std::make_unique<RefreshRateConfigs>(m60_90Device,
895 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800896
897 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
898 auto& lr = layers[0];
899
Ady Abraham71c437d2020-01-31 15:56:57 -0800900 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800901 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
902 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800903 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700904 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
905 /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -0700906 printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str());
907 EXPECT_EQ(mExpected60Config, refreshRate);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800908 }
909}
910
911TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800912 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700913 std::make_unique<RefreshRateConfigs>(m60_90Device,
914 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -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::Heuristic;
922 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800923 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800924 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700925 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800926
927 lr1.vote = LayerVoteType::Heuristic;
928 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800929 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800930 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700931 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800932}
933
Steven Thomasbb374322020-04-28 22:47:16 -0700934TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800935 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800936 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700937 std::make_unique<RefreshRateConfigs>(m60_90Device,
938 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800939
940 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
941 LayerRequirement{.weight = 1.0f}};
942 auto& lr1 = layers[0];
943 auto& lr2 = layers[1];
944
945 lr1.vote = LayerVoteType::Heuristic;
946 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800947 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800948 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700949 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700950 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
951 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800952
953 lr1.vote = LayerVoteType::ExplicitDefault;
954 lr1.desiredRefreshRate = 90.0f;
955 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
956 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700957 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700958 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
959 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800960
961 lr1.vote = LayerVoteType::Heuristic;
962 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800963 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800964 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700965 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700966 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
967 /*idle*/ false, &ignored));
Ady Abraham2139f732019-11-13 18:56:40 -0800968}
969
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800970TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700971 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
972 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
973 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
974 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
975 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800976}
977
Steven Thomasbb374322020-04-28 22:47:16 -0700978TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800979 bool ignored;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800980 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700981 std::make_unique<RefreshRateConfigs>(m60_90Device,
982 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800983
984 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
985 auto& lr = layers[0];
986
Ady Abraham71c437d2020-01-31 15:56:57 -0800987 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800988 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
989 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800990 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700991 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
992 /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -0700993 printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str());
994 EXPECT_EQ(mExpected90Config, refreshRate);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800995 }
996}
997
Steven Thomasbb374322020-04-28 22:47:16 -0700998TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800999 bool ignored;
Ady Abraham34702102020-02-10 14:12:05 -08001000 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001001 std::make_unique<RefreshRateConfigs>(m60_90Device,
1002 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001003
1004 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1005 LayerRequirement{.weight = 1.0f}};
1006 auto& lr1 = layers[0];
1007 auto& lr2 = layers[1];
1008
1009 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1010 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001011 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001012 lr2.vote = LayerVoteType::Heuristic;
1013 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001014 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001015 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001016 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1017 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001018
1019 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1020 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001021 lr1.name = "60Hz ExplicitExactOrMultiple";
1022 lr2.vote = LayerVoteType::ExplicitDefault;
1023 lr2.desiredRefreshRate = 90.0f;
1024 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001025 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001026 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1027 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001028
1029 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1030 lr1.desiredRefreshRate = 60.0f;
1031 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001032 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001033 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001034 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001035 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1036 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001037
1038 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1039 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001040 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001041 lr2.vote = LayerVoteType::Heuristic;
1042 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001043 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001044 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001045 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1046 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001047
1048 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1049 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001050 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001051 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001052 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001053 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001054 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1055 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001056}
1057
1058TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -08001059 bool ignored;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001060 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001061 std::make_unique<RefreshRateConfigs>(m60_90Device,
1062 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001063
1064 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1065 LayerRequirement{.weight = 1.0f}};
1066 auto& lr1 = layers[0];
1067 auto& lr2 = layers[1];
1068
1069 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1070 lr1.desiredRefreshRate = 60.0f;
1071 lr1.name = "60Hz ExplicitExactOrMultiple";
1072 lr2.vote = LayerVoteType::NoVote;
1073 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001074 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001075 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001076
1077 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1078 lr1.desiredRefreshRate = 60.0f;
1079 lr1.name = "60Hz ExplicitExactOrMultiple";
1080 lr2.vote = LayerVoteType::NoVote;
1081 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001082 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001083 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001084
1085 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1086 lr1.desiredRefreshRate = 60.0f;
1087 lr1.name = "60Hz ExplicitExactOrMultiple";
1088 lr2.vote = LayerVoteType::Max;
1089 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001090 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001091 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001092
1093 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1094 lr1.desiredRefreshRate = 60.0f;
1095 lr1.name = "60Hz ExplicitExactOrMultiple";
1096 lr2.vote = LayerVoteType::Max;
1097 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001098 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001099 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001100
1101 // The other layer starts to provide buffers
1102 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1103 lr1.desiredRefreshRate = 60.0f;
1104 lr1.name = "60Hz ExplicitExactOrMultiple";
1105 lr2.vote = LayerVoteType::Heuristic;
1106 lr2.desiredRefreshRate = 90.0f;
1107 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001108 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001109 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001110}
1111
1112TEST_F(RefreshRateConfigsTest, touchConsidered) {
1113 bool touchConsidered;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001114 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001115 std::make_unique<RefreshRateConfigs>(m60_90Device,
1116 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001117
Steven Thomasbb374322020-04-28 22:47:16 -07001118 refreshRateConfigs->getBestRefreshRate({}, false, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001119 EXPECT_EQ(false, touchConsidered);
1120
Steven Thomasbb374322020-04-28 22:47:16 -07001121 refreshRateConfigs->getBestRefreshRate({}, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001122 EXPECT_EQ(true, touchConsidered);
1123
1124 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1125 LayerRequirement{.weight = 1.0f}};
1126 auto& lr1 = layers[0];
1127 auto& lr2 = layers[1];
1128
1129 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1130 lr1.desiredRefreshRate = 60.0f;
1131 lr1.name = "60Hz ExplicitExactOrMultiple";
1132 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001133 lr2.desiredRefreshRate = 60.0f;
1134 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001135 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001136 EXPECT_EQ(true, touchConsidered);
1137
1138 lr1.vote = LayerVoteType::ExplicitDefault;
1139 lr1.desiredRefreshRate = 60.0f;
1140 lr1.name = "60Hz ExplicitExactOrMultiple";
1141 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001142 lr2.desiredRefreshRate = 60.0f;
1143 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001144 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001145 EXPECT_EQ(false, touchConsidered);
1146
1147 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1148 lr1.desiredRefreshRate = 60.0f;
1149 lr1.name = "60Hz ExplicitExactOrMultiple";
1150 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001151 lr2.desiredRefreshRate = 60.0f;
1152 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001153 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001154 EXPECT_EQ(true, touchConsidered);
1155
1156 lr1.vote = LayerVoteType::ExplicitDefault;
1157 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001158 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001159 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001160 lr2.desiredRefreshRate = 60.0f;
1161 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001162 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001163 EXPECT_EQ(false, touchConsidered);
Ady Abraham34702102020-02-10 14:12:05 -08001164}
1165
Steven Thomasbb374322020-04-28 22:47:16 -07001166TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001167 bool ignored;
Ady Abrahamabc27602020-04-08 17:20:29 -07001168 auto refreshRateConfigs =
1169 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1170 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001171
1172 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1173 auto& lr = layers[0];
1174
1175 // Prepare a table with the vote and the expected refresh rate
1176 const std::vector<std::pair<float, float>> testCases = {
1177 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1178
1179 {100, 90}, {90, 90}, {89, 90},
1180
1181 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1182
1183 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1184
1185 {55, 90}, {50, 90}, {45, 90},
1186
1187 {42, 120}, {40, 120}, {39, 120},
1188
1189 {37, 72}, {36, 72}, {35, 72},
1190
1191 {30, 60},
1192 };
1193
1194 for (const auto& test : testCases) {
1195 lr.vote = LayerVoteType::ExplicitDefault;
1196 lr.desiredRefreshRate = test.first;
1197
1198 std::stringstream ss;
1199 ss << "ExplicitDefault " << test.first << " fps";
1200 lr.name = ss.str();
1201
1202 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -07001203 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -07001204 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001205 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1206 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001207}
1208
Steven Thomasd4071902020-03-24 16:02:53 -07001209TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001210 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001211 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1212 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001213
1214 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1215 auto& layer = layers[0];
1216 layer.vote = LayerVoteType::ExplicitDefault;
1217 layer.desiredRefreshRate = 90.0f;
1218 layer.name = "90Hz ExplicitDefault";
1219
1220 bool touchConsidered;
1221 ASSERT_EQ(HWC_CONFIG_ID_60,
Steven Thomasbb374322020-04-28 22:47:16 -07001222 refreshRateConfigs
1223 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001224 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001225
1226 RefreshRateConfigs::Policy policy;
1227 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1228 policy.allowGroupSwitching = true;
1229 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1230 ASSERT_EQ(HWC_CONFIG_ID_90,
Steven Thomasbb374322020-04-28 22:47:16 -07001231 refreshRateConfigs
1232 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001233 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001234}
1235
Steven Thomasf734df42020-04-13 21:09:28 -07001236TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1237 auto refreshRateConfigs =
1238 std::make_unique<RefreshRateConfigs>(m60_90Device,
1239 /*currentConfigId=*/HWC_CONFIG_ID_60);
1240
1241 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1242 layers[0].name = "Test layer";
1243
Steven Thomasbb374322020-04-28 22:47:16 -07001244 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001245 // given voteType and fps.
1246 auto getFrameRate = [&](LayerVoteType voteType, float fps,
1247 bool touchActive = false) -> HwcConfigIndexType {
1248 layers[0].vote = voteType;
1249 layers[0].desiredRefreshRate = fps;
1250 bool touchConsidered;
Steven Thomasbb374322020-04-28 22:47:16 -07001251 return refreshRateConfigs
1252 ->getBestRefreshRate(layers, touchActive, /*idle*/ false, &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001253 .getConfigId();
1254 };
1255
1256 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1257 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1258 0);
1259 bool touchConsidered;
1260 EXPECT_EQ(HWC_CONFIG_ID_60,
1261 refreshRateConfigs
Steven Thomasbb374322020-04-28 22:47:16 -07001262 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle*/ false,
1263 &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001264 .getConfigId());
1265 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1266 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1267 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1268 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1269 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1270 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1271
1272 // Touch boost should be restricted to the primary range.
1273 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1274 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1275 // shouldn't drag us back down to the primary range max.
1276 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
1277 EXPECT_EQ(HWC_CONFIG_ID_90,
1278 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1279
1280 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1281 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1282 0);
1283 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1284 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1285 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1286 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1287 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1288 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1289}
1290
Steven Thomasbb374322020-04-28 22:47:16 -07001291TEST_F(RefreshRateConfigsTest, idle) {
1292 auto refreshRateConfigs =
1293 std::make_unique<RefreshRateConfigs>(m60_90Device,
1294 /*currentConfigId=*/HWC_CONFIG_ID_60);
1295
1296 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1297 layers[0].name = "Test layer";
1298
1299 auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> HwcConfigIndexType {
1300 layers[0].vote = voteType;
1301 layers[0].desiredRefreshRate = 90.f;
1302 bool touchConsidered;
1303 return refreshRateConfigs
1304 ->getBestRefreshRate(layers, touchActive, /*idle=*/true, &touchConsidered)
1305 .getConfigId();
1306 };
1307
1308 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1309 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1310 0);
1311
1312 // Idle should be lower priority than touch boost.
1313 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, true));
1314 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, true));
1315 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, true));
1316 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, true));
1317 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitDefault, true));
1318 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, true));
1319
1320 // With no layers, idle should still be lower priority than touch boost.
1321 bool touchConsidered;
1322 EXPECT_EQ(HWC_CONFIG_ID_90,
1323 refreshRateConfigs
1324 ->getBestRefreshRate({}, /*touchActive=*/true, /*idle=*/true,
1325 &touchConsidered)
1326 .getConfigId());
1327
1328 // Idle should be higher precedence than other layer frame rate considerations.
1329 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1330 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, false));
1331 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, false));
1332 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, false));
1333 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, false));
1334 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitDefault, false));
1335 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, false));
1336
1337 // Idle should be applied rather than the current config when there are no layers.
1338 EXPECT_EQ(HWC_CONFIG_ID_60,
1339 refreshRateConfigs
1340 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle=*/true,
1341 &touchConsidered)
1342 .getConfigId());
1343}
1344
Alec Mouri0a1cc962019-03-14 12:33:02 -07001345} // namespace
1346} // namespace scheduler
1347} // namespace android