blob: c919e93795d56985a6edb50746fdf7f4be08a8e4 [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
Steven Thomasdebafed2020-05-18 17:30:35 -0700343 // If there are no layers we select the default frame rate, which is the max of the primary
344 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800345 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700346 EXPECT_EQ(mExpected90Config,
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
Steven Thomasdebafed2020-05-18 17:30:35 -0700350 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700351 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700352 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/
353 false, /*idle*/ false, &ignored));
Ana Krulec3d367c82020-02-25 15:02:01 -0800354}
355
Steven Thomasbb374322020-04-28 22:47:16 -0700356TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800357 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700359 std::make_unique<RefreshRateConfigs>(m60_90Device,
360 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
362 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
363 auto& lr = layers[0];
364
365 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800366 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700368 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
369 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
371 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800372 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700373 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700374 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
375 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376
377 lr.desiredRefreshRate = 90.0f;
378 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800379 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700380 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700381 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
382 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383
384 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800385 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700386 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700387 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
388 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
390 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800391 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700392 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700393 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
394 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
396 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800397 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700398 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700399 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
400 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
402 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800403 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700404 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700405 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
406 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800408 lr.name = "";
Steven Thomasf734df42020-04-13 21:09:28 -0700409 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800410
411 lr.vote = LayerVoteType::Min;
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
416 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700417 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700418 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
419 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
421 lr.desiredRefreshRate = 90.0f;
422 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700423 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700424 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
425 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
427 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700428 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700429 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
430 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431
432 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700433 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700434 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
435 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
437 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700438 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700439 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
440 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
442 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700443 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700444 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
445 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Steven Thomasf734df42020-04-13 21:09:28 -0700447 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90, 90}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448
449 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700450 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700451 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
452 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
454 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700455 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700456 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
457 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800458
459 lr.desiredRefreshRate = 90.0f;
460 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700461 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700462 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
463 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464
465 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700466 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700467 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
468 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
470 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700472 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
473 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
475 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700476 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700477 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
478 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479
480 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700481 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700482 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
483 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484
Steven Thomasf734df42020-04-13 21:09:28 -0700485 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0, 120}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700488 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
489 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490
491 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700492 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700493 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
494 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800495
496 lr.desiredRefreshRate = 90.0f;
497 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700498 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700499 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
500 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501
502 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700503 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700504 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
505 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800506
507 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700508 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700509 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
510 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800511
512 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700513 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700514 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
515 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800516
517 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700518 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700519 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
520 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800521}
522
Steven Thomasbb374322020-04-28 22:47:16 -0700523TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800524 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800525 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700526 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
527 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800528
529 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
530 auto& lr = layers[0];
531
532 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700533 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700534 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
535 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800536
537 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700538 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700539 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
540 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541
542 lr.desiredRefreshRate = 90.0f;
543 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700544 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700545 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
546 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547
548 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700549 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700550 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
551 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800552
553 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700554 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700555 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
556 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557
558 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700559 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700560 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
561 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800562
563 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700564 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700565 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
566 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800567}
568
Steven Thomasbb374322020-04-28 22:47:16 -0700569TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800570 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700572 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
573 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800574
575 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
576 LayerRequirement{.weight = 1.0f}};
577 auto& lr1 = layers[0];
578 auto& lr2 = layers[1];
579
580 lr1.desiredRefreshRate = 24.0f;
581 lr1.vote = LayerVoteType::Heuristic;
582 lr2.desiredRefreshRate = 60.0f;
583 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700584 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700585 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
586 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800587
588 lr1.desiredRefreshRate = 24.0f;
589 lr1.vote = LayerVoteType::Heuristic;
590 lr2.desiredRefreshRate = 48.0f;
591 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700592 EXPECT_EQ(mExpected72Config,
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
Steven Thomasbb374322020-04-28 22:47:16 -0700605TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800606 bool ignored;
Ady Abraham71c437d2020-01-31 15:56:57 -0800607 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700608 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
609 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800610
611 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
612 LayerRequirement{.weight = 1.0f}};
613 auto& lr1 = layers[0];
614 auto& lr2 = layers[1];
615
616 lr1.desiredRefreshRate = 24.0f;
617 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800618 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr2.desiredRefreshRate = 60.0f;
620 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800621 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700622 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700623 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
624 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800625
626 lr1.desiredRefreshRate = 24.0f;
627 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800629 lr2.desiredRefreshRate = 60.0f;
630 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800631 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700632 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700633 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
634 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800635
636 lr1.desiredRefreshRate = 24.0f;
637 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800639 lr2.desiredRefreshRate = 60.0f;
640 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800641 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700642 EXPECT_EQ(mExpected120Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700643 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
644 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800645
646 lr1.desiredRefreshRate = 24.0f;
647 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800648 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800649 lr2.desiredRefreshRate = 90.0f;
650 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800651 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700652 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700653 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
654 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800655
656 lr1.desiredRefreshRate = 24.0f;
657 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
658 lr1.name = "24Hz ExplicitExactOrMultiple";
659 lr2.desiredRefreshRate = 90.0f;
660 lr2.vote = LayerVoteType::ExplicitDefault;
661 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700662 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700663 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
664 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800665
666 lr1.desiredRefreshRate = 24.0f;
667 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800668 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800669 lr2.desiredRefreshRate = 90.0f;
670 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800671 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700672 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700673 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
674 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800675
676 lr1.desiredRefreshRate = 24.0f;
677 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800678 lr1.name = "24Hz Heuristic";
Ady Abraham71c437d2020-01-31 15:56:57 -0800679 lr2.desiredRefreshRate = 90.0f;
680 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800681 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700682 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700683 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
684 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800685
686 lr1.desiredRefreshRate = 24.0f;
687 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800688 lr1.name = "24Hz ExplicitExactOrMultiple";
Ady Abraham71c437d2020-01-31 15:56:57 -0800689 lr2.desiredRefreshRate = 90.0f;
690 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800691 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700692 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700693 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
694 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800695
696 lr1.desiredRefreshRate = 24.0f;
697 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800698 lr1.name = "24Hz ExplicitDefault";
Ady Abraham71c437d2020-01-31 15:56:57 -0800699 lr2.desiredRefreshRate = 90.0f;
700 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700702 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700703 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
704 /*idle*/ false, &ignored));
Ady Abraham71c437d2020-01-31 15:56:57 -0800705}
706
Steven Thomasbb374322020-04-28 22:47:16 -0700707TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800708 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800709 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700710 std::make_unique<RefreshRateConfigs>(m30_60Device,
711 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800712
713 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
714 auto& lr = layers[0];
715
716 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700717 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700718 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
719 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800720
721 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700722 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700723 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
724 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800725
726 lr.desiredRefreshRate = 90.0f;
727 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700728 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700729 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
730 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800731
732 lr.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700733 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700734 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
735 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800736
737 lr.desiredRefreshRate = 45.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700738 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700739 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
740 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800741
742 lr.desiredRefreshRate = 30.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700743 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700744 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
745 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800746
747 lr.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700748 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700749 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
750 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800751}
752
Steven Thomasbb374322020-04-28 22:47:16 -0700753TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800754 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700756 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
757 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800758
759 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
760 auto& lr = layers[0];
761
762 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800763 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700764 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700765 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
766 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800767
768 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800769 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700770 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700771 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
772 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800773
774 lr.desiredRefreshRate = 90.0f;
775 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800776 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700777 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700778 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
779 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780
781 lr.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800782 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700783 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700784 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
785 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700786 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700787 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
788 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800789
790 lr.desiredRefreshRate = 45.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800791 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700792 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700793 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
794 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700795 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700796 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
797 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800798
799 lr.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800800 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700801 EXPECT_EQ(mExpected30Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700802 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
803 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700804 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700805 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
806 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800807
808 lr.desiredRefreshRate = 24.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800809 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700811 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
812 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700813 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700814 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
815 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800816
817 lr.desiredRefreshRate = 24.0f;
818 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
819 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700820 EXPECT_EQ(mExpected72Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700821 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
822 /*idle*/ false, &ignored));
Ady Abrahamabc27602020-04-08 17:20:29 -0700823 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700824 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true,
825 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826}
827
Steven Thomasbb374322020-04-28 22:47:16 -0700828TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800829 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800830 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700831 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
832 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800833
834 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
835 LayerRequirement{.weight = 1.0f}};
836 auto& lr1 = layers[0];
837 auto& lr2 = layers[1];
838
839 lr1.vote = LayerVoteType::Min;
840 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700841 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700842 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
843 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844
845 lr1.vote = LayerVoteType::Min;
846 lr2.vote = LayerVoteType::Heuristic;
847 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700848 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700849 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
850 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800851
852 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800853 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800854 lr2.desiredRefreshRate = 24.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700855 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700856 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
857 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858
859 lr1.vote = LayerVoteType::Max;
860 lr2.vote = LayerVoteType::Heuristic;
861 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700862 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700863 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
864 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800865
866 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800867 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800868 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700869 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700870 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
871 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800872
873 lr1.vote = LayerVoteType::Heuristic;
874 lr1.desiredRefreshRate = 15.0f;
875 lr2.vote = LayerVoteType::Heuristic;
876 lr2.desiredRefreshRate = 45.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 = 30.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800883 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884 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
Steven Thomasbb374322020-04-28 22:47:16 -0700890TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800891 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800892 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700893 std::make_unique<RefreshRateConfigs>(m60_90Device,
894 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800895
896 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
897 auto& lr = layers[0];
898
Ady Abraham71c437d2020-01-31 15:56:57 -0800899 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800900 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
901 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700903 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
904 /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -0700905 printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str());
906 EXPECT_EQ(mExpected60Config, refreshRate);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800907 }
908}
909
910TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getRefreshRateForContent_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800911 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700912 std::make_unique<RefreshRateConfigs>(m60_90Device,
913 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800914
915 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
916 LayerRequirement{.weight = 1.0f}};
917 auto& lr1 = layers[0];
918 auto& lr2 = layers[1];
919
920 lr1.vote = LayerVoteType::Heuristic;
921 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800922 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800923 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700924 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800925
926 lr1.vote = LayerVoteType::Heuristic;
927 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800928 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800929 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700930 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getRefreshRateForContent(layers));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800931}
932
Steven Thomasbb374322020-04-28 22:47:16 -0700933TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800934 bool ignored;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800935 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700936 std::make_unique<RefreshRateConfigs>(m60_90Device,
937 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800938
939 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
940 LayerRequirement{.weight = 1.0f}};
941 auto& lr1 = layers[0];
942 auto& lr2 = layers[1];
943
944 lr1.vote = LayerVoteType::Heuristic;
945 lr1.desiredRefreshRate = 60.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800946 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800947 lr2.desiredRefreshRate = 90.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700948 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700949 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
950 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951
952 lr1.vote = LayerVoteType::ExplicitDefault;
953 lr1.desiredRefreshRate = 90.0f;
954 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
955 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700956 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700957 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
958 /*idle*/ false, &ignored));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800959
960 lr1.vote = LayerVoteType::Heuristic;
961 lr1.desiredRefreshRate = 90.0f;
Ady Abraham71c437d2020-01-31 15:56:57 -0800962 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800963 lr2.desiredRefreshRate = 60.0f;
Ady Abrahamabc27602020-04-08 17:20:29 -0700964 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -0700965 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
966 /*idle*/ false, &ignored));
Ady Abraham2139f732019-11-13 18:56:40 -0800967}
968
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800969TEST_F(RefreshRateConfigsTest, testInPolicy) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700970 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004f, 60.000004f));
971 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59.0f, 60.1f));
972 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75.0f, 90.0f));
973 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011f, 90.0f));
974 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50.0f, 59.998f));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800975}
976
Steven Thomasbb374322020-04-28 22:47:16 -0700977TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800978 bool ignored;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800979 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700980 std::make_unique<RefreshRateConfigs>(m60_90Device,
981 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800982
983 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
984 auto& lr = layers[0];
985
Ady Abraham71c437d2020-01-31 15:56:57 -0800986 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800987 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
988 lr.desiredRefreshRate = fps;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800989 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -0700990 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
991 /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -0700992 printf("%.2fHz chooses %s\n", fps, refreshRate.getName().c_str());
993 EXPECT_EQ(mExpected90Config, refreshRate);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800994 }
995}
996
Steven Thomasbb374322020-04-28 22:47:16 -0700997TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham6fb599b2020-03-05 13:48:22 -0800998 bool ignored;
Ady Abraham34702102020-02-10 14:12:05 -0800999 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001000 std::make_unique<RefreshRateConfigs>(m60_90Device,
1001 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001002
1003 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1004 LayerRequirement{.weight = 1.0f}};
1005 auto& lr1 = layers[0];
1006 auto& lr2 = layers[1];
1007
1008 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1009 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001010 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001011 lr2.vote = LayerVoteType::Heuristic;
1012 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001013 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001014 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001015 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1016 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001017
1018 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1019 lr1.desiredRefreshRate = 60.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001020 lr1.name = "60Hz ExplicitExactOrMultiple";
1021 lr2.vote = LayerVoteType::ExplicitDefault;
1022 lr2.desiredRefreshRate = 90.0f;
1023 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001024 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001025 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1026 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001027
1028 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1029 lr1.desiredRefreshRate = 60.0f;
1030 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001031 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001032 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001033 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001034 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1035 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001036
1037 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1038 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001039 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001040 lr2.vote = LayerVoteType::Heuristic;
1041 lr2.desiredRefreshRate = 90.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001042 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001043 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001044 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1045 /*idle*/ false, &ignored));
Ady Abraham34702102020-02-10 14:12:05 -08001046
1047 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1048 lr1.desiredRefreshRate = 30.0f;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001049 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001050 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001051 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001052 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001053 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false,
1054 /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001055}
1056
1057TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham6fb599b2020-03-05 13:48:22 -08001058 bool ignored;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001059 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001060 std::make_unique<RefreshRateConfigs>(m60_90Device,
1061 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001062
1063 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1064 LayerRequirement{.weight = 1.0f}};
1065 auto& lr1 = layers[0];
1066 auto& lr2 = layers[1];
1067
1068 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1069 lr1.desiredRefreshRate = 60.0f;
1070 lr1.name = "60Hz ExplicitExactOrMultiple";
1071 lr2.vote = LayerVoteType::NoVote;
1072 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001073 EXPECT_EQ(mExpected60Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001074 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001075
1076 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1077 lr1.desiredRefreshRate = 60.0f;
1078 lr1.name = "60Hz ExplicitExactOrMultiple";
1079 lr2.vote = LayerVoteType::NoVote;
1080 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001081 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001082 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001083
1084 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1085 lr1.desiredRefreshRate = 60.0f;
1086 lr1.name = "60Hz ExplicitExactOrMultiple";
1087 lr2.vote = LayerVoteType::Max;
1088 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001089 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001090 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001091
1092 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1093 lr1.desiredRefreshRate = 60.0f;
1094 lr1.name = "60Hz ExplicitExactOrMultiple";
1095 lr2.vote = LayerVoteType::Max;
1096 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001097 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001098 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001099
1100 // The other layer starts to provide buffers
1101 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1102 lr1.desiredRefreshRate = 60.0f;
1103 lr1.name = "60Hz ExplicitExactOrMultiple";
1104 lr2.vote = LayerVoteType::Heuristic;
1105 lr2.desiredRefreshRate = 90.0f;
1106 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001107 EXPECT_EQ(mExpected90Config,
Steven Thomasbb374322020-04-28 22:47:16 -07001108 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001109}
1110
1111TEST_F(RefreshRateConfigsTest, touchConsidered) {
1112 bool touchConsidered;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001113 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001114 std::make_unique<RefreshRateConfigs>(m60_90Device,
1115 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001116
Steven Thomasbb374322020-04-28 22:47:16 -07001117 refreshRateConfigs->getBestRefreshRate({}, false, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001118 EXPECT_EQ(false, touchConsidered);
1119
Steven Thomasbb374322020-04-28 22:47:16 -07001120 refreshRateConfigs->getBestRefreshRate({}, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001121 EXPECT_EQ(true, touchConsidered);
1122
1123 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1124 LayerRequirement{.weight = 1.0f}};
1125 auto& lr1 = layers[0];
1126 auto& lr2 = layers[1];
1127
1128 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1129 lr1.desiredRefreshRate = 60.0f;
1130 lr1.name = "60Hz ExplicitExactOrMultiple";
1131 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001132 lr2.desiredRefreshRate = 60.0f;
1133 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001134 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001135 EXPECT_EQ(true, touchConsidered);
1136
1137 lr1.vote = LayerVoteType::ExplicitDefault;
1138 lr1.desiredRefreshRate = 60.0f;
1139 lr1.name = "60Hz ExplicitExactOrMultiple";
1140 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001141 lr2.desiredRefreshRate = 60.0f;
1142 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001143 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001144 EXPECT_EQ(false, touchConsidered);
1145
1146 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
1147 lr1.desiredRefreshRate = 60.0f;
1148 lr1.name = "60Hz ExplicitExactOrMultiple";
1149 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001150 lr2.desiredRefreshRate = 60.0f;
1151 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001152 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001153 EXPECT_EQ(true, touchConsidered);
1154
1155 lr1.vote = LayerVoteType::ExplicitDefault;
1156 lr1.desiredRefreshRate = 60.0f;
Steven Thomasf734df42020-04-13 21:09:28 -07001157 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001158 lr2.vote = LayerVoteType::Heuristic;
Steven Thomasf734df42020-04-13 21:09:28 -07001159 lr2.desiredRefreshRate = 60.0f;
1160 lr2.name = "60Hz Heuristic";
Steven Thomasbb374322020-04-28 22:47:16 -07001161 refreshRateConfigs->getBestRefreshRate(layers, true, /*idle*/ false, &touchConsidered);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001162 EXPECT_EQ(false, touchConsidered);
Ady Abraham34702102020-02-10 14:12:05 -08001163}
1164
Steven Thomasbb374322020-04-28 22:47:16 -07001165TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001166 bool ignored;
Ady Abrahamabc27602020-04-08 17:20:29 -07001167 auto refreshRateConfigs =
1168 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1169 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001170
1171 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1172 auto& lr = layers[0];
1173
1174 // Prepare a table with the vote and the expected refresh rate
1175 const std::vector<std::pair<float, float>> testCases = {
1176 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1177
1178 {100, 90}, {90, 90}, {89, 90},
1179
1180 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1181
1182 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1183
1184 {55, 90}, {50, 90}, {45, 90},
1185
1186 {42, 120}, {40, 120}, {39, 120},
1187
1188 {37, 72}, {36, 72}, {35, 72},
1189
1190 {30, 60},
1191 };
1192
1193 for (const auto& test : testCases) {
1194 lr.vote = LayerVoteType::ExplicitDefault;
1195 lr.desiredRefreshRate = test.first;
1196
1197 std::stringstream ss;
1198 ss << "ExplicitDefault " << test.first << " fps";
1199 lr.name = ss.str();
1200
1201 const auto& refreshRate =
Steven Thomasbb374322020-04-28 22:47:16 -07001202 refreshRateConfigs->getBestRefreshRate(layers, false, /*idle*/ false, &ignored);
Ady Abrahamabc27602020-04-08 17:20:29 -07001203 EXPECT_FLOAT_EQ(refreshRate.getFps(), test.second)
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001204 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1205 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001206}
1207
Alec Mouri11232a22020-05-14 18:06:25 -07001208TEST_F(RefreshRateConfigsTest,
1209 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1210 auto refreshRateConfigs =
1211 std::make_unique<RefreshRateConfigs>(m60_90Device,
1212 /*currentConfigId=*/HWC_CONFIG_ID_90);
1213
1214 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1215 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1216 0);
1217
1218 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1219 auto& lr = layers[0];
1220
1221 bool touchConsidered = false;
1222 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1223 lr.desiredRefreshRate = 60.0f;
1224 lr.name = "60Hz ExplicitExactOrMultiple";
1225 EXPECT_EQ(mExpected60Config,
1226 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true, /*idle*/ false,
1227 &touchConsidered));
1228 EXPECT_EQ(false, touchConsidered);
1229
1230 lr.vote = LayerVoteType::ExplicitDefault;
1231 lr.desiredRefreshRate = 60.0f;
1232 lr.name = "60Hz ExplicitDefault";
1233 EXPECT_EQ(mExpected60Config,
1234 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ true, /*idle*/ false,
1235 &touchConsidered));
1236 EXPECT_EQ(false, touchConsidered);
1237}
1238
1239TEST_F(RefreshRateConfigsTest,
1240 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1241 auto refreshRateConfigs =
1242 std::make_unique<RefreshRateConfigs>(m60_90Device,
1243 /*currentConfigId=*/HWC_CONFIG_ID_60);
1244
1245 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1246 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 90.f}}),
1247 0);
1248
1249 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1250 auto& lr = layers[0];
1251
1252 bool touchConsidered = false;
1253 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1254 lr.desiredRefreshRate = 90.0f;
1255 lr.name = "90Hz ExplicitExactOrMultiple";
1256 EXPECT_EQ(mExpected90Config,
1257 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ true,
1258 &touchConsidered));
1259
1260 lr.vote = LayerVoteType::ExplicitDefault;
1261 lr.desiredRefreshRate = 90.0f;
1262 lr.name = "90Hz ExplicitDefault";
1263 EXPECT_EQ(mExpected90Config,
1264 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ true,
1265 &touchConsidered));
1266}
1267
1268TEST_F(RefreshRateConfigsTest,
1269 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitLayers) {
1270 auto refreshRateConfigs =
1271 std::make_unique<RefreshRateConfigs>(m60_90Device,
1272 /*currentConfigId=*/HWC_CONFIG_ID_90);
1273
1274 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1275 {HWC_CONFIG_ID_90, {90.f, 90.f}, {60.f, 90.f}}),
1276 0);
1277
1278 bool touchConsidered = false;
1279 EXPECT_EQ(mExpected90Config,
1280 refreshRateConfigs->getBestRefreshRate({}, /*touchActive*/ false, /*idle*/ false,
1281 &touchConsidered));
1282 EXPECT_EQ(false, touchConsidered);
1283
1284 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1285 auto& lr = layers[0];
1286
1287 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1288 lr.desiredRefreshRate = 60.0f;
1289 lr.name = "60Hz ExplicitExactOrMultiple";
1290 EXPECT_EQ(mExpected60Config,
1291 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1292 &touchConsidered));
1293
1294 lr.vote = LayerVoteType::ExplicitDefault;
1295 lr.desiredRefreshRate = 60.0f;
1296 lr.name = "60Hz ExplicitDefault";
1297 EXPECT_EQ(mExpected60Config,
1298 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1299 &touchConsidered));
1300
1301 lr.vote = LayerVoteType::Heuristic;
1302 lr.desiredRefreshRate = 60.0f;
1303 lr.name = "60Hz Heuristic";
1304 EXPECT_EQ(mExpected90Config,
1305 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1306 &touchConsidered));
1307
1308 lr.vote = LayerVoteType::Max;
1309 lr.desiredRefreshRate = 60.0f;
1310 lr.name = "60Hz Max";
1311 EXPECT_EQ(mExpected90Config,
1312 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1313 &touchConsidered));
1314
1315 lr.vote = LayerVoteType::Min;
1316 lr.desiredRefreshRate = 60.0f;
1317 lr.name = "60Hz Min";
1318 EXPECT_EQ(mExpected90Config,
1319 refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false,
1320 &touchConsidered));
1321}
1322
Steven Thomasd4071902020-03-24 16:02:53 -07001323TEST_F(RefreshRateConfigsTest, groupSwitching) {
Steven Thomasd4071902020-03-24 16:02:53 -07001324 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001325 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1326 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001327
1328 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1329 auto& layer = layers[0];
1330 layer.vote = LayerVoteType::ExplicitDefault;
1331 layer.desiredRefreshRate = 90.0f;
1332 layer.name = "90Hz ExplicitDefault";
1333
1334 bool touchConsidered;
1335 ASSERT_EQ(HWC_CONFIG_ID_60,
Steven Thomasbb374322020-04-28 22:47:16 -07001336 refreshRateConfigs
1337 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001338 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001339
1340 RefreshRateConfigs::Policy policy;
1341 policy.defaultConfig = refreshRateConfigs->getCurrentPolicy().defaultConfig;
1342 policy.allowGroupSwitching = true;
1343 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1344 ASSERT_EQ(HWC_CONFIG_ID_90,
Steven Thomasbb374322020-04-28 22:47:16 -07001345 refreshRateConfigs
1346 ->getBestRefreshRate(layers, false, /*idle*/ false, &touchConsidered)
Ady Abrahamabc27602020-04-08 17:20:29 -07001347 .getConfigId());
Steven Thomasd4071902020-03-24 16:02:53 -07001348}
1349
Steven Thomasf734df42020-04-13 21:09:28 -07001350TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1351 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001352 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001353 /*currentConfigId=*/HWC_CONFIG_ID_60);
1354
1355 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1356 layers[0].name = "Test layer";
1357
Steven Thomasbb374322020-04-28 22:47:16 -07001358 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001359 // given voteType and fps.
1360 auto getFrameRate = [&](LayerVoteType voteType, float fps,
1361 bool touchActive = false) -> HwcConfigIndexType {
1362 layers[0].vote = voteType;
1363 layers[0].desiredRefreshRate = fps;
1364 bool touchConsidered;
Steven Thomasbb374322020-04-28 22:47:16 -07001365 return refreshRateConfigs
1366 ->getBestRefreshRate(layers, touchActive, /*idle*/ false, &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001367 .getConfigId();
1368 };
1369
1370 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Alec Mouri11232a22020-05-14 18:06:25 -07001371 {HWC_CONFIG_ID_60, {30.f, 60.f}, {30.f, 90.f}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001372 0);
1373 bool touchConsidered;
1374 EXPECT_EQ(HWC_CONFIG_ID_60,
1375 refreshRateConfigs
Steven Thomasbb374322020-04-28 22:47:16 -07001376 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle*/ false,
1377 &touchConsidered)
Steven Thomasf734df42020-04-13 21:09:28 -07001378 .getConfigId());
1379 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
Alec Mouri11232a22020-05-14 18:06:25 -07001380 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90.f));
Steven Thomasf734df42020-04-13 21:09:28 -07001381 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1382 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1383 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1384 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1385
1386 // Touch boost should be restricted to the primary range.
1387 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f, /*touch=*/true));
1388 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1389 // shouldn't drag us back down to the primary range max.
1390 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90.f, /*touch=*/true));
1391 EXPECT_EQ(HWC_CONFIG_ID_90,
1392 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f, /*touch=*/true));
1393
1394 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1395 {HWC_CONFIG_ID_60, {60.f, 60.f}, {60.f, 60.f}}),
1396 0);
1397 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90.f));
1398 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90.f));
1399 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90.f));
1400 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90.f));
1401 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90.f));
1402 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90.f));
1403}
1404
Steven Thomasbb374322020-04-28 22:47:16 -07001405TEST_F(RefreshRateConfigsTest, idle) {
1406 auto refreshRateConfigs =
1407 std::make_unique<RefreshRateConfigs>(m60_90Device,
1408 /*currentConfigId=*/HWC_CONFIG_ID_60);
1409
1410 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1411 layers[0].name = "Test layer";
1412
1413 auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> HwcConfigIndexType {
1414 layers[0].vote = voteType;
1415 layers[0].desiredRefreshRate = 90.f;
1416 bool touchConsidered;
1417 return refreshRateConfigs
1418 ->getBestRefreshRate(layers, touchActive, /*idle=*/true, &touchConsidered)
1419 .getConfigId();
1420 };
1421
1422 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
1423 {HWC_CONFIG_ID_60, {60.f, 90.f}, {60.f, 90.f}}),
1424 0);
1425
1426 // Idle should be lower priority than touch boost.
1427 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, true));
1428 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, true));
1429 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, true));
1430 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, true));
1431 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitDefault, true));
1432 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, true));
1433
1434 // With no layers, idle should still be lower priority than touch boost.
1435 bool touchConsidered;
1436 EXPECT_EQ(HWC_CONFIG_ID_90,
1437 refreshRateConfigs
1438 ->getBestRefreshRate({}, /*touchActive=*/true, /*idle=*/true,
1439 &touchConsidered)
1440 .getConfigId());
1441
1442 // Idle should be higher precedence than other layer frame rate considerations.
1443 refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_90);
1444 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, false));
1445 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, false));
1446 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, false));
1447 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, false));
1448 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitDefault, false));
1449 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, false));
1450
1451 // Idle should be applied rather than the current config when there are no layers.
1452 EXPECT_EQ(HWC_CONFIG_ID_60,
1453 refreshRateConfigs
1454 ->getBestRefreshRate({}, /*touchActive=*/false, /*idle=*/true,
1455 &touchConsidered)
1456 .getConfigId());
1457}
1458
Alec Mouri0a1cc962019-03-14 12:33:02 -07001459} // namespace
1460} // namespace scheduler
1461} // namespace android