blob: 4f1b23d1589d4d22897b5636ccdffcfbd11aa9f5 [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) {
54 return {displayMode->getId(), displayMode, displayMode->getFps(),
55 RefreshRate::ConstructorTag(0)};
56 }
57
Marin Shalamanove8a663d2020-11-24 17:48:00 +010058 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070059 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
60 }
61
Marin Shalamanove8a663d2020-11-24 17:48:00 +010062 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070063 return refreshRateConfigs.mKnownFrameRates;
64 }
65
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010066 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
67 std::lock_guard lock(refreshRateConfigs.mLock);
68 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
69 }
70
71 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
72 std::lock_guard lock(refreshRateConfigs.mLock);
73 return *refreshRateConfigs.mMinSupportedRefreshRate;
74 }
75
76 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
77 std::lock_guard lock(refreshRateConfigs.mLock);
78 return *refreshRateConfigs.mMaxSupportedRefreshRate;
79 }
80
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020081 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
82 const GetBestRefreshRateInvocation& invocation) {
83 std::lock_guard lock(refreshRateConfigs.mLock);
84 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
85 GetBestRefreshRateInvocation(invocation));
86 }
87
88 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
89 const RefreshRateConfigs& refreshRateConfigs) {
90 std::lock_guard lock(refreshRateConfigs.mLock);
91 return refreshRateConfigs.lastBestRefreshRateInvocation;
92 }
93
Ady Abrahamabc27602020-04-08 17:20:29 -070094 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010095 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
96 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
97 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
98 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
99 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
100 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
101 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Ady Abrahamabc27602020-04-08 17:20:29 -0700102
103 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100104 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
105 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100106 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100107 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100108 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100109 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
110 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100111 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100112 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
113 DisplayModePtr mConfig120 =
114 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100115 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100116 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
117 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100118 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100119 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100120 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100121 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
122 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700123
124 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200125 // The positions of the configs in the arrays below MUST match their IDs. For example,
126 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100127 DisplayModes m60OnlyConfigDevice = {mConfig60};
128 DisplayModes m60_90Device = {mConfig60, mConfig90};
129 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
130 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
131 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
132 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
133 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
134 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
135 mConfig120DifferentGroup, mConfig30};
136 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
137 mConfig30};
138 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
139 mConfig120DifferentGroup, mConfig30};
140 DisplayModes m25_30_50_60Device = {mConfig60,
141 mConfig90,
142 mConfig72DifferentGroup,
143 mConfig120DifferentGroup,
144 mConfig30DifferentGroup,
145 mConfig25DifferentGroup,
146 mConfig50};
Ady Abrahamabc27602020-04-08 17:20:29 -0700147
148 // Expected RefreshRate objects
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100149 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, Fps(60),
Ady Abrahamabc27602020-04-08 17:20:29 -0700150 RefreshRate::ConstructorTag(0)};
151 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100152 createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
153 Fps(60), RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100154 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700155 RefreshRate::ConstructorTag(0)};
156 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100157 Fps(90), RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700158 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100159 mConfig90DifferentResolution, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700160 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100161 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, Fps(72.0f),
Ady Abrahamabc27602020-04-08 17:20:29 -0700162 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100163 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, Fps(30),
Ady Abrahamabc27602020-04-08 17:20:29 -0700164 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100165 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, Fps(120),
Ady Abrahamabc27602020-04-08 17:20:29 -0700166 RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700167private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100168 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
169 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700170};
171
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100172using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700173
Alec Mouri0a1cc962019-03-14 12:33:02 -0700174RefreshRateConfigsTest::RefreshRateConfigsTest() {
175 const ::testing::TestInfo* const test_info =
176 ::testing::UnitTest::GetInstance()->current_test_info();
177 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
178}
179
180RefreshRateConfigsTest::~RefreshRateConfigsTest() {
181 const ::testing::TestInfo* const test_info =
182 ::testing::UnitTest::GetInstance()->current_test_info();
183 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
184}
185
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100186DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
187 int64_t vsyncPeriod, ui::Size resolution) {
188 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
189 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700190 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100191 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100192 .setHeight(resolution.height)
193 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700194 .build();
195}
196
Alec Mouri0a1cc962019-03-14 12:33:02 -0700197namespace {
198/* ------------------------------------------------------------------------
199 * Test cases
200 */
Ady Abraham2139f732019-11-13 18:56:40 -0800201TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700202 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700203 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
204 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700205}
206
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100207TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100208 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700209 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
210 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100211 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100212 0);
213 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
214 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100215}
216
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700217TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700218 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700219 std::make_unique<RefreshRateConfigs>(m60_90Device,
220 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700221
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100222 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
223 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700224
Ady Abrahamabc27602020-04-08 17:20:29 -0700225 ASSERT_EQ(mExpected60Config, minRate);
226 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800227
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100228 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800229 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800230 ASSERT_EQ(minRateByPolicy, minRate);
231 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700232}
Ady Abraham2139f732019-11-13 18:56:40 -0800233
234TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800235 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700236 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
237 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800238
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100239 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
240 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
241 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800242 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800243
Ady Abrahamabc27602020-04-08 17:20:29 -0700244 ASSERT_EQ(mExpected60Config, minRate);
245 ASSERT_EQ(mExpected60Config, minRate60);
246 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800247
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100248 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
249 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100250 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800251
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100252 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800253 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800254
Ady Abrahamabc27602020-04-08 17:20:29 -0700255 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
256 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
257 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
258}
259
260TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
261 auto refreshRateConfigs =
262 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
263 /*currentConfigId=*/HWC_CONFIG_ID_60);
264
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100265 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
266 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
267 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700268 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
269
270 ASSERT_EQ(mExpected60Config, minRate);
271 ASSERT_EQ(mExpected60Config, minRate60);
272 ASSERT_EQ(mExpected60Config, performanceRate60);
273
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100274 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
275 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100276 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700277
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100278 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700279 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
280
281 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
282 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
283 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800284}
285
286TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800287 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700288 std::make_unique<RefreshRateConfigs>(m60_90Device,
289 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800290
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100291 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
292 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800293
Ady Abrahamabc27602020-04-08 17:20:29 -0700294 ASSERT_EQ(mExpected60Config, minRate);
295 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800296
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100297 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
298 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800299
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100300 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
301 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700302 ASSERT_EQ(mExpected60Config, minRate60);
303 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800304}
305
306TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800307 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700308 std::make_unique<RefreshRateConfigs>(m60_90Device,
309 /*currentConfigId=*/HWC_CONFIG_ID_60);
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_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800313 }
314
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100315 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800316 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100317 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100318 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800319 }
320
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100321 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
322 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800323 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100324 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100325 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800326 }
327}
328
Steven Thomasbb374322020-04-28 22:47:16 -0700329TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700330 auto refreshRateConfigs =
331 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
332 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800333
Steven Thomasdebafed2020-05-18 17:30:35 -0700334 // If there are no layers we select the default frame rate, which is the max of the primary
335 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800336 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700337 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700338 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800339
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100340 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
341 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700342 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700343 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800344}
345
Steven Thomasbb374322020-04-28 22:47:16 -0700346TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800347 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700348 std::make_unique<RefreshRateConfigs>(m60_90Device,
349 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800350
351 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
352 auto& lr = layers[0];
353
354 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800355 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700356 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700357 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358
359 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800360 lr.name = "Max";
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(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800366 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700368 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100370 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800371 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700372 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100375 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800376 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700377 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700378 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100380 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700382 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100385 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800386 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700387 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700388 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800390 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100391 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
392 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800393
394 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700395 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700396 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397
398 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700399 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700400 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100402 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700404 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700405 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800406
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100407 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700408 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700409 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800410
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100411 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700412 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700413 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800414
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100415 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700416 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700417 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100419 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700420 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700421 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800422
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100423 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
424 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
425 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
427 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700428 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700429 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
431 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700432 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700433 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100435 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700437 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700438 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100440 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700442 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100444 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700445 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700446 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100448 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100452 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700453 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100456 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
457 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
458 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700460 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700461 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462
463 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700464 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700465 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100467 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800468 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700469 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700470 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800471
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100472 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700473 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700474 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100476 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700477 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700478 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100480 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700481 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700482 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800483
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100484 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700485 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700486 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487}
488
Steven Thomasbb374322020-04-28 22:47:16 -0700489TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700491 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
492 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800493
494 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
495 auto& lr = layers[0];
496
497 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700498 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700499 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500
501 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700502 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700503 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800504
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100505 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800506 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700507 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700508 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800509
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100510 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700511 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700512 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800513
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100514 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700515 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700516 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800517
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100518 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700519 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700520 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800521
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100522 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700523 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700524 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800525}
526
Steven Thomasbb374322020-04-28 22:47:16 -0700527TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800528 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700529 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
530 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800531
532 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
533 LayerRequirement{.weight = 1.0f}};
534 auto& lr1 = layers[0];
535 auto& lr2 = layers[1];
536
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100537 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800538 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100539 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800540 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700541 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700542 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800543
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100544 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100546 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700548 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700549 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800550
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100551 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800552 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100553 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700556 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557}
558
Steven Thomasbb374322020-04-28 22:47:16 -0700559TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800560 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700561 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
562 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800563
564 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
565 LayerRequirement{.weight = 1.0f}};
566 auto& lr1 = layers[0];
567 auto& lr2 = layers[1];
568
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100569 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800570 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800571 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100572 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800573 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800574 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700575 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700576 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800577
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100578 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800579 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800580 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100581 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800582 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800583 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700584 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700585 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800586
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100587 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800588 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800589 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100590 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800591 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800592 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700593 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700594 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800595
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100596 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800597 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800598 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100599 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800600 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800601 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700602 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700603 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800604
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100605 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800606 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
607 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100608 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800609 lr2.vote = LayerVoteType::ExplicitDefault;
610 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700611 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700612 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800613
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100614 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800615 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800616 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100617 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800618 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800619 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700620 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700621 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800622
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100623 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800624 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800625 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100626 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700629 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700630 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800631
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100632 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800633 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800634 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100635 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800637 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700638 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700639 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800640
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100641 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800642 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800643 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100644 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800645 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800646 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700647 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700648 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800649}
650
Steven Thomasbb374322020-04-28 22:47:16 -0700651TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800652 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700653 std::make_unique<RefreshRateConfigs>(m30_60Device,
654 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800655
656 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
657 auto& lr = layers[0];
658
659 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700660 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700661 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800662
663 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700664 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700665 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800666
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100667 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800668 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700669 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700670 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800671
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100672 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700673 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700674 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800675
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100676 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700677 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700678 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800679
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100680 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700681 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700682 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800683
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100684 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700685 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700686 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800687}
688
Steven Thomasbb374322020-04-28 22:47:16 -0700689TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800690 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700691 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
692 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800693
694 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
695 auto& lr = layers[0];
696
697 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800698 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700699 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700700 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800701
702 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800703 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700704 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700705 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800706
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100707 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800708 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800709 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700710 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700711 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800712
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100713 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800714 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700715 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700716 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700717 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700718 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800719
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100720 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800721 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700722 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700723 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700724 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700725 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800726
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100727 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800728 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700729 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700730 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700731 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700732 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800733
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100734 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800735 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700736 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700737 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700738 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700739 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800740
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100741 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800742 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
743 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700744 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700745 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700746 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700747 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800748}
749
Steven Thomasbb374322020-04-28 22:47:16 -0700750TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800751 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700752 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
753 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800754
755 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
756 LayerRequirement{.weight = 1.0f}};
757 auto& lr1 = layers[0];
758 auto& lr2 = layers[1];
759
760 lr1.vote = LayerVoteType::Min;
761 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700762 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700763 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800764
765 lr1.vote = LayerVoteType::Min;
766 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100767 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700768 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700769 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800770
771 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800772 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100773 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700774 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700775 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800776
777 lr1.vote = LayerVoteType::Max;
778 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100779 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700780 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800782
783 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800784 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100785 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700786 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700787 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800788
789 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100790 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800791 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100792 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700793 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700794 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800795
796 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100797 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800798 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100799 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700800 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700801 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800802}
803
Steven Thomasbb374322020-04-28 22:47:16 -0700804TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700806 std::make_unique<RefreshRateConfigs>(m60_90Device,
807 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808
809 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
810 auto& lr = layers[0];
811
Ady Abraham71c437d2020-01-31 15:56:57 -0800812 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100814 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800815 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700816 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700817 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800818 }
819}
820
Steven Thomasbb374322020-04-28 22:47:16 -0700821TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800822 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700823 std::make_unique<RefreshRateConfigs>(m60_90Device,
824 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800825
826 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
827 LayerRequirement{.weight = 1.0f}};
828 auto& lr1 = layers[0];
829 auto& lr2 = layers[1];
830
831 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100832 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800833 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100834 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700835 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700836 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800837
838 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100839 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800840 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100841 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700842 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700843 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844
845 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100846 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800847 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100848 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700850 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800851}
852
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800853TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100854 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
855 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
856 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
857 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
858 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800859}
860
Steven Thomasbb374322020-04-28 22:47:16 -0700861TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800862 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 std::make_unique<RefreshRateConfigs>(m60_90Device,
864 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800865
866 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
867 auto& lr = layers[0];
868
Ady Abraham71c437d2020-01-31 15:56:57 -0800869 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800870 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100871 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700874 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800875 }
876}
877
Steven Thomasbb374322020-04-28 22:47:16 -0700878TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800879 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700880 std::make_unique<RefreshRateConfigs>(m60_90Device,
881 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800882
883 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
884 LayerRequirement{.weight = 1.0f}};
885 auto& lr1 = layers[0];
886 auto& lr2 = layers[1];
887
888 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100889 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800891 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100892 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800893 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700894 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700895 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800896
897 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100898 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800899 lr1.name = "60Hz ExplicitExactOrMultiple";
900 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100901 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700903 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700904 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800905
906 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100907 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800908 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800909 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800910 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700911 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700912 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800913
914 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100915 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800916 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800917 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100918 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800919 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700920 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700921 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800922
923 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100924 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800925 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800926 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800927 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700928 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700929 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800930}
931
932TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800933 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700934 std::make_unique<RefreshRateConfigs>(m60_90Device,
935 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800936
937 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
938 LayerRequirement{.weight = 1.0f}};
939 auto& lr1 = layers[0];
940 auto& lr2 = layers[1];
941
942 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100943 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800944 lr1.name = "60Hz ExplicitExactOrMultiple";
945 lr2.vote = LayerVoteType::NoVote;
946 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700947 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700948 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800949
950 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100951 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800952 lr1.name = "60Hz ExplicitExactOrMultiple";
953 lr2.vote = LayerVoteType::NoVote;
954 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700955 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700956 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800957
958 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100959 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800960 lr1.name = "60Hz ExplicitExactOrMultiple";
961 lr2.vote = LayerVoteType::Max;
962 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700963 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700964 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800965
966 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100967 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800968 lr1.name = "60Hz ExplicitExactOrMultiple";
969 lr2.vote = LayerVoteType::Max;
970 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700971 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700972 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800973
974 // The other layer starts to provide buffers
975 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100976 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800977 lr1.name = "60Hz ExplicitExactOrMultiple";
978 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100979 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800980 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700981 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700982 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800983}
984
985TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -0700986 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800987 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700988 std::make_unique<RefreshRateConfigs>(m60_90Device,
989 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800990
Ady Abrahamdfd62162020-06-10 16:11:56 -0700991 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
992 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800993
Ady Abrahamdfd62162020-06-10 16:11:56 -0700994 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
995 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800996
997 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
998 LayerRequirement{.weight = 1.0f}};
999 auto& lr1 = layers[0];
1000 auto& lr2 = layers[1];
1001
1002 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001003 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001004 lr1.name = "60Hz ExplicitExactOrMultiple";
1005 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001006 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001007 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001008 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1009 &consideredSignals);
1010 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001011
1012 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001013 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001014 lr1.name = "60Hz ExplicitExactOrMultiple";
1015 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001016 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001017 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001018 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1019 &consideredSignals);
1020 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001021
1022 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001023 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001024 lr1.name = "60Hz ExplicitExactOrMultiple";
1025 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001026 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001027 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001028 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1029 &consideredSignals);
1030 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001031
1032 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001033 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001034 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001035 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001036 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001037 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001038 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1039 &consideredSignals);
1040 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001041}
1042
Steven Thomasbb374322020-04-28 22:47:16 -07001043TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001044 auto refreshRateConfigs =
1045 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1046 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001047
1048 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1049 auto& lr = layers[0];
1050
1051 // Prepare a table with the vote and the expected refresh rate
1052 const std::vector<std::pair<float, float>> testCases = {
1053 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1054
1055 {100, 90}, {90, 90}, {89, 90},
1056
1057 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1058
1059 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1060
1061 {55, 90}, {50, 90}, {45, 90},
1062
1063 {42, 120}, {40, 120}, {39, 120},
1064
1065 {37, 72}, {36, 72}, {35, 72},
1066
1067 {30, 60},
1068 };
1069
1070 for (const auto& test : testCases) {
1071 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001072 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001073
1074 std::stringstream ss;
1075 ss << "ExplicitDefault " << test.first << " fps";
1076 lr.name = ss.str();
1077
1078 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001079 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001080 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001081 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1082 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001083}
1084
Alec Mouri11232a22020-05-14 18:06:25 -07001085TEST_F(RefreshRateConfigsTest,
1086 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1087 auto refreshRateConfigs =
1088 std::make_unique<RefreshRateConfigs>(m60_90Device,
1089 /*currentConfigId=*/HWC_CONFIG_ID_90);
1090
1091 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001092 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001093 0);
1094
1095 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1096 auto& lr = layers[0];
1097
Ady Abrahamdfd62162020-06-10 16:11:56 -07001098 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001099 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001100 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001101 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001102 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001103 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001104 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1105 &consideredSignals));
1106 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001107}
1108
1109TEST_F(RefreshRateConfigsTest,
1110 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1111 auto refreshRateConfigs =
1112 std::make_unique<RefreshRateConfigs>(m60_90Device,
1113 /*currentConfigId=*/HWC_CONFIG_ID_60);
1114
1115 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001116 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001117 0);
1118
1119 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1120 auto& lr = layers[0];
1121
Alec Mouri11232a22020-05-14 18:06:25 -07001122 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001123 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001124 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001125 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001126 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001127 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001128}
1129
1130TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001131 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001132 auto refreshRateConfigs =
1133 std::make_unique<RefreshRateConfigs>(m60_90Device,
1134 /*currentConfigId=*/HWC_CONFIG_ID_90);
1135
1136 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001137 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001138 0);
1139
Ady Abrahamdfd62162020-06-10 16:11:56 -07001140 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001141 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001142 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1143 &consideredSignals));
1144 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001145
1146 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1147 auto& lr = layers[0];
1148
1149 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001150 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001151 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001152 lr.focused = false;
1153 EXPECT_EQ(mExpected90Config,
1154 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1155
1156 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001157 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001158 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001159
1160 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001161 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001162 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001163 lr.focused = false;
1164 EXPECT_EQ(mExpected90Config,
1165 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1166
1167 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001168 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001169 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001170
1171 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001172 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001173 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001174 lr.focused = false;
1175 EXPECT_EQ(mExpected90Config,
1176 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1177
1178 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001179 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001180 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001181
1182 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001183 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001184 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001185 lr.focused = false;
1186 EXPECT_EQ(mExpected90Config,
1187 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1188
1189 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001190 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001191 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001192
1193 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001194 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001195 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001196 lr.focused = false;
1197 EXPECT_EQ(mExpected90Config,
1198 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1199
1200 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001201 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001202 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001203}
1204
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001205TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001206 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001207 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1208 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001209
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001210 // The default policy doesn't allow group switching. Verify that no
1211 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001212 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1213 auto& layer = layers[0];
1214 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001215 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001216 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001217 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001218 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001219
Steven Thomasd4071902020-03-24 16:02:53 -07001220 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001221 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001222 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001223}
Steven Thomasd4071902020-03-24 16:02:53 -07001224
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001225TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1226 auto refreshRateConfigs =
1227 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1228 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001229 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001230 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001231 policy.allowGroupSwitching = true;
1232 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001233
1234 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1235 auto& layer = layers[0];
1236 layer.vote = LayerVoteType::ExplicitDefault;
1237 layer.desiredRefreshRate = Fps(90.0f);
1238 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1239 layer.name = "90Hz ExplicitDefault";
1240 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001241 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001242 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001243 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001244}
1245
1246TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1247 auto refreshRateConfigs =
1248 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1249 /*currentConfigId=*/HWC_CONFIG_ID_60);
1250 RefreshRateConfigs::Policy policy;
1251 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1252 policy.allowGroupSwitching = true;
1253 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001254
1255 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001256 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1257 auto& layer = layers[0];
1258 layer.vote = LayerVoteType::ExplicitDefault;
1259 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001260 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001261 layer.name = "90Hz ExplicitDefault";
1262 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001263 ASSERT_EQ(HWC_CONFIG_ID_60,
1264 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001265 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001266}
1267
1268TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1269 auto refreshRateConfigs =
1270 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1271 /*currentConfigId=*/HWC_CONFIG_ID_60);
1272 RefreshRateConfigs::Policy policy;
1273 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1274 policy.allowGroupSwitching = true;
1275 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1276
1277 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001278
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001279 // 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 +01001280 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1281 auto& layer = layers[0];
1282 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001283 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001284 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001285 layer.name = "60Hz ExplicitDefault";
1286 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001287 ASSERT_EQ(HWC_CONFIG_ID_90,
1288 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001289 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001290}
1291
1292TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1293 auto refreshRateConfigs =
1294 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1295 /*currentConfigId=*/HWC_CONFIG_ID_60);
1296 RefreshRateConfigs::Policy policy;
1297 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1298 policy.allowGroupSwitching = true;
1299 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1300
1301 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001302
1303 // Verify that if the current config is in another group and there are no layers with
1304 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001305
1306 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1307 auto& layer = layers[0];
1308 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001309 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001310 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001311 layer.name = "60Hz ExplicitDefault";
1312 layer.focused = true;
1313
Marin Shalamanov46084422020-10-13 12:33:42 +02001314 ASSERT_EQ(HWC_CONFIG_ID_60,
1315 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001316 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001317}
1318
1319TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1320 auto refreshRateConfigs =
1321 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1322 /*currentConfigId=*/HWC_CONFIG_ID_60);
1323 RefreshRateConfigs::Policy policy;
1324 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1325 policy.allowGroupSwitching = true;
1326 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1327
1328 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001329
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001330 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001331 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001332 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1333 layers[0].vote = LayerVoteType::ExplicitDefault;
1334 layers[0].desiredRefreshRate = Fps(60.0f);
1335 layers[0].seamlessness = Seamlessness::OnlySeamless;
1336 layers[0].name = "60Hz ExplicitDefault";
1337 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001338
1339 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001340 layers[1].vote = LayerVoteType::ExplicitDefault;
1341 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1342 layers[1].desiredRefreshRate = Fps(90.0f);
1343 layers[1].name = "90Hz ExplicitDefault";
1344 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001345
1346 ASSERT_EQ(HWC_CONFIG_ID_90,
1347 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001348 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001349}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001350
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001351TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001352 auto refreshRateConfigs =
1353 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1354 /*currentConfigId=*/HWC_CONFIG_ID_60);
1355 RefreshRateConfigs::Policy policy;
1356 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1357 policy.allowGroupSwitching = true;
1358 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1359
1360 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001361
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001362 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1363 // seamlessness=Default can't change the mode group back to the group of the default
1364 // mode.
1365 // For example, this may happen when a video playback requests and gets a seamed switch,
1366 // but another layer (with default seamlessness) starts animating. The animating layer
1367 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001368 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001369 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001370 layers[0].desiredRefreshRate = Fps(60.0f);
1371 layers[0].focused = true;
1372 layers[0].vote = LayerVoteType::ExplicitDefault;
1373 layers[0].name = "60Hz ExplicitDefault";
1374
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001375 layers.push_back(LayerRequirement{.weight = 0.1f});
1376 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1377 layers[1].desiredRefreshRate = Fps(90.0f);
1378 layers[1].focused = true;
1379 layers[1].vote = LayerVoteType::ExplicitDefault;
1380 layers[1].name = "90Hz ExplicitDefault";
1381
Marin Shalamanov46084422020-10-13 12:33:42 +02001382 ASSERT_EQ(HWC_CONFIG_ID_90,
1383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001384 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001385}
1386
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001387TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1388 auto refreshRateConfigs =
1389 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1390 /*currentConfigId=*/HWC_CONFIG_ID_60);
1391 RefreshRateConfigs::Policy policy;
1392 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1393 policy.allowGroupSwitching = true;
1394 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1395
1396 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1397
1398 // Layer with seamlessness=Default can change the mode group if there's a not
1399 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1400 // when in split screen mode the user switches between the two visible applications.
1401 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1402 layers[0].seamlessness = Seamlessness::Default;
1403 layers[0].desiredRefreshRate = Fps(60.0f);
1404 layers[0].focused = true;
1405 layers[0].vote = LayerVoteType::ExplicitDefault;
1406 layers[0].name = "60Hz ExplicitDefault";
1407
1408 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001409 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1410 layers[1].desiredRefreshRate = Fps(90.0f);
1411 layers[1].focused = false;
1412 layers[1].vote = LayerVoteType::ExplicitDefault;
1413 layers[1].name = "90Hz ExplicitDefault";
1414
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001415 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001416 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1417 .getModeId());
1418}
1419
1420TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1421 auto refreshRateConfigs =
1422 std::make_unique<RefreshRateConfigs>(m30_60Device,
1423 /*currentConfigId=*/HWC_CONFIG_ID_60);
1424
1425 // Allow group switching.
1426 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001427 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001428 policy.allowGroupSwitching = true;
1429 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1430
1431 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1432 auto& layer = layers[0];
1433 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001434 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001435 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001436 layer.name = "60Hz ExplicitExactOrMultiple";
1437 layer.focused = true;
1438
1439 ASSERT_EQ(HWC_CONFIG_ID_60,
1440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001441 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001442
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001443 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001444 ASSERT_EQ(HWC_CONFIG_ID_120,
1445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001446 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001447}
1448
1449TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1450 auto refreshRateConfigs =
1451 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1452 /*currentConfigId=*/HWC_CONFIG_ID_60);
1453
1454 // Allow group switching.
1455 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001456 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001457 policy.allowGroupSwitching = true;
1458 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1459
1460 auto layers = std::vector<
1461 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1462 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001463 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001464 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001465 .weight = 0.5f,
1466 .focused = false},
1467 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1468 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001469 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001470 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001471 .weight = 1.0f,
1472 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001473
1474 ASSERT_EQ(HWC_CONFIG_ID_50,
1475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001476 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001477
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001478 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001479 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001480 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001481
1482 ASSERT_EQ(HWC_CONFIG_ID_25,
1483 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001484 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001485}
1486
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001487TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1488 auto refreshRateConfigs =
1489 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1490 /*currentConfigId=*/HWC_CONFIG_ID_90);
1491
1492 // Allow group switching.
1493 RefreshRateConfigs::Policy policy;
1494 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1495 policy.allowGroupSwitching = true;
1496 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1497
1498 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1499 .vote = LayerVoteType::Min,
1500 .weight = 1.f,
1501 .focused = true}};
1502
1503 ASSERT_EQ(HWC_CONFIG_ID_90,
1504 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1505 .getModeId());
1506}
1507
Steven Thomasf734df42020-04-13 21:09:28 -07001508TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1509 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001510 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001511 /*currentConfigId=*/HWC_CONFIG_ID_60);
1512
1513 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1514 layers[0].name = "Test layer";
1515
Steven Thomasbb374322020-04-28 22:47:16 -07001516 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001517 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001518 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001519 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001520 layers[0].vote = voteType;
1521 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001522 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001523 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001524 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001525 };
1526
1527 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001528 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001529 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001530 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001531 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001532 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001533 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1534 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1535 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1536 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1537 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1538 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001539
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001540 // Layers not focused are not allowed to override primary config
1541 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001542 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001543 /*focused=*/false));
1544 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001545 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001546 /*focused=*/false));
1547
Steven Thomasf734df42020-04-13 21:09:28 -07001548 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001549 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001550 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1551 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001552 EXPECT_EQ(HWC_CONFIG_ID_90,
1553 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001554 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001555 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001556
1557 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001558 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001559 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001560 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1561 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1562 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1563 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1564 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1565 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001566}
1567
Steven Thomasbb374322020-04-28 22:47:16 -07001568TEST_F(RefreshRateConfigsTest, idle) {
1569 auto refreshRateConfigs =
1570 std::make_unique<RefreshRateConfigs>(m60_90Device,
1571 /*currentConfigId=*/HWC_CONFIG_ID_60);
1572
1573 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1574 layers[0].name = "Test layer";
1575
Marin Shalamanov23c44202020-12-22 19:09:20 +01001576 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001577 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001578 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001579 RefreshRateConfigs::GlobalSignals consideredSignals;
1580 const auto configId =
1581 refreshRateConfigs
1582 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1583 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001584 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001585 // Refresh rate will be chosen by either touch state or idle state
1586 EXPECT_EQ(!touchActive, consideredSignals.idle);
1587 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001588 };
1589
1590 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001591 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001592 0);
1593
1594 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001595 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1596 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1597 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1598 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1599 EXPECT_EQ(HWC_CONFIG_ID_90,
1600 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1601 EXPECT_EQ(HWC_CONFIG_ID_90,
1602 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001603
1604 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001605 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001606 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001607 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001608
1609 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001610 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001611 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1612 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1613 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1614 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1615 EXPECT_EQ(HWC_CONFIG_ID_60,
1616 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1617 EXPECT_EQ(HWC_CONFIG_ID_60,
1618 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001619
1620 // Idle should be applied rather than the current config when there are no layers.
1621 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001622 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001623 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001624}
1625
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001626TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1627 auto refreshRateConfigs =
1628 std::make_unique<RefreshRateConfigs>(m60_90Device,
1629 /*currentConfigId=*/HWC_CONFIG_ID_60);
1630
1631 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001632 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1633 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001634 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001635 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001636 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001637 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001638 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001639 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001640 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001641 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001642 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001643 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001644 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001645 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001646 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001647 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001648 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1649 }
1650}
1651
1652TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001653 auto refreshRateConfigs =
1654 std::make_unique<RefreshRateConfigs>(m60_90Device,
1655 /*currentConfigId=*/HWC_CONFIG_ID_60);
1656
1657 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001658 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001659 const RefreshRate& expected;
1660 };
1661
1662 /* clang-format off */
1663 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001664 {Fps(24.0f), mExpected60Config},
1665 {Fps(30.0f), mExpected60Config},
1666 {Fps(45.0f), mExpected90Config},
1667 {Fps(60.0f), mExpected60Config},
1668 {Fps(72.0f), mExpected90Config},
1669 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001670 };
1671 /* clang-format on */
1672
1673 // Make sure the test tests all the known frame rate
1674 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001675 const auto equal =
1676 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1677 knownFrameRatesExpectations.begin(),
1678 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001679 EXPECT_TRUE(equal);
1680
1681 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1682 auto& layer = layers[0];
1683 layer.vote = LayerVoteType::Heuristic;
1684 for (const auto& expectedRate : knownFrameRatesExpectations) {
1685 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001686 const auto& refreshRate =
1687 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001688 EXPECT_EQ(expectedRate.expected, refreshRate);
1689 }
1690}
1691
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001692TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1693 auto refreshRateConfigs =
1694 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1695 /*currentConfigId=*/HWC_CONFIG_ID_60);
1696
1697 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1698 LayerRequirement{.weight = 0.5f}};
1699 auto& explicitExactLayer = layers[0];
1700 auto& explicitExactOrMultipleLayer = layers[1];
1701
1702 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1703 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1704 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1705
1706 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1707 explicitExactLayer.name = "ExplicitExact";
1708 explicitExactLayer.desiredRefreshRate = Fps(30);
1709
1710 EXPECT_EQ(mExpected30Config,
1711 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1712 EXPECT_EQ(mExpected30Config,
1713 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1714
1715 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1716 explicitExactLayer.desiredRefreshRate = Fps(60);
1717 EXPECT_EQ(mExpected60Config,
1718 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1719
1720 explicitExactLayer.desiredRefreshRate = Fps(72);
1721 EXPECT_EQ(mExpected72Config,
1722 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1723
1724 explicitExactLayer.desiredRefreshRate = Fps(90);
1725 EXPECT_EQ(mExpected90Config,
1726 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1727
1728 explicitExactLayer.desiredRefreshRate = Fps(120);
1729 EXPECT_EQ(mExpected120Config,
1730 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1731}
1732
1733TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
1734 auto refreshRateConfigs =
1735 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1736 /*currentConfigId=*/HWC_CONFIG_ID_60,
1737 /*enableFrameRateOverride=*/true);
1738
1739 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1740 LayerRequirement{.weight = 0.5f}};
1741 auto& explicitExactLayer = layers[0];
1742 auto& explicitExactOrMultipleLayer = layers[1];
1743
1744 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1745 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1746 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1747
1748 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1749 explicitExactLayer.name = "ExplicitExact";
1750 explicitExactLayer.desiredRefreshRate = Fps(30);
1751
1752 EXPECT_EQ(mExpected60Config,
1753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1754 EXPECT_EQ(mExpected120Config,
1755 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1756
1757 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1758 explicitExactLayer.desiredRefreshRate = Fps(60);
1759 EXPECT_EQ(mExpected120Config,
1760 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1761
1762 explicitExactLayer.desiredRefreshRate = Fps(72);
1763 EXPECT_EQ(mExpected72Config,
1764 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1765
1766 explicitExactLayer.desiredRefreshRate = Fps(90);
1767 EXPECT_EQ(mExpected90Config,
1768 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1769
1770 explicitExactLayer.desiredRefreshRate = Fps(120);
1771 EXPECT_EQ(mExpected120Config,
1772 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1773}
1774
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001775TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1776 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1777
1778 auto refreshRateConfigs =
1779 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1780 /*currentConfigId=*/HWC_CONFIG_ID_60);
1781
1782 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1783 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1784 LayerRequirement>(),
1785 .globalSignals = {.touch = true,
1786 .idle = true},
1787 .outSignalsConsidered =
1788 {.touch = true,
1789 .idle = false},
1790 .resultingBestRefreshRate =
1791 createRefreshRate(
1792 mConfig90)});
1793
1794 EXPECT_EQ(createRefreshRate(mConfig90),
1795 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1796 {.touch = true, .idle = true}));
1797
1798 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
1799 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1800 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1801 LayerRequirement>(),
1802 .globalSignals = {.touch = true,
1803 .idle = true},
1804 .outSignalsConsidered =
1805 cachedSignalsConsidered,
1806 .resultingBestRefreshRate =
1807 createRefreshRate(
1808 mConfig30)});
1809
1810 GlobalSignals signalsConsidered;
1811 EXPECT_EQ(createRefreshRate(mConfig30),
1812 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1813 {.touch = true, .idle = true},
1814 &signalsConsidered));
1815
1816 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1817}
1818
1819TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1820 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1821
1822 auto refreshRateConfigs =
1823 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1824 /*currentConfigId=*/HWC_CONFIG_ID_60);
1825 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1826
1827 GlobalSignals globalSignals{.touch = true, .idle = true};
1828 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1829 LayerRequirement{.weight = 0.5f}};
1830 const auto lastResult =
1831 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1832 /* outSignalsConsidered */ nullptr);
1833
1834 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1835
1836 ASSERT_TRUE(lastInvocation.has_value());
1837 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1838 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1839 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1840
1841 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1842 // to getBestRefreshRate()
1843 GlobalSignals detaultSignals;
1844 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1845}
1846
Ana Krulecb9afd792020-06-11 13:16:15 -07001847TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1848 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1849 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1850 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1851}
1852
1853TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1854 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1855
1856 auto refreshRateConfigs =
1857 std::make_unique<RefreshRateConfigs>(m60_90Device,
1858 /*currentConfigId=*/HWC_CONFIG_ID_90);
1859 // SetPolicy(60, 90), current 90Hz => TurnOn.
1860 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1861
1862 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001863 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
1864 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001865 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1866
Ady Abrahama91605e2021-06-18 11:41:47 -07001867 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001868 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
1869 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07001870 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001871
1872 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001873 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
1874 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001875 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1876}
1877
Ady Abraham5cc2e262021-03-25 13:09:17 -07001878TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07001879 auto refreshRateConfigs =
1880 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1881 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001882
1883 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001884 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1885 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001886
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001887 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001888 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1889 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001890
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001891 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001892 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1893 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001894
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001895 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001896 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1897 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001898
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001899 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001900 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1901 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001902
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001903 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001904 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1905 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
1906 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.6f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08001907}
1908
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001909TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001910 auto refreshRateConfigs =
1911 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
1912 HWC_CONFIG_ID_120);
1913
1914 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001915 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
1916 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001917}
1918
1919TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
1920 auto refreshRateConfigs =
1921 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001922 HWC_CONFIG_ID_120,
1923 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001924
1925 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1926 layers[0].name = "Test layer";
1927 layers[0].ownerUid = 1234;
1928 layers[0].desiredRefreshRate = Fps(60.0f);
1929 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001930 auto frameRateOverrides =
1931 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001932 ASSERT_EQ(1, frameRateOverrides.size());
1933 ASSERT_EQ(1, frameRateOverrides.count(1234));
1934 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1935
1936 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001937 frameRateOverrides =
1938 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001939 ASSERT_EQ(1, frameRateOverrides.size());
1940 ASSERT_EQ(1, frameRateOverrides.count(1234));
1941 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1942
1943 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001944 frameRateOverrides =
1945 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001946 ASSERT_TRUE(frameRateOverrides.empty());
1947
1948 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001949 frameRateOverrides =
1950 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001951 ASSERT_TRUE(frameRateOverrides.empty());
1952
1953 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001954 frameRateOverrides =
1955 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001956 ASSERT_TRUE(frameRateOverrides.empty());
1957
1958 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001959 frameRateOverrides =
1960 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001961 ASSERT_TRUE(frameRateOverrides.empty());
1962}
1963
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001964TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001965 auto refreshRateConfigs =
1966 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001967 HWC_CONFIG_ID_120,
1968 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001969
1970 auto layers = std::vector<LayerRequirement>{
1971 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
1972 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
1973 };
1974
1975 layers[0].name = "Test layer 1234";
1976 layers[0].desiredRefreshRate = Fps(60.0f);
1977 layers[0].vote = LayerVoteType::ExplicitDefault;
1978
1979 layers[1].name = "Test layer 5678";
1980 layers[1].desiredRefreshRate = Fps(30.0f);
1981 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001982 auto frameRateOverrides =
1983 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001984
1985 ASSERT_EQ(2, frameRateOverrides.size());
1986 ASSERT_EQ(1, frameRateOverrides.count(1234));
1987 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1988 ASSERT_EQ(1, frameRateOverrides.count(5678));
1989 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
1990
1991 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001992 frameRateOverrides =
1993 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001994 ASSERT_EQ(1, frameRateOverrides.size());
1995 ASSERT_EQ(1, frameRateOverrides.count(1234));
1996 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1997
1998 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001999 frameRateOverrides =
2000 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2001 ASSERT_TRUE(frameRateOverrides.empty());
2002}
2003
2004TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
2005 auto refreshRateConfigs =
2006 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2007 HWC_CONFIG_ID_120,
2008 /*enableFrameRateOverride=*/true);
2009
2010 auto layers = std::vector<LayerRequirement>{
2011 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2012 };
2013
2014 layers[0].name = "Test layer";
2015 layers[0].desiredRefreshRate = Fps(60.0f);
2016 layers[0].vote = LayerVoteType::ExplicitDefault;
2017
2018 auto frameRateOverrides =
2019 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2020 ASSERT_EQ(1, frameRateOverrides.size());
2021 ASSERT_EQ(1, frameRateOverrides.count(1234));
2022 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2023
2024 frameRateOverrides =
2025 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2026 ASSERT_EQ(1, frameRateOverrides.size());
2027 ASSERT_EQ(1, frameRateOverrides.count(1234));
2028 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2029
2030 layers[0].vote = LayerVoteType::ExplicitExact;
2031 frameRateOverrides =
2032 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2033 ASSERT_EQ(1, frameRateOverrides.size());
2034 ASSERT_EQ(1, frameRateOverrides.count(1234));
2035 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2036
2037 frameRateOverrides =
2038 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2039 ASSERT_EQ(1, frameRateOverrides.size());
2040 ASSERT_EQ(1, frameRateOverrides.count(1234));
2041 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2042
2043 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2044 frameRateOverrides =
2045 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2046 ASSERT_EQ(1, frameRateOverrides.size());
2047 ASSERT_EQ(1, frameRateOverrides.count(1234));
2048 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2049
2050 frameRateOverrides =
2051 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002052 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002053}
2054
Marin Shalamanov75f37252021-02-10 21:43:57 +01002055TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
2056 auto refreshRateConfigs =
2057 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2058 /*currentConfigId=*/HWC_CONFIG_ID_30);
2059 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
2060 /* allowGroupSwitching */ false,
2061 /* range */ {Fps(30.0f), Fps(30.0f)}});
2062
2063 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
2064
2065 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
2066 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
2067 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
2068
2069 EXPECT_TRUE(
2070 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
2071 EXPECT_TRUE(
2072 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
2073}
2074
Alec Mouri0a1cc962019-03-14 12:33:02 -07002075} // namespace
2076} // namespace scheduler
2077} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002078
2079// TODO(b/129481165): remove the #pragma below and fix conversion issues
2080#pragma clang diagnostic pop // ignored "-Wextra"