blob: cc6fa2c9d8e8ffc194959fcb6ef7957199e1deb8 [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
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Ady Abraham6fb599b2020-03-05 13:48:22 -080030#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "DisplayHardware/HWC2.h"
32#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
36namespace android {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010037
Alec Mouri0a1cc962019-03-14 12:33:02 -070038namespace scheduler {
39
Peiyong Line9d809e2020-04-14 13:10:48 -070040namespace hal = android::hardware::graphics::composer::hal;
41
Alec Mouri0a1cc962019-03-14 12:33:02 -070042using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080043using LayerVoteType = RefreshRateConfigs::LayerVoteType;
44using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070045
46class RefreshRateConfigsTest : public testing::Test {
47protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020048 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
49
Alec Mouri0a1cc962019-03-14 12:33:02 -070050 RefreshRateConfigsTest();
51 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070052
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020053 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070054 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020055 }
56
Marin Shalamanove8a663d2020-11-24 17:48:00 +010057 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070058 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
59 }
60
Marin Shalamanove8a663d2020-11-24 17:48:00 +010061 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070062 return refreshRateConfigs.mKnownFrameRates;
63 }
64
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010065 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
66 std::lock_guard lock(refreshRateConfigs.mLock);
67 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
68 }
69
70 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
71 std::lock_guard lock(refreshRateConfigs.mLock);
72 return *refreshRateConfigs.mMinSupportedRefreshRate;
73 }
74
75 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
76 std::lock_guard lock(refreshRateConfigs.mLock);
77 return *refreshRateConfigs.mMaxSupportedRefreshRate;
78 }
79
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020080 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
81 const GetBestRefreshRateInvocation& invocation) {
82 std::lock_guard lock(refreshRateConfigs.mLock);
83 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
84 GetBestRefreshRateInvocation(invocation));
85 }
86
87 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
88 const RefreshRateConfigs& refreshRateConfigs) {
89 std::lock_guard lock(refreshRateConfigs.mLock);
90 return refreshRateConfigs.lastBestRefreshRateInvocation;
91 }
92
Ady Abrahamabc27602020-04-08 17:20:29 -070093 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010094 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
95 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
96 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
97 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
98 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
99 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
100 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Ady Abrahamabc27602020-04-08 17:20:29 -0700101
102 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100103 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
104 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100105 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100106 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100107 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100108 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
109 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100110 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100111 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
112 DisplayModePtr mConfig120 =
113 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100114 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100115 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
116 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100117 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100118 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100119 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100120 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
121 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700122
123 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200124 // The positions of the configs in the arrays below MUST match their IDs. For example,
125 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100126 DisplayModes m60OnlyConfigDevice = {mConfig60};
127 DisplayModes m60_90Device = {mConfig60, mConfig90};
128 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
129 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
130 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
131 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
132 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
133 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
134 mConfig120DifferentGroup, mConfig30};
135 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
136 mConfig30};
137 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
138 mConfig120DifferentGroup, mConfig30};
139 DisplayModes m25_30_50_60Device = {mConfig60,
140 mConfig90,
141 mConfig72DifferentGroup,
142 mConfig120DifferentGroup,
143 mConfig30DifferentGroup,
144 mConfig25DifferentGroup,
145 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700146 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700147
148 // Expected RefreshRate objects
Ady Abraham6b7ad652021-06-23 17:34:57 -0700149 RefreshRate mExpected60Config = {mConfig60, RefreshRate::ConstructorTag(0)};
150 RefreshRate mExpectedAlmost60Config = {createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
151 RefreshRate::ConstructorTag(0)};
152 RefreshRate mExpected90Config = {mConfig90, RefreshRate::ConstructorTag(0)};
153 RefreshRate mExpected90DifferentGroupConfig = {mConfig90DifferentGroup,
154 RefreshRate::ConstructorTag(0)};
155 RefreshRate mExpected90DifferentResolutionConfig = {mConfig90DifferentResolution,
Ady Abrahamabc27602020-04-08 17:20:29 -0700156 RefreshRate::ConstructorTag(0)};
Ady Abraham6b7ad652021-06-23 17:34:57 -0700157 RefreshRate mExpected72Config = {mConfig72, RefreshRate::ConstructorTag(0)};
158 RefreshRate mExpected30Config = {mConfig30, RefreshRate::ConstructorTag(0)};
159 RefreshRate mExpected120Config = {mConfig120, RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700160
Ady Abrahamabc27602020-04-08 17:20:29 -0700161private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100162 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
163 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700164};
165
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100166using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700167
Alec Mouri0a1cc962019-03-14 12:33:02 -0700168RefreshRateConfigsTest::RefreshRateConfigsTest() {
169 const ::testing::TestInfo* const test_info =
170 ::testing::UnitTest::GetInstance()->current_test_info();
171 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
172}
173
174RefreshRateConfigsTest::~RefreshRateConfigsTest() {
175 const ::testing::TestInfo* const test_info =
176 ::testing::UnitTest::GetInstance()->current_test_info();
177 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
178}
179
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100180DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
181 int64_t vsyncPeriod, ui::Size resolution) {
182 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
183 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700184 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100185 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100186 .setHeight(resolution.height)
187 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700188 .build();
189}
190
Alec Mouri0a1cc962019-03-14 12:33:02 -0700191namespace {
192/* ------------------------------------------------------------------------
193 * Test cases
194 */
Ady Abraham2139f732019-11-13 18:56:40 -0800195TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700196 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700197 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
198 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700199}
200
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100201TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100202 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700203 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
204 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100205 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100206 0);
207 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
208 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100209}
210
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700211TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700212 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700213 std::make_unique<RefreshRateConfigs>(m60_90Device,
214 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700215
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100216 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
217 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700218
Ady Abrahamabc27602020-04-08 17:20:29 -0700219 ASSERT_EQ(mExpected60Config, minRate);
220 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800221
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100222 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800223 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800224 ASSERT_EQ(minRateByPolicy, minRate);
225 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700226}
Ady Abraham2139f732019-11-13 18:56:40 -0800227
228TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800229 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700230 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
231 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800232
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100233 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
234 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
235 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800236 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800237
Ady Abrahamabc27602020-04-08 17:20:29 -0700238 ASSERT_EQ(mExpected60Config, minRate);
239 ASSERT_EQ(mExpected60Config, minRate60);
240 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800241
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100242 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
243 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100244 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800245
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100246 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800247 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800248
Ady Abrahamabc27602020-04-08 17:20:29 -0700249 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
250 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
251 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
252}
253
254TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
255 auto refreshRateConfigs =
256 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
257 /*currentConfigId=*/HWC_CONFIG_ID_60);
258
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100259 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
260 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
261 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700262 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
263
264 ASSERT_EQ(mExpected60Config, minRate);
265 ASSERT_EQ(mExpected60Config, minRate60);
266 ASSERT_EQ(mExpected60Config, performanceRate60);
267
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100268 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
269 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100270 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700271
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100272 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700273 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
274
275 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
276 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
277 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800278}
279
280TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800281 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700282 std::make_unique<RefreshRateConfigs>(m60_90Device,
283 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800284
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100285 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
286 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800287
Ady Abrahamabc27602020-04-08 17:20:29 -0700288 ASSERT_EQ(mExpected60Config, minRate);
289 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800290
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100291 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
292 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800293
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100294 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
295 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700296 ASSERT_EQ(mExpected60Config, minRate60);
297 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800298}
299
300TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800301 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700302 std::make_unique<RefreshRateConfigs>(m60_90Device,
303 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800304 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100305 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100306 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800307 }
308
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100309 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800310 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100311 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100312 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800313 }
314
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100315 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
316 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800317 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100318 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100319 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800320 }
321}
322
Steven Thomasbb374322020-04-28 22:47:16 -0700323TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700324 auto refreshRateConfigs =
325 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
326 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800327
Steven Thomasdebafed2020-05-18 17:30:35 -0700328 // If there are no layers we select the default frame rate, which is the max of the primary
329 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800330 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700331 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700332 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800333
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100334 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
335 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700336 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700337 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800338}
339
Steven Thomasbb374322020-04-28 22:47:16 -0700340TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800341 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700342 std::make_unique<RefreshRateConfigs>(m60_90Device,
343 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800344
345 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
346 auto& lr = layers[0];
347
348 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800349 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700350 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700351 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800352
353 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800354 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700355 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700356 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800357
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100358 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800360 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700361 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700362 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800363
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100364 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800365 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700366 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700367 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100369 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800370 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700371 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700372 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800373
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100374 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800375 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700376 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700377 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100379 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800380 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700381 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700382 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800384 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100385 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
386 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
388 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700389 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700390 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
392 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700393 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700394 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100396 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700398 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700399 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100401 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700402 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700403 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100405 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700407 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100409 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700410 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700411 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100413 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700414 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700415 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100417 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
418 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
419 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
421 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700422 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700423 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
425 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700426 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700427 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100429 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700431 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700432 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800433
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100434 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700435 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700436 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100438 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700439 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100442 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700443 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700444 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800445
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100446 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700447 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700448 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100450 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
451 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
452 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700454 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700455 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
457 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700458 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700459 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100461 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700463 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700464 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100466 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700467 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700468 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100470 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100474 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700475 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100478 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481}
482
rnlee3bd610662021-06-23 16:27:57 -0700483TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
484 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
485 auto refreshRateConfigs =
486 std::make_unique<RefreshRateConfigs>(m60_90Device,
487 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
488
489 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
490 auto& lr = layers[0];
491
492 lr.vote = LayerVoteType::Min;
493 lr.name = "Min";
494 EXPECT_EQ(mExpected60Config,
495 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
496
497 lr.vote = LayerVoteType::Max;
498 lr.name = "Max";
499 EXPECT_EQ(mExpected90Config,
500 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
501
502 lr.desiredRefreshRate = Fps(90.0f);
503 lr.vote = LayerVoteType::Heuristic;
504 lr.name = "90Hz Heuristic";
505 EXPECT_EQ(mExpected90Config,
506 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
507
508 lr.desiredRefreshRate = Fps(60.0f);
509 lr.name = "60Hz Heuristic";
510 EXPECT_EQ(mExpected60Config,
511 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
512
513 lr.desiredRefreshRate = Fps(45.0f);
514 lr.name = "45Hz Heuristic";
515 EXPECT_EQ(mExpected90Config,
516 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
517
518 lr.desiredRefreshRate = Fps(30.0f);
519 lr.name = "30Hz Heuristic";
520 EXPECT_EQ(mExpected60Config,
521 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
522
523 lr.desiredRefreshRate = Fps(24.0f);
524 lr.name = "24Hz Heuristic";
525 EXPECT_EQ(mExpected60Config,
526 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
527}
528
Steven Thomasbb374322020-04-28 22:47:16 -0700529TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800530 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700531 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
532 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800533
534 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
535 auto& lr = layers[0];
536
537 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700538 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700539 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800540
541 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700542 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700543 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800544
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100545 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800546 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700547 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700548 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800549
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100550 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700551 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700552 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100554 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700556 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100558 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700559 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700560 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100562 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700563 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700564 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800565}
566
Steven Thomasbb374322020-04-28 22:47:16 -0700567TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800568 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700569 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
570 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571
572 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
573 LayerRequirement{.weight = 1.0f}};
574 auto& lr1 = layers[0];
575 auto& lr2 = layers[1];
576
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100577 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800578 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100579 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800580 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700581 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700582 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800583
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100584 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800585 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100586 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800587 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700588 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700589 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800590
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100591 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800592 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100593 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800594 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700595 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700596 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800597}
598
Steven Thomasbb374322020-04-28 22:47:16 -0700599TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800600 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700601 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
602 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800603
604 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
605 LayerRequirement{.weight = 1.0f}};
606 auto& lr1 = layers[0];
607 auto& lr2 = layers[1];
608
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100609 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800610 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800611 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100612 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800613 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800614 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700615 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700616 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800617
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100618 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800620 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100621 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800622 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800623 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700624 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700625 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800626
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100627 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800628 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100630 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800631 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800632 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700633 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700634 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800635
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100636 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100639 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800640 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800641 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700642 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700643 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800644
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100645 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800646 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
647 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100648 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr2.vote = LayerVoteType::ExplicitDefault;
650 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700651 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700652 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800653
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100654 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800655 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100657 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800658 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800659 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700660 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700661 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800662
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100663 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800664 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800665 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100666 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800667 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800668 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700669 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700670 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800671
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100672 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800673 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800674 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100675 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800676 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800677 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700678 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700679 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800680
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100681 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800682 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800683 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100684 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800685 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800686 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700687 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700688 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800689}
690
rnlee3bd610662021-06-23 16:27:57 -0700691TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
692 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
693 auto refreshRateConfigs =
694 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
695 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
696
697 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
698 LayerRequirement{.weight = 1.0f}};
699 auto& lr1 = layers[0];
700 auto& lr2 = layers[1];
701
702 lr1.desiredRefreshRate = Fps(24.0f);
703 lr1.vote = LayerVoteType::ExplicitDefault;
704 lr1.name = "24Hz ExplicitDefault";
705 lr2.desiredRefreshRate = Fps(60.0f);
706 lr2.vote = LayerVoteType::Heuristic;
707 lr2.name = "60Hz Heuristic";
708 EXPECT_EQ(mExpected120Config,
709 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
710
711 lr1.desiredRefreshRate = Fps(24.0f);
712 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
713 lr1.name = "24Hz ExplicitExactOrMultiple";
714 lr2.desiredRefreshRate = Fps(60.0f);
715 lr2.vote = LayerVoteType::Heuristic;
716 lr2.name = "60Hz Heuristic";
717 EXPECT_EQ(mExpected60Config,
718 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
719
720 lr1.desiredRefreshRate = Fps(24.0f);
721 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
722 lr1.name = "24Hz ExplicitExactOrMultiple";
723 lr2.desiredRefreshRate = Fps(60.0f);
724 lr2.vote = LayerVoteType::ExplicitDefault;
725 lr2.name = "60Hz ExplicitDefault";
726 EXPECT_EQ(mExpected72Config,
727 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
728
729 lr1.desiredRefreshRate = Fps(24.0f);
730 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
731 lr1.name = "24Hz ExplicitExactOrMultiple";
732 lr2.desiredRefreshRate = Fps(90.0f);
733 lr2.vote = LayerVoteType::Heuristic;
734 lr2.name = "90Hz Heuristic";
735 EXPECT_EQ(mExpected90Config,
736 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
737
738 lr1.desiredRefreshRate = Fps(24.0f);
739 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
740 lr1.name = "24Hz ExplicitExactOrMultiple";
741 lr2.desiredRefreshRate = Fps(90.0f);
742 lr2.vote = LayerVoteType::ExplicitDefault;
743 lr2.name = "90Hz Heuristic";
744 EXPECT_EQ(mExpected72Config,
745 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
746
747 lr1.desiredRefreshRate = Fps(24.0f);
748 lr1.vote = LayerVoteType::ExplicitDefault;
749 lr1.name = "24Hz ExplicitDefault";
750 lr2.desiredRefreshRate = Fps(90.0f);
751 lr2.vote = LayerVoteType::Heuristic;
752 lr2.name = "90Hz Heuristic";
753 EXPECT_EQ(mExpected90Config,
754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
755
756 lr1.desiredRefreshRate = Fps(24.0f);
757 lr1.vote = LayerVoteType::Heuristic;
758 lr1.name = "24Hz Heuristic";
759 lr2.desiredRefreshRate = Fps(90.0f);
760 lr2.vote = LayerVoteType::ExplicitDefault;
761 lr2.name = "90Hz ExplicitDefault";
762 EXPECT_EQ(mExpected72Config,
763 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
764
765 lr1.desiredRefreshRate = Fps(24.0f);
766 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
767 lr1.name = "24Hz ExplicitExactOrMultiple";
768 lr2.desiredRefreshRate = Fps(90.0f);
769 lr2.vote = LayerVoteType::ExplicitDefault;
770 lr2.name = "90Hz ExplicitDefault";
771 EXPECT_EQ(mExpected72Config,
772 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
773
774 lr1.desiredRefreshRate = Fps(24.0f);
775 lr1.vote = LayerVoteType::ExplicitDefault;
776 lr1.name = "24Hz ExplicitDefault";
777 lr2.desiredRefreshRate = Fps(90.0f);
778 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
779 lr2.name = "90Hz ExplicitExactOrMultiple";
780 EXPECT_EQ(mExpected90Config,
781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
782}
783
Steven Thomasbb374322020-04-28 22:47:16 -0700784TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700786 std::make_unique<RefreshRateConfigs>(m30_60Device,
787 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
789 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
790 auto& lr = layers[0];
791
792 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700793 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700794 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795
796 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700797 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700798 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800799
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100800 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800801 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700802 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700803 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800804
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100805 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700806 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700807 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100809 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700811 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100813 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700814 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700815 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100817 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700818 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700819 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800820}
821
Steven Thomasbb374322020-04-28 22:47:16 -0700822TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800823 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700824 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
825 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826
827 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
828 auto& lr = layers[0];
829
830 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800831 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700832 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700833 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834
835 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800836 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700837 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700838 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800839
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100840 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800842 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700843 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700844 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100846 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800847 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700848 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700849 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700850 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700851 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100853 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800854 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700855 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700856 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700857 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700858 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800859
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100860 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800861 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700862 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700863 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700864 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700865 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800866
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100867 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800868 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700869 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700871 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700872 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800873
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100874 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800875 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
876 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700877 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700878 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700879 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700880 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800881}
882
Steven Thomasbb374322020-04-28 22:47:16 -0700883TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700885 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
886 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800887
888 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
889 LayerRequirement{.weight = 1.0f}};
890 auto& lr1 = layers[0];
891 auto& lr2 = layers[1];
892
893 lr1.vote = LayerVoteType::Min;
894 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700895 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700896 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800897
898 lr1.vote = LayerVoteType::Min;
899 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100900 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700901 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700902 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800903
904 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800905 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100906 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700907 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700908 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800909
910 lr1.vote = LayerVoteType::Max;
911 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100912 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700913 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700914 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800915
916 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800917 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100918 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700919 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700920 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921
922 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100923 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800924 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100925 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700926 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700927 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800928
929 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100930 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800931 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100932 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700933 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700934 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800935}
936
Steven Thomasbb374322020-04-28 22:47:16 -0700937TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800938 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700939 std::make_unique<RefreshRateConfigs>(m60_90Device,
940 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800941
942 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
943 auto& lr = layers[0];
944
Ady Abraham71c437d2020-01-31 15:56:57 -0800945 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800946 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100947 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800948 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700949 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700950 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800951 }
952}
953
rnlee3bd610662021-06-23 16:27:57 -0700954TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
955 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
956 auto refreshRateConfigs =
957 std::make_unique<RefreshRateConfigs>(m60_120Device,
958 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
959
960 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
961 auto& lr = layers[0];
962
963 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
964 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
965 lr.desiredRefreshRate = Fps(fps);
966 const auto& refreshRate =
967 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
968 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
969 }
970}
971
Steven Thomasbb374322020-04-28 22:47:16 -0700972TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800973 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700974 std::make_unique<RefreshRateConfigs>(m60_90Device,
975 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800976
977 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
978 LayerRequirement{.weight = 1.0f}};
979 auto& lr1 = layers[0];
980 auto& lr2 = layers[1];
981
982 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100983 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800984 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100985 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700986 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700987 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800988
989 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100990 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800991 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100992 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700993 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700994 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800995
996 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100997 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800998 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100999 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001000 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001001 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001002}
1003
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001004TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001005 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1006 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1007 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1008 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1009 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001010}
1011
Steven Thomasbb374322020-04-28 22:47:16 -07001012TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001013 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001014 std::make_unique<RefreshRateConfigs>(m60_90Device,
1015 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001016
1017 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1018 auto& lr = layers[0];
1019
Ady Abraham71c437d2020-01-31 15:56:57 -08001020 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001021 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001022 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001023 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001024 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001025 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001026 }
1027}
1028
Steven Thomasbb374322020-04-28 22:47:16 -07001029TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001030 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001031 std::make_unique<RefreshRateConfigs>(m60_90Device,
1032 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001033
1034 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1035 LayerRequirement{.weight = 1.0f}};
1036 auto& lr1 = layers[0];
1037 auto& lr2 = layers[1];
1038
1039 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001040 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001041 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001042 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001043 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001044 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001045 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001046 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001047
1048 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001049 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001050 lr1.name = "60Hz ExplicitExactOrMultiple";
1051 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001052 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001053 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001054 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001055 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001056
1057 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001058 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001059 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001060 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001061 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001062 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001063 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001064
1065 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001066 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001067 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001068 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001069 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001070 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001071 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001072 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001073
1074 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001075 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001076 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001077 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001078 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001079 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001081}
1082
1083TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001084 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001085 std::make_unique<RefreshRateConfigs>(m60_90Device,
1086 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001087
1088 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1089 LayerRequirement{.weight = 1.0f}};
1090 auto& lr1 = layers[0];
1091 auto& lr2 = layers[1];
1092
1093 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001094 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001095 lr1.name = "60Hz ExplicitExactOrMultiple";
1096 lr2.vote = LayerVoteType::NoVote;
1097 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001098 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001099 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001100
1101 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001102 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001103 lr1.name = "60Hz ExplicitExactOrMultiple";
1104 lr2.vote = LayerVoteType::NoVote;
1105 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001106 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001107 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001108
1109 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001110 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001111 lr1.name = "60Hz ExplicitExactOrMultiple";
1112 lr2.vote = LayerVoteType::Max;
1113 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001114 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001115 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001116
1117 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001118 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001119 lr1.name = "60Hz ExplicitExactOrMultiple";
1120 lr2.vote = LayerVoteType::Max;
1121 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001122 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001123 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001124
1125 // The other layer starts to provide buffers
1126 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001127 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001128 lr1.name = "60Hz ExplicitExactOrMultiple";
1129 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001130 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001131 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001132 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001133 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001134}
1135
1136TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001137 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001138 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001139 std::make_unique<RefreshRateConfigs>(m60_90Device,
1140 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001141
Ady Abrahamdfd62162020-06-10 16:11:56 -07001142 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1143 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001144
Ady Abrahamdfd62162020-06-10 16:11:56 -07001145 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1146 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001147
1148 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1149 LayerRequirement{.weight = 1.0f}};
1150 auto& lr1 = layers[0];
1151 auto& lr2 = layers[1];
1152
1153 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001154 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001155 lr1.name = "60Hz ExplicitExactOrMultiple";
1156 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001157 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001158 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001159 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1160 &consideredSignals);
1161 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001162
1163 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001164 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001165 lr1.name = "60Hz ExplicitExactOrMultiple";
1166 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001167 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001168 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001169 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1170 &consideredSignals);
1171 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001172
1173 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001174 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001175 lr1.name = "60Hz ExplicitExactOrMultiple";
1176 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001177 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001178 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001179 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1180 &consideredSignals);
1181 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001182
1183 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001184 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001185 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001186 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001187 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001188 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001189 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1190 &consideredSignals);
1191 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001192}
1193
Steven Thomasbb374322020-04-28 22:47:16 -07001194TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001195 auto refreshRateConfigs =
1196 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1197 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001198
1199 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1200 auto& lr = layers[0];
1201
1202 // Prepare a table with the vote and the expected refresh rate
1203 const std::vector<std::pair<float, float>> testCases = {
1204 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1205
1206 {100, 90}, {90, 90}, {89, 90},
1207
1208 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1209
1210 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1211
1212 {55, 90}, {50, 90}, {45, 90},
1213
1214 {42, 120}, {40, 120}, {39, 120},
1215
1216 {37, 72}, {36, 72}, {35, 72},
1217
1218 {30, 60},
1219 };
1220
1221 for (const auto& test : testCases) {
1222 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001223 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001224
1225 std::stringstream ss;
1226 ss << "ExplicitDefault " << test.first << " fps";
1227 lr.name = ss.str();
1228
1229 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001230 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001231 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001232 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1233 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001234}
1235
Alec Mouri11232a22020-05-14 18:06:25 -07001236TEST_F(RefreshRateConfigsTest,
1237 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1238 auto refreshRateConfigs =
1239 std::make_unique<RefreshRateConfigs>(m60_90Device,
1240 /*currentConfigId=*/HWC_CONFIG_ID_90);
1241
1242 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001243 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001244 0);
1245
1246 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1247 auto& lr = layers[0];
1248
Ady Abrahamdfd62162020-06-10 16:11:56 -07001249 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001250 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001251 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001252 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001253 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001254 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001255 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1256 &consideredSignals));
1257 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001258}
1259
1260TEST_F(RefreshRateConfigsTest,
1261 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1262 auto refreshRateConfigs =
1263 std::make_unique<RefreshRateConfigs>(m60_90Device,
1264 /*currentConfigId=*/HWC_CONFIG_ID_60);
1265
1266 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001267 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001268 0);
1269
1270 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1271 auto& lr = layers[0];
1272
Alec Mouri11232a22020-05-14 18:06:25 -07001273 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001274 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001275 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001276 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001277 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001278 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001279}
1280
1281TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001282 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001283 auto refreshRateConfigs =
1284 std::make_unique<RefreshRateConfigs>(m60_90Device,
1285 /*currentConfigId=*/HWC_CONFIG_ID_90);
1286
1287 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001288 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001289 0);
1290
Ady Abrahamdfd62162020-06-10 16:11:56 -07001291 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001292 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001293 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1294 &consideredSignals));
1295 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001296
1297 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1298 auto& lr = layers[0];
1299
1300 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001301 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001302 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001303 lr.focused = false;
1304 EXPECT_EQ(mExpected90Config,
1305 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1306
1307 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001308 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001309 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001310
1311 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001312 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001313 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001314 lr.focused = false;
1315 EXPECT_EQ(mExpected90Config,
1316 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1317
1318 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001319 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001320 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001321
1322 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001323 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001324 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001325 lr.focused = false;
1326 EXPECT_EQ(mExpected90Config,
1327 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1328
1329 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001330 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001331 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001332
1333 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001334 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001335 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001336 lr.focused = false;
1337 EXPECT_EQ(mExpected90Config,
1338 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1339
1340 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001341 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001342 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001343
1344 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001345 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001346 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001347 lr.focused = false;
1348 EXPECT_EQ(mExpected90Config,
1349 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1350
1351 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001352 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001353 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001354}
1355
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001356TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001357 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001358 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1359 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001360
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001361 // The default policy doesn't allow group switching. Verify that no
1362 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001363 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1364 auto& layer = layers[0];
1365 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001366 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001367 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001368 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001369 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001370
Steven Thomasd4071902020-03-24 16:02:53 -07001371 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001372 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001373 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001374}
Steven Thomasd4071902020-03-24 16:02:53 -07001375
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001376TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1377 auto refreshRateConfigs =
1378 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1379 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001380 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001381 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001382 policy.allowGroupSwitching = true;
1383 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001384
1385 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1386 auto& layer = layers[0];
1387 layer.vote = LayerVoteType::ExplicitDefault;
1388 layer.desiredRefreshRate = Fps(90.0f);
1389 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1390 layer.name = "90Hz ExplicitDefault";
1391 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001392 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001393 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001394 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001395}
1396
1397TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1398 auto refreshRateConfigs =
1399 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1400 /*currentConfigId=*/HWC_CONFIG_ID_60);
1401 RefreshRateConfigs::Policy policy;
1402 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1403 policy.allowGroupSwitching = true;
1404 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001405
1406 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001407 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1408 auto& layer = layers[0];
1409 layer.vote = LayerVoteType::ExplicitDefault;
1410 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001411 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001412 layer.name = "90Hz ExplicitDefault";
1413 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001414 ASSERT_EQ(HWC_CONFIG_ID_60,
1415 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001416 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001417}
1418
1419TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1420 auto refreshRateConfigs =
1421 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1422 /*currentConfigId=*/HWC_CONFIG_ID_60);
1423 RefreshRateConfigs::Policy policy;
1424 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1425 policy.allowGroupSwitching = true;
1426 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1427
1428 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001429
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001430 // Verify that we won't do a seamless switch if we request the same mode as the default
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001431 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1432 auto& layer = layers[0];
1433 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001434 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001435 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001436 layer.name = "60Hz ExplicitDefault";
1437 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001438 ASSERT_EQ(HWC_CONFIG_ID_90,
1439 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001440 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001441}
1442
1443TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1444 auto refreshRateConfigs =
1445 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1446 /*currentConfigId=*/HWC_CONFIG_ID_60);
1447 RefreshRateConfigs::Policy policy;
1448 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1449 policy.allowGroupSwitching = true;
1450 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1451
1452 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001453
1454 // Verify that if the current config is in another group and there are no layers with
1455 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001456
1457 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1458 auto& layer = layers[0];
1459 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001460 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001461 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001462 layer.name = "60Hz ExplicitDefault";
1463 layer.focused = true;
1464
Marin Shalamanov46084422020-10-13 12:33:42 +02001465 ASSERT_EQ(HWC_CONFIG_ID_60,
1466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001467 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001468}
1469
1470TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1471 auto refreshRateConfigs =
1472 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1473 /*currentConfigId=*/HWC_CONFIG_ID_60);
1474 RefreshRateConfigs::Policy policy;
1475 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1476 policy.allowGroupSwitching = true;
1477 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1478
1479 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001480
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001481 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001482 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001483 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1484 layers[0].vote = LayerVoteType::ExplicitDefault;
1485 layers[0].desiredRefreshRate = Fps(60.0f);
1486 layers[0].seamlessness = Seamlessness::OnlySeamless;
1487 layers[0].name = "60Hz ExplicitDefault";
1488 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001489
1490 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001491 layers[1].vote = LayerVoteType::ExplicitDefault;
1492 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1493 layers[1].desiredRefreshRate = Fps(90.0f);
1494 layers[1].name = "90Hz ExplicitDefault";
1495 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001496
1497 ASSERT_EQ(HWC_CONFIG_ID_90,
1498 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001499 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001500}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001501
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001502TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001503 auto refreshRateConfigs =
1504 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1505 /*currentConfigId=*/HWC_CONFIG_ID_60);
1506 RefreshRateConfigs::Policy policy;
1507 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1508 policy.allowGroupSwitching = true;
1509 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1510
1511 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001512
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001513 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1514 // seamlessness=Default can't change the mode group back to the group of the default
1515 // mode.
1516 // For example, this may happen when a video playback requests and gets a seamed switch,
1517 // but another layer (with default seamlessness) starts animating. The animating layer
1518 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001519 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001520 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001521 layers[0].desiredRefreshRate = Fps(60.0f);
1522 layers[0].focused = true;
1523 layers[0].vote = LayerVoteType::ExplicitDefault;
1524 layers[0].name = "60Hz ExplicitDefault";
1525
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001526 layers.push_back(LayerRequirement{.weight = 0.1f});
1527 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1528 layers[1].desiredRefreshRate = Fps(90.0f);
1529 layers[1].focused = true;
1530 layers[1].vote = LayerVoteType::ExplicitDefault;
1531 layers[1].name = "90Hz ExplicitDefault";
1532
Marin Shalamanov46084422020-10-13 12:33:42 +02001533 ASSERT_EQ(HWC_CONFIG_ID_90,
1534 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001535 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001536}
1537
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001538TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1539 auto refreshRateConfigs =
1540 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1541 /*currentConfigId=*/HWC_CONFIG_ID_60);
1542 RefreshRateConfigs::Policy policy;
1543 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1544 policy.allowGroupSwitching = true;
1545 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1546
1547 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1548
1549 // Layer with seamlessness=Default can change the mode group if there's a not
1550 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1551 // when in split screen mode the user switches between the two visible applications.
1552 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1553 layers[0].seamlessness = Seamlessness::Default;
1554 layers[0].desiredRefreshRate = Fps(60.0f);
1555 layers[0].focused = true;
1556 layers[0].vote = LayerVoteType::ExplicitDefault;
1557 layers[0].name = "60Hz ExplicitDefault";
1558
1559 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001560 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1561 layers[1].desiredRefreshRate = Fps(90.0f);
1562 layers[1].focused = false;
1563 layers[1].vote = LayerVoteType::ExplicitDefault;
1564 layers[1].name = "90Hz ExplicitDefault";
1565
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001566 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001567 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1568 .getModeId());
1569}
1570
1571TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1572 auto refreshRateConfigs =
1573 std::make_unique<RefreshRateConfigs>(m30_60Device,
1574 /*currentConfigId=*/HWC_CONFIG_ID_60);
1575
1576 // Allow group switching.
1577 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001578 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001579 policy.allowGroupSwitching = true;
1580 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1581
1582 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1583 auto& layer = layers[0];
1584 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001585 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001586 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001587 layer.name = "60Hz ExplicitExactOrMultiple";
1588 layer.focused = true;
1589
1590 ASSERT_EQ(HWC_CONFIG_ID_60,
1591 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001592 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001593
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001594 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001595 ASSERT_EQ(HWC_CONFIG_ID_120,
1596 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001597 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001598}
1599
1600TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1601 auto refreshRateConfigs =
1602 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1603 /*currentConfigId=*/HWC_CONFIG_ID_60);
1604
1605 // Allow group switching.
1606 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001607 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001608 policy.allowGroupSwitching = true;
1609 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1610
1611 auto layers = std::vector<
1612 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1613 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001614 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001615 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001616 .weight = 0.5f,
1617 .focused = false},
1618 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1619 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001620 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001621 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001622 .weight = 1.0f,
1623 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001624
1625 ASSERT_EQ(HWC_CONFIG_ID_50,
1626 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001627 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001628
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001629 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001630 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001631 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001632
1633 ASSERT_EQ(HWC_CONFIG_ID_25,
1634 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001635 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001636}
1637
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001638TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1639 auto refreshRateConfigs =
1640 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1641 /*currentConfigId=*/HWC_CONFIG_ID_90);
1642
1643 // Allow group switching.
1644 RefreshRateConfigs::Policy policy;
1645 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1646 policy.allowGroupSwitching = true;
1647 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1648
1649 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1650 .vote = LayerVoteType::Min,
1651 .weight = 1.f,
1652 .focused = true}};
1653
1654 ASSERT_EQ(HWC_CONFIG_ID_90,
1655 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1656 .getModeId());
1657}
1658
Steven Thomasf734df42020-04-13 21:09:28 -07001659TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1660 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001661 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001662 /*currentConfigId=*/HWC_CONFIG_ID_60);
1663
1664 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1665 layers[0].name = "Test layer";
1666
Steven Thomasbb374322020-04-28 22:47:16 -07001667 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001668 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001669 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001670 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001671 layers[0].vote = voteType;
1672 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001673 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001674 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001675 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001676 };
1677
1678 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001679 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001680 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001681 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001682 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001683 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001684 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1685 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1686 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1687 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1688 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1689 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001690
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001691 // Layers not focused are not allowed to override primary config
1692 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001693 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001694 /*focused=*/false));
1695 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001696 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001697 /*focused=*/false));
1698
Steven Thomasf734df42020-04-13 21:09:28 -07001699 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001700 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001701 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1702 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001703 EXPECT_EQ(HWC_CONFIG_ID_90,
1704 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001705 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001706 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001707
1708 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001709 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001710 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001711 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1712 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1713 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1714 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1715 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1716 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001717}
1718
Steven Thomasbb374322020-04-28 22:47:16 -07001719TEST_F(RefreshRateConfigsTest, idle) {
1720 auto refreshRateConfigs =
1721 std::make_unique<RefreshRateConfigs>(m60_90Device,
1722 /*currentConfigId=*/HWC_CONFIG_ID_60);
1723
1724 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1725 layers[0].name = "Test layer";
1726
Marin Shalamanov23c44202020-12-22 19:09:20 +01001727 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001728 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001729 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001730 RefreshRateConfigs::GlobalSignals consideredSignals;
1731 const auto configId =
1732 refreshRateConfigs
1733 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1734 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001735 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001736 // Refresh rate will be chosen by either touch state or idle state
1737 EXPECT_EQ(!touchActive, consideredSignals.idle);
1738 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001739 };
1740
1741 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001742 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001743 0);
1744
1745 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001746 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1747 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1748 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1749 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1750 EXPECT_EQ(HWC_CONFIG_ID_90,
1751 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1752 EXPECT_EQ(HWC_CONFIG_ID_90,
1753 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001754
1755 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001756 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001757 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001758 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001759
1760 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001761 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001762 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1763 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1764 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1765 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1766 EXPECT_EQ(HWC_CONFIG_ID_60,
1767 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1768 EXPECT_EQ(HWC_CONFIG_ID_60,
1769 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001770
1771 // Idle should be applied rather than the current config when there are no layers.
1772 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001773 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001774 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001775}
1776
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001777TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1778 auto refreshRateConfigs =
1779 std::make_unique<RefreshRateConfigs>(m60_90Device,
1780 /*currentConfigId=*/HWC_CONFIG_ID_60);
1781
1782 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001783 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1784 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001785 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001786 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001787 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001788 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001789 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001790 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001791 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001792 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001793 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001794 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001795 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001796 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001797 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001798 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001799 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1800 }
1801}
1802
1803TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001804 auto refreshRateConfigs =
1805 std::make_unique<RefreshRateConfigs>(m60_90Device,
1806 /*currentConfigId=*/HWC_CONFIG_ID_60);
1807
1808 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001809 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001810 const RefreshRate& expected;
1811 };
1812
1813 /* clang-format off */
1814 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001815 {Fps(24.0f), mExpected60Config},
1816 {Fps(30.0f), mExpected60Config},
1817 {Fps(45.0f), mExpected90Config},
1818 {Fps(60.0f), mExpected60Config},
1819 {Fps(72.0f), mExpected90Config},
1820 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001821 };
1822 /* clang-format on */
1823
1824 // Make sure the test tests all the known frame rate
1825 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001826 const auto equal =
1827 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1828 knownFrameRatesExpectations.begin(),
1829 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001830 EXPECT_TRUE(equal);
1831
1832 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1833 auto& layer = layers[0];
1834 layer.vote = LayerVoteType::Heuristic;
1835 for (const auto& expectedRate : knownFrameRatesExpectations) {
1836 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001837 const auto& refreshRate =
1838 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001839 EXPECT_EQ(expectedRate.expected, refreshRate);
1840 }
1841}
1842
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001843TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1844 auto refreshRateConfigs =
1845 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1846 /*currentConfigId=*/HWC_CONFIG_ID_60);
1847
1848 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1849 LayerRequirement{.weight = 0.5f}};
1850 auto& explicitExactLayer = layers[0];
1851 auto& explicitExactOrMultipleLayer = layers[1];
1852
1853 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1854 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1855 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1856
1857 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1858 explicitExactLayer.name = "ExplicitExact";
1859 explicitExactLayer.desiredRefreshRate = Fps(30);
1860
1861 EXPECT_EQ(mExpected30Config,
1862 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1863 EXPECT_EQ(mExpected30Config,
1864 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1865
1866 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1867 explicitExactLayer.desiredRefreshRate = Fps(60);
1868 EXPECT_EQ(mExpected60Config,
1869 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1870
1871 explicitExactLayer.desiredRefreshRate = Fps(72);
1872 EXPECT_EQ(mExpected72Config,
1873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1874
1875 explicitExactLayer.desiredRefreshRate = Fps(90);
1876 EXPECT_EQ(mExpected90Config,
1877 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1878
1879 explicitExactLayer.desiredRefreshRate = Fps(120);
1880 EXPECT_EQ(mExpected120Config,
1881 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1882}
1883
1884TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07001885 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001886 auto refreshRateConfigs =
1887 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001888 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001889
1890 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1891 LayerRequirement{.weight = 0.5f}};
1892 auto& explicitExactLayer = layers[0];
1893 auto& explicitExactOrMultipleLayer = layers[1];
1894
1895 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1896 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1897 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1898
1899 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1900 explicitExactLayer.name = "ExplicitExact";
1901 explicitExactLayer.desiredRefreshRate = Fps(30);
1902
1903 EXPECT_EQ(mExpected60Config,
1904 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1905 EXPECT_EQ(mExpected120Config,
1906 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1907
1908 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1909 explicitExactLayer.desiredRefreshRate = Fps(60);
1910 EXPECT_EQ(mExpected120Config,
1911 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1912
1913 explicitExactLayer.desiredRefreshRate = Fps(72);
1914 EXPECT_EQ(mExpected72Config,
1915 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1916
1917 explicitExactLayer.desiredRefreshRate = Fps(90);
1918 EXPECT_EQ(mExpected90Config,
1919 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1920
1921 explicitExactLayer.desiredRefreshRate = Fps(120);
1922 EXPECT_EQ(mExpected120Config,
1923 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1924}
1925
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001926TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1927 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1928
1929 auto refreshRateConfigs =
1930 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1931 /*currentConfigId=*/HWC_CONFIG_ID_60);
1932
1933 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1934 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1935 LayerRequirement>(),
1936 .globalSignals = {.touch = true,
1937 .idle = true},
1938 .outSignalsConsidered =
1939 {.touch = true,
1940 .idle = false},
1941 .resultingBestRefreshRate =
1942 createRefreshRate(
1943 mConfig90)});
1944
1945 EXPECT_EQ(createRefreshRate(mConfig90),
1946 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1947 {.touch = true, .idle = true}));
1948
1949 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
1950 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1951 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1952 LayerRequirement>(),
1953 .globalSignals = {.touch = true,
1954 .idle = true},
1955 .outSignalsConsidered =
1956 cachedSignalsConsidered,
1957 .resultingBestRefreshRate =
1958 createRefreshRate(
1959 mConfig30)});
1960
1961 GlobalSignals signalsConsidered;
1962 EXPECT_EQ(createRefreshRate(mConfig30),
1963 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1964 {.touch = true, .idle = true},
1965 &signalsConsidered));
1966
1967 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1968}
1969
1970TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1971 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1972
1973 auto refreshRateConfigs =
1974 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1975 /*currentConfigId=*/HWC_CONFIG_ID_60);
1976 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1977
1978 GlobalSignals globalSignals{.touch = true, .idle = true};
1979 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1980 LayerRequirement{.weight = 0.5f}};
1981 const auto lastResult =
1982 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1983 /* outSignalsConsidered */ nullptr);
1984
1985 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1986
1987 ASSERT_TRUE(lastInvocation.has_value());
1988 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1989 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1990 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1991
1992 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1993 // to getBestRefreshRate()
1994 GlobalSignals detaultSignals;
1995 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1996}
1997
Ady Abraham5e4e9832021-06-14 13:40:56 -07001998TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07001999 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002000 auto refreshRateConfigs =
2001 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002002 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002003
2004 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2005 LayerRequirement{.weight = 0.5f}};
2006 auto& explicitExactLayer = layers[0];
2007 auto& explicitExactOrMultipleLayer = layers[1];
2008
2009 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2010 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2011 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2012
2013 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2014 explicitExactLayer.name = "ExplicitExact";
2015 explicitExactLayer.desiredRefreshRate = Fps(30);
2016
2017 EXPECT_EQ(mExpected60Config,
2018 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2019 EXPECT_EQ(mExpected120Config,
2020 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2021
2022 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2023
2024 EXPECT_EQ(mExpected60Config,
2025 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2026 EXPECT_EQ(mExpected60Config,
2027 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2028}
2029
Ana Krulecb9afd792020-06-11 13:16:15 -07002030TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2031 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2032 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2033 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2034}
2035
2036TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2037 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2038
2039 auto refreshRateConfigs =
2040 std::make_unique<RefreshRateConfigs>(m60_90Device,
2041 /*currentConfigId=*/HWC_CONFIG_ID_90);
2042 // SetPolicy(60, 90), current 90Hz => TurnOn.
2043 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2044
2045 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002046 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2047 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002048 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2049
Ady Abrahama91605e2021-06-18 11:41:47 -07002050 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002051 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2052 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002053 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002054
2055 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002056 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2057 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002058 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2059}
2060
TreeHugger Robot758ab612021-06-22 19:17:29 +00002061TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2062 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2063
2064 // Tests with 120Hz
2065 auto refreshRateConfigs =
2066 std::make_unique<RefreshRateConfigs>(m60_120Device,
2067 /*currentConfigId=*/HWC_CONFIG_ID_120);
2068 // SetPolicy(0, 60), current 60Hz => TurnOn.
2069 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2070 0);
2071 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2072
2073 // SetPolicy(60, 60), current 60Hz => TurnOff.
2074 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2075 0);
2076 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2077
2078 // SetPolicy(60, 120), current 60Hz => TurnOn.
2079 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2080 0);
2081 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2082
2083 // SetPolicy(120, 120), current 120Hz => TurnOff.
2084 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2085 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2086 0);
2087 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2088}
2089
Ady Abraham5cc2e262021-03-25 13:09:17 -07002090TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002091 auto refreshRateConfigs =
2092 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2093 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002094
2095 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002096 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2097 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002098
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002099 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002100 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2101 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002102
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002103 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002104 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2105 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002106
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002107 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002108 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2109 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002110
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002111 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002112 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2113 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002114
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002115 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002116 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2117 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
2118 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.6f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002119}
2120
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002121TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002122 auto refreshRateConfigs =
2123 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2124 HWC_CONFIG_ID_120);
2125
2126 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002127 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2128 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002129}
2130
2131TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002132 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002133 auto refreshRateConfigs =
2134 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002135 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002136
2137 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2138 layers[0].name = "Test layer";
2139 layers[0].ownerUid = 1234;
2140 layers[0].desiredRefreshRate = Fps(60.0f);
2141 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002142 auto frameRateOverrides =
2143 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002144 ASSERT_EQ(1, frameRateOverrides.size());
2145 ASSERT_EQ(1, frameRateOverrides.count(1234));
2146 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2147
2148 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002149 frameRateOverrides =
2150 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002151 ASSERT_EQ(1, frameRateOverrides.size());
2152 ASSERT_EQ(1, frameRateOverrides.count(1234));
2153 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2154
2155 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002156 frameRateOverrides =
2157 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002158 ASSERT_TRUE(frameRateOverrides.empty());
2159
2160 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002161 frameRateOverrides =
2162 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002163 ASSERT_TRUE(frameRateOverrides.empty());
2164
2165 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002166 frameRateOverrides =
2167 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002168 ASSERT_TRUE(frameRateOverrides.empty());
2169
2170 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002171 frameRateOverrides =
2172 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002173 ASSERT_TRUE(frameRateOverrides.empty());
2174}
2175
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002176TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002177 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002178 auto refreshRateConfigs =
2179 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002180 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002181
2182 auto layers = std::vector<LayerRequirement>{
2183 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2184 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2185 };
2186
2187 layers[0].name = "Test layer 1234";
2188 layers[0].desiredRefreshRate = Fps(60.0f);
2189 layers[0].vote = LayerVoteType::ExplicitDefault;
2190
2191 layers[1].name = "Test layer 5678";
2192 layers[1].desiredRefreshRate = Fps(30.0f);
2193 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002194 auto frameRateOverrides =
2195 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002196
2197 ASSERT_EQ(2, frameRateOverrides.size());
2198 ASSERT_EQ(1, frameRateOverrides.count(1234));
2199 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2200 ASSERT_EQ(1, frameRateOverrides.count(5678));
2201 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2202
2203 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002204 frameRateOverrides =
2205 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002206 ASSERT_EQ(1, frameRateOverrides.size());
2207 ASSERT_EQ(1, frameRateOverrides.count(1234));
2208 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2209
2210 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002211 frameRateOverrides =
2212 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2213 ASSERT_TRUE(frameRateOverrides.empty());
2214}
2215
2216TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002217 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002218 auto refreshRateConfigs =
2219 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002220 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002221
2222 auto layers = std::vector<LayerRequirement>{
2223 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2224 };
2225
2226 layers[0].name = "Test layer";
2227 layers[0].desiredRefreshRate = Fps(60.0f);
2228 layers[0].vote = LayerVoteType::ExplicitDefault;
2229
2230 auto frameRateOverrides =
2231 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2232 ASSERT_EQ(1, frameRateOverrides.size());
2233 ASSERT_EQ(1, frameRateOverrides.count(1234));
2234 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2235
2236 frameRateOverrides =
2237 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2238 ASSERT_EQ(1, frameRateOverrides.size());
2239 ASSERT_EQ(1, frameRateOverrides.count(1234));
2240 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2241
2242 layers[0].vote = LayerVoteType::ExplicitExact;
2243 frameRateOverrides =
2244 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2245 ASSERT_EQ(1, frameRateOverrides.size());
2246 ASSERT_EQ(1, frameRateOverrides.count(1234));
2247 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2248
2249 frameRateOverrides =
2250 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2251 ASSERT_EQ(1, frameRateOverrides.size());
2252 ASSERT_EQ(1, frameRateOverrides.count(1234));
2253 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2254
2255 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2256 frameRateOverrides =
2257 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2258 ASSERT_EQ(1, frameRateOverrides.size());
2259 ASSERT_EQ(1, frameRateOverrides.count(1234));
2260 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2261
2262 frameRateOverrides =
2263 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002264 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002265}
2266
Alec Mouri0a1cc962019-03-14 12:33:02 -07002267} // namespace
2268} // namespace scheduler
2269} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002270
2271// TODO(b/129481165): remove the #pragma below and fix conversion issues
2272#pragma clang diagnostic pop // ignored "-Wextra"