blob: 618c10d6adc951922e549d6880c4ba9a8b8a6aff [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Ady Abraham6fb599b2020-03-05 13:48:22 -080030#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "DisplayHardware/HWC2.h"
32#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
36namespace android {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010037
Alec Mouri0a1cc962019-03-14 12:33:02 -070038namespace scheduler {
39
Peiyong Line9d809e2020-04-14 13:10:48 -070040namespace hal = android::hardware::graphics::composer::hal;
41
Alec Mouri0a1cc962019-03-14 12:33:02 -070042using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080043using LayerVoteType = RefreshRateConfigs::LayerVoteType;
44using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070045
46class RefreshRateConfigsTest : public testing::Test {
47protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020048 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
49
Alec Mouri0a1cc962019-03-14 12:33:02 -070050 RefreshRateConfigsTest();
51 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070052
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020053 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070054 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020055 }
56
Marin Shalamanove8a663d2020-11-24 17:48:00 +010057 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070058 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
59 }
60
Marin Shalamanove8a663d2020-11-24 17:48:00 +010061 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070062 return refreshRateConfigs.mKnownFrameRates;
63 }
64
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010065 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
66 std::lock_guard lock(refreshRateConfigs.mLock);
67 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
68 }
69
70 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
71 std::lock_guard lock(refreshRateConfigs.mLock);
72 return *refreshRateConfigs.mMinSupportedRefreshRate;
73 }
74
75 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
76 std::lock_guard lock(refreshRateConfigs.mLock);
77 return *refreshRateConfigs.mMaxSupportedRefreshRate;
78 }
79
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020080 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
81 const GetBestRefreshRateInvocation& invocation) {
82 std::lock_guard lock(refreshRateConfigs.mLock);
83 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
84 GetBestRefreshRateInvocation(invocation));
85 }
86
87 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
88 const RefreshRateConfigs& refreshRateConfigs) {
89 std::lock_guard lock(refreshRateConfigs.mLock);
90 return refreshRateConfigs.lastBestRefreshRateInvocation;
91 }
92
Ady Abrahamabc27602020-04-08 17:20:29 -070093 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010094 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
95 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
96 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
97 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
98 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
99 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
100 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200101 static inline const DisplayModeId HWC_CONFIG_ID_24 = DisplayModeId(7);
102 static inline const DisplayModeId HWC_CONFIG_ID_24_FRAC = DisplayModeId(8);
103 static inline const DisplayModeId HWC_CONFIG_ID_30_FRAC = DisplayModeId(9);
104 static inline const DisplayModeId HWC_CONFIG_ID_60_FRAC = DisplayModeId(10);
Ady Abrahamabc27602020-04-08 17:20:29 -0700105
106 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100107 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200108 DisplayModePtr mConfig60Frac =
109 createDisplayMode(HWC_CONFIG_ID_60_FRAC, 0, Fps(59.94f).getPeriodNsecs());
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100110 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100111 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100112 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100113 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100114 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
115 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100116 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100117 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
118 DisplayModePtr mConfig120 =
119 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100120 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100121 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
122 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100123 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100124 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200125 DisplayModePtr mConfig30Frac =
126 createDisplayMode(HWC_CONFIG_ID_30_FRAC, 0, Fps(29.97f).getPeriodNsecs());
127 DisplayModePtr mConfig25 = createDisplayMode(HWC_CONFIG_ID_25, 0, Fps(25.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100128 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100129 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
130 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200131 DisplayModePtr mConfig24 = createDisplayMode(HWC_CONFIG_ID_24, 0, Fps(24.0f).getPeriodNsecs());
132 DisplayModePtr mConfig24Frac =
133 createDisplayMode(HWC_CONFIG_ID_24_FRAC, 0, Fps(23.976f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700134
135 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200136 // The positions of the configs in the arrays below MUST match their IDs. For example,
137 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100138 DisplayModes m60OnlyConfigDevice = {mConfig60};
139 DisplayModes m60_90Device = {mConfig60, mConfig90};
140 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
141 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
142 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
143 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
144 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
145 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
146 mConfig120DifferentGroup, mConfig30};
147 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
148 mConfig30};
149 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
150 mConfig120DifferentGroup, mConfig30};
151 DisplayModes m25_30_50_60Device = {mConfig60,
152 mConfig90,
153 mConfig72DifferentGroup,
154 mConfig120DifferentGroup,
155 mConfig30DifferentGroup,
156 mConfig25DifferentGroup,
157 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700158 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700159
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200160 // This is a typical TV configuration.
161 DisplayModes m24_25_30_50_60WithFracDevice = {mConfig24, mConfig24Frac, mConfig25,
162 mConfig30, mConfig30Frac, mConfig50,
163 mConfig60, mConfig60Frac};
164
Ady Abrahamabc27602020-04-08 17:20:29 -0700165 // Expected RefreshRate objects
Ady Abraham6b7ad652021-06-23 17:34:57 -0700166 RefreshRate mExpected60Config = {mConfig60, RefreshRate::ConstructorTag(0)};
167 RefreshRate mExpectedAlmost60Config = {createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
168 RefreshRate::ConstructorTag(0)};
169 RefreshRate mExpected90Config = {mConfig90, RefreshRate::ConstructorTag(0)};
170 RefreshRate mExpected90DifferentGroupConfig = {mConfig90DifferentGroup,
171 RefreshRate::ConstructorTag(0)};
172 RefreshRate mExpected90DifferentResolutionConfig = {mConfig90DifferentResolution,
Ady Abrahamabc27602020-04-08 17:20:29 -0700173 RefreshRate::ConstructorTag(0)};
Ady Abraham6b7ad652021-06-23 17:34:57 -0700174 RefreshRate mExpected72Config = {mConfig72, RefreshRate::ConstructorTag(0)};
175 RefreshRate mExpected30Config = {mConfig30, RefreshRate::ConstructorTag(0)};
176 RefreshRate mExpected120Config = {mConfig120, RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700177
Ady Abrahamabc27602020-04-08 17:20:29 -0700178private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100179 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
180 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700181};
182
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100183using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700184
Alec Mouri0a1cc962019-03-14 12:33:02 -0700185RefreshRateConfigsTest::RefreshRateConfigsTest() {
186 const ::testing::TestInfo* const test_info =
187 ::testing::UnitTest::GetInstance()->current_test_info();
188 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
189}
190
191RefreshRateConfigsTest::~RefreshRateConfigsTest() {
192 const ::testing::TestInfo* const test_info =
193 ::testing::UnitTest::GetInstance()->current_test_info();
194 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
195}
196
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100197DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
198 int64_t vsyncPeriod, ui::Size resolution) {
199 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
200 .setId(modeId)
Ady Abraham5e7ee862021-06-23 17:43:41 -0700201 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
Ady Abrahamabc27602020-04-08 17:20:29 -0700202 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100203 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100204 .setHeight(resolution.height)
205 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700206 .build();
207}
208
Alec Mouri0a1cc962019-03-14 12:33:02 -0700209namespace {
210/* ------------------------------------------------------------------------
211 * Test cases
212 */
Ady Abraham2139f732019-11-13 18:56:40 -0800213TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700214 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700215 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
216 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700217}
218
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100219TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100220 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700221 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
222 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100223 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100224 0);
225 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
226 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100227}
228
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700229TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700230 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700231 std::make_unique<RefreshRateConfigs>(m60_90Device,
232 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700233
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100234 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
235 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700236
Ady Abrahamabc27602020-04-08 17:20:29 -0700237 ASSERT_EQ(mExpected60Config, minRate);
238 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800239
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100240 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800241 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800242 ASSERT_EQ(minRateByPolicy, minRate);
243 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700244}
Ady Abraham2139f732019-11-13 18:56:40 -0800245
246TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800247 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700248 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
249 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800250
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100251 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
252 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
253 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800254 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800255
Ady Abrahamabc27602020-04-08 17:20:29 -0700256 ASSERT_EQ(mExpected60Config, minRate);
257 ASSERT_EQ(mExpected60Config, minRate60);
258 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800259
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100260 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
261 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100262 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800263
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100264 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800265 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800266
Ady Abrahamabc27602020-04-08 17:20:29 -0700267 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
268 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
269 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
270}
271
272TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
273 auto refreshRateConfigs =
274 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
275 /*currentConfigId=*/HWC_CONFIG_ID_60);
276
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100277 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
278 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
279 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700280 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
281
282 ASSERT_EQ(mExpected60Config, minRate);
283 ASSERT_EQ(mExpected60Config, minRate60);
284 ASSERT_EQ(mExpected60Config, performanceRate60);
285
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100286 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
287 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100288 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700289
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100290 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700291 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
292
293 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
294 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
295 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800296}
297
298TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800299 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700300 std::make_unique<RefreshRateConfigs>(m60_90Device,
301 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800302
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100303 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
304 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800305
Ady Abrahamabc27602020-04-08 17:20:29 -0700306 ASSERT_EQ(mExpected60Config, minRate);
307 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800308
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100309 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
310 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800311
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100312 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
313 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700314 ASSERT_EQ(mExpected60Config, minRate60);
315 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800316}
317
318TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800319 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700320 std::make_unique<RefreshRateConfigs>(m60_90Device,
321 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800322 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100323 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100324 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800325 }
326
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100327 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800328 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100329 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100330 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800331 }
332
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100333 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
334 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800335 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100336 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100337 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800338 }
339}
340
Steven Thomasbb374322020-04-28 22:47:16 -0700341TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700342 auto refreshRateConfigs =
343 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
344 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800345
Steven Thomasdebafed2020-05-18 17:30:35 -0700346 // If there are no layers we select the default frame rate, which is the max of the primary
347 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800348 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700349 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700350 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800351
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200352 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
353 NO_ERROR);
Ady Abrahamabc27602020-04-08 17:20:29 -0700354 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700355 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200356
357 // We select max even when this will cause a non-seamless switch.
358 refreshRateConfigs = std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
359 /*currentConfigId=*/HWC_CONFIG_ID_60);
360 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy(
361 {HWC_CONFIG_ID_90, /*allowGroupSwitching*/ true, {Fps(0), Fps(90)}}),
362 NO_ERROR);
363 EXPECT_EQ(mExpected90DifferentGroupConfig,
364 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800365}
366
Steven Thomasbb374322020-04-28 22:47:16 -0700367TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700369 std::make_unique<RefreshRateConfigs>(m60_90Device,
370 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
372 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
373 auto& lr = layers[0];
374
375 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800376 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700377 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700378 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
380 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700382 EXPECT_EQ(mExpected90Config,
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(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100391 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800392 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700393 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700394 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100396 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800397 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700398 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700399 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100401 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800402 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700403 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700404 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100406 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800407 lr.name = "24Hz Heuristic";
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
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800411 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100412 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
413 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800414
415 lr.vote = LayerVoteType::Min;
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
419 lr.vote = LayerVoteType::Max;
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 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700425 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700426 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100428 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700429 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700430 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100432 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700433 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700434 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800435
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100436 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700437 EXPECT_EQ(mExpected60Config,
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(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700441 EXPECT_EQ(mExpected60Config,
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 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
445 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
446 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
448 lr.vote = LayerVoteType::Min;
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
452 lr.vote = LayerVoteType::Max;
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 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700458 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700459 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100461 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700462 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700463 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100465 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700466 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700467 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800468
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100469 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700470 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700471 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100473 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700474 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100477 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
478 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
479 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480 lr.vote = LayerVoteType::Min;
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
484 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700485 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700486 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100488 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700490 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700491 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800492
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100493 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700494 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700495 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800496
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100497 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700498 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700499 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100501 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700502 EXPECT_EQ(mExpected60Config,
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(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700506 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700507 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800508}
509
rnlee3bd610662021-06-23 16:27:57 -0700510TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
511 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
512 auto refreshRateConfigs =
513 std::make_unique<RefreshRateConfigs>(m60_90Device,
514 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
515
516 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
517 auto& lr = layers[0];
518
519 lr.vote = LayerVoteType::Min;
520 lr.name = "Min";
521 EXPECT_EQ(mExpected60Config,
522 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
523
524 lr.vote = LayerVoteType::Max;
525 lr.name = "Max";
526 EXPECT_EQ(mExpected90Config,
527 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
528
529 lr.desiredRefreshRate = Fps(90.0f);
530 lr.vote = LayerVoteType::Heuristic;
531 lr.name = "90Hz Heuristic";
532 EXPECT_EQ(mExpected90Config,
533 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
534
535 lr.desiredRefreshRate = Fps(60.0f);
536 lr.name = "60Hz Heuristic";
537 EXPECT_EQ(mExpected60Config,
538 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
539
540 lr.desiredRefreshRate = Fps(45.0f);
541 lr.name = "45Hz Heuristic";
542 EXPECT_EQ(mExpected90Config,
543 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
544
545 lr.desiredRefreshRate = Fps(30.0f);
546 lr.name = "30Hz Heuristic";
547 EXPECT_EQ(mExpected60Config,
548 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
549
550 lr.desiredRefreshRate = Fps(24.0f);
551 lr.name = "24Hz Heuristic";
552 EXPECT_EQ(mExpected60Config,
553 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
554}
555
Steven Thomasbb374322020-04-28 22:47:16 -0700556TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700558 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
559 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800560
561 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
562 auto& lr = layers[0];
563
564 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700565 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700566 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800567
568 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700569 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700570 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100572 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800573 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700574 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700575 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800576
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100577 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700578 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700579 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800580
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100581 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700582 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700583 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800584
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100585 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700586 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700587 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800588
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100589 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700590 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700591 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800592}
593
Steven Thomasbb374322020-04-28 22:47:16 -0700594TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700596 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
597 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800598
599 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
600 LayerRequirement{.weight = 1.0f}};
601 auto& lr1 = layers[0];
602 auto& lr2 = layers[1];
603
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100604 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800605 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100606 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800607 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700608 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700609 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800610
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100611 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800612 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100613 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800614 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700615 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700616 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800617
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100618 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800619 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100620 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800621 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700622 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700623 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800624}
625
Steven Thomasbb374322020-04-28 22:47:16 -0700626TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700628 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
629 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800630
631 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
632 LayerRequirement{.weight = 1.0f}};
633 auto& lr1 = layers[0];
634 auto& lr2 = layers[1];
635
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100636 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100639 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800640 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800641 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700642 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700643 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800644
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100645 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100648 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800649 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800650 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700651 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700652 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800653
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100654 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800655 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100657 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800658 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800659 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700660 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700661 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800662
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100663 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800664 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800665 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100666 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800667 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800668 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700669 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700670 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800671
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100672 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800673 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
674 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100675 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800676 lr2.vote = LayerVoteType::ExplicitDefault;
677 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700678 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700679 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800680
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100681 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800682 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800683 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100684 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800685 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800686 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700687 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700688 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800689
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100690 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800691 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800692 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100693 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800694 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800695 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700696 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700697 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800698
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100699 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800700 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100702 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800703 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800704 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700705 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700706 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800707
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100708 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800709 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800710 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100711 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800712 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800713 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700714 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700715 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800716}
717
rnlee3bd610662021-06-23 16:27:57 -0700718TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
719 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
720 auto refreshRateConfigs =
721 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
722 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
723
724 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
725 LayerRequirement{.weight = 1.0f}};
726 auto& lr1 = layers[0];
727 auto& lr2 = layers[1];
728
729 lr1.desiredRefreshRate = Fps(24.0f);
730 lr1.vote = LayerVoteType::ExplicitDefault;
731 lr1.name = "24Hz ExplicitDefault";
732 lr2.desiredRefreshRate = Fps(60.0f);
733 lr2.vote = LayerVoteType::Heuristic;
734 lr2.name = "60Hz Heuristic";
735 EXPECT_EQ(mExpected120Config,
736 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
737
738 lr1.desiredRefreshRate = Fps(24.0f);
739 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
740 lr1.name = "24Hz ExplicitExactOrMultiple";
741 lr2.desiredRefreshRate = Fps(60.0f);
742 lr2.vote = LayerVoteType::Heuristic;
743 lr2.name = "60Hz Heuristic";
744 EXPECT_EQ(mExpected60Config,
745 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
746
747 lr1.desiredRefreshRate = Fps(24.0f);
748 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
749 lr1.name = "24Hz ExplicitExactOrMultiple";
750 lr2.desiredRefreshRate = Fps(60.0f);
751 lr2.vote = LayerVoteType::ExplicitDefault;
752 lr2.name = "60Hz ExplicitDefault";
753 EXPECT_EQ(mExpected72Config,
754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
755
756 lr1.desiredRefreshRate = Fps(24.0f);
757 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
758 lr1.name = "24Hz ExplicitExactOrMultiple";
759 lr2.desiredRefreshRate = Fps(90.0f);
760 lr2.vote = LayerVoteType::Heuristic;
761 lr2.name = "90Hz Heuristic";
762 EXPECT_EQ(mExpected90Config,
763 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
764
765 lr1.desiredRefreshRate = Fps(24.0f);
766 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
767 lr1.name = "24Hz ExplicitExactOrMultiple";
768 lr2.desiredRefreshRate = Fps(90.0f);
769 lr2.vote = LayerVoteType::ExplicitDefault;
770 lr2.name = "90Hz Heuristic";
771 EXPECT_EQ(mExpected72Config,
772 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
773
774 lr1.desiredRefreshRate = Fps(24.0f);
775 lr1.vote = LayerVoteType::ExplicitDefault;
776 lr1.name = "24Hz ExplicitDefault";
777 lr2.desiredRefreshRate = Fps(90.0f);
778 lr2.vote = LayerVoteType::Heuristic;
779 lr2.name = "90Hz Heuristic";
780 EXPECT_EQ(mExpected90Config,
781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
782
783 lr1.desiredRefreshRate = Fps(24.0f);
784 lr1.vote = LayerVoteType::Heuristic;
785 lr1.name = "24Hz Heuristic";
786 lr2.desiredRefreshRate = Fps(90.0f);
787 lr2.vote = LayerVoteType::ExplicitDefault;
788 lr2.name = "90Hz ExplicitDefault";
789 EXPECT_EQ(mExpected72Config,
790 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
791
792 lr1.desiredRefreshRate = Fps(24.0f);
793 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
794 lr1.name = "24Hz ExplicitExactOrMultiple";
795 lr2.desiredRefreshRate = Fps(90.0f);
796 lr2.vote = LayerVoteType::ExplicitDefault;
797 lr2.name = "90Hz ExplicitDefault";
798 EXPECT_EQ(mExpected72Config,
799 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
800
801 lr1.desiredRefreshRate = Fps(24.0f);
802 lr1.vote = LayerVoteType::ExplicitDefault;
803 lr1.name = "24Hz ExplicitDefault";
804 lr2.desiredRefreshRate = Fps(90.0f);
805 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
806 lr2.name = "90Hz ExplicitExactOrMultiple";
807 EXPECT_EQ(mExpected90Config,
808 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
809}
810
Steven Thomasbb374322020-04-28 22:47:16 -0700811TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700813 std::make_unique<RefreshRateConfigs>(m30_60Device,
814 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815
816 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
817 auto& lr = layers[0];
818
819 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700820 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700821 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800822
823 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700824 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700825 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100827 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800828 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700829 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700830 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800831
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100832 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700833 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700834 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100836 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700837 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700838 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800839
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100840 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700841 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700842 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800843
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100844 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700845 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700846 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847}
848
Steven Thomasbb374322020-04-28 22:47:16 -0700849TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800850 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700851 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
852 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853
854 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
855 auto& lr = layers[0];
856
857 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800858 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700859 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700860 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800861
862 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800863 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700864 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700865 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800866
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100867 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800868 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800869 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700871 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800872
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100873 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800874 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700876 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700877 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700878 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800879
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100880 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800881 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700882 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700883 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700884 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700885 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800886
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100887 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800888 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700889 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700890 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700891 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700892 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800893
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100894 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800895 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700896 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700897 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700898 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700899 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100901 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800902 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
903 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700904 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700905 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700906 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700907 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800908}
909
Steven Thomasbb374322020-04-28 22:47:16 -0700910TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800911 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700912 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
913 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800914
915 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
916 LayerRequirement{.weight = 1.0f}};
917 auto& lr1 = layers[0];
918 auto& lr2 = layers[1];
919
920 lr1.vote = LayerVoteType::Min;
921 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700922 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700923 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800924
925 lr1.vote = LayerVoteType::Min;
926 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100927 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700928 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700929 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800930
931 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800932 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100933 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700934 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700935 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800936
937 lr1.vote = LayerVoteType::Max;
938 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100939 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700940 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700941 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800942
943 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800944 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100945 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700946 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700947 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800948
949 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100950 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800951 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100952 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700953 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700954 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800955
956 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100957 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800958 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100959 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700960 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700961 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800962}
963
Steven Thomasbb374322020-04-28 22:47:16 -0700964TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800965 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700966 std::make_unique<RefreshRateConfigs>(m60_90Device,
967 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800968
969 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
970 auto& lr = layers[0];
971
Ady Abraham71c437d2020-01-31 15:56:57 -0800972 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800973 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100974 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800975 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700976 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700977 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800978 }
979}
980
rnlee3bd610662021-06-23 16:27:57 -0700981TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
982 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
983 auto refreshRateConfigs =
984 std::make_unique<RefreshRateConfigs>(m60_120Device,
985 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
986
987 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
988 auto& lr = layers[0];
989
990 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
991 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
992 lr.desiredRefreshRate = Fps(fps);
993 const auto& refreshRate =
994 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
995 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
996 }
997}
998
Steven Thomasbb374322020-04-28 22:47:16 -0700999TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -08001000 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001001 std::make_unique<RefreshRateConfigs>(m60_90Device,
1002 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -08001003
1004 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1005 LayerRequirement{.weight = 1.0f}};
1006 auto& lr1 = layers[0];
1007 auto& lr2 = layers[1];
1008
1009 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001010 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001011 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001012 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001013 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001014 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001015
1016 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001017 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001018 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001019 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001020 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001021 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001022
1023 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001024 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001025 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001026 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001027 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001028 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001029}
1030
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001031TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001032 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1033 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1034 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1035 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1036 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001037}
1038
Steven Thomasbb374322020-04-28 22:47:16 -07001039TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001040 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001041 std::make_unique<RefreshRateConfigs>(m60_90Device,
1042 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001043
1044 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1045 auto& lr = layers[0];
1046
Ady Abraham71c437d2020-01-31 15:56:57 -08001047 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001048 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001049 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001050 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001051 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001052 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001053 }
1054}
1055
Steven Thomasbb374322020-04-28 22:47:16 -07001056TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001057 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001058 std::make_unique<RefreshRateConfigs>(m60_90Device,
1059 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001060
1061 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1062 LayerRequirement{.weight = 1.0f}};
1063 auto& lr1 = layers[0];
1064 auto& lr2 = layers[1];
1065
1066 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001067 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001068 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001069 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001070 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001071 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001072 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001073 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001074
1075 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001076 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001077 lr1.name = "60Hz ExplicitExactOrMultiple";
1078 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001079 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001080 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001081 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001082 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001083
1084 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001085 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001086 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001087 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001088 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001089 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001090 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001091
1092 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001093 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001094 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001095 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001096 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001097 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001098 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001099 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001100
1101 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001102 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001103 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001104 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001105 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001106 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001107 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001108}
1109
1110TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001111 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001112 std::make_unique<RefreshRateConfigs>(m60_90Device,
1113 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001114
1115 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1116 LayerRequirement{.weight = 1.0f}};
1117 auto& lr1 = layers[0];
1118 auto& lr2 = layers[1];
1119
1120 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001121 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001122 lr1.name = "60Hz ExplicitExactOrMultiple";
1123 lr2.vote = LayerVoteType::NoVote;
1124 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001125 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001126 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001127
1128 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001129 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001130 lr1.name = "60Hz ExplicitExactOrMultiple";
1131 lr2.vote = LayerVoteType::NoVote;
1132 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001133 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001134 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001135
1136 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001137 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001138 lr1.name = "60Hz ExplicitExactOrMultiple";
1139 lr2.vote = LayerVoteType::Max;
1140 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001141 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001142 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001143
1144 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001145 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001146 lr1.name = "60Hz ExplicitExactOrMultiple";
1147 lr2.vote = LayerVoteType::Max;
1148 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001149 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001150 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001151
1152 // The other layer starts to provide buffers
1153 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001154 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001155 lr1.name = "60Hz ExplicitExactOrMultiple";
1156 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001157 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001158 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001159 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001160 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001161}
1162
1163TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001164 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001165 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001166 std::make_unique<RefreshRateConfigs>(m60_90Device,
1167 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001168
Ady Abrahamdfd62162020-06-10 16:11:56 -07001169 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1170 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001171
Ady Abrahamdfd62162020-06-10 16:11:56 -07001172 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1173 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001174
1175 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1176 LayerRequirement{.weight = 1.0f}};
1177 auto& lr1 = layers[0];
1178 auto& lr2 = layers[1];
1179
1180 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001181 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001182 lr1.name = "60Hz ExplicitExactOrMultiple";
1183 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001184 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001185 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001186 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1187 &consideredSignals);
1188 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001189
1190 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001191 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001192 lr1.name = "60Hz ExplicitExactOrMultiple";
1193 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001194 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001195 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001196 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1197 &consideredSignals);
1198 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001199
1200 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001201 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001202 lr1.name = "60Hz ExplicitExactOrMultiple";
1203 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001204 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001205 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001206 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1207 &consideredSignals);
1208 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001209
1210 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001211 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001212 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001213 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001214 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001215 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001216 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1217 &consideredSignals);
1218 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001219}
1220
Steven Thomasbb374322020-04-28 22:47:16 -07001221TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001222 auto refreshRateConfigs =
1223 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1224 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001225
1226 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1227 auto& lr = layers[0];
1228
1229 // Prepare a table with the vote and the expected refresh rate
1230 const std::vector<std::pair<float, float>> testCases = {
1231 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1232
1233 {100, 90}, {90, 90}, {89, 90},
1234
1235 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1236
1237 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1238
1239 {55, 90}, {50, 90}, {45, 90},
1240
1241 {42, 120}, {40, 120}, {39, 120},
1242
1243 {37, 72}, {36, 72}, {35, 72},
1244
1245 {30, 60},
1246 };
1247
1248 for (const auto& test : testCases) {
1249 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001250 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001251
1252 std::stringstream ss;
1253 ss << "ExplicitDefault " << test.first << " fps";
1254 lr.name = ss.str();
1255
1256 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001257 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001258 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001259 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1260 << " but it was " << refreshRate.getFps();
1261 }
1262}
1263
1264TEST_F(RefreshRateConfigsTest,
1265 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1266 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1267 auto& lr = layers[0];
1268
1269 // Test that 23.976 will choose 24 if 23.976 is not supported
1270 {
1271 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1272 mConfig30Frac, mConfig60, mConfig60Frac};
1273 auto refreshRateConfigs =
1274 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1275
1276 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1277 lr.desiredRefreshRate = Fps(23.976f);
1278 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1279 EXPECT_EQ(HWC_CONFIG_ID_24,
1280 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1281 .getModeId());
1282 }
1283
1284 // Test that 24 will choose 23.976 if 24 is not supported
1285 {
1286 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1287 mConfig30Frac, mConfig60, mConfig60Frac};
1288 auto refreshRateConfigs =
1289 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1290 lr.desiredRefreshRate = Fps(24.f);
1291 lr.name = "ExplicitExactOrMultiple 24 fps";
1292 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1293 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1294 .getModeId());
1295 }
1296
1297 // Test that 29.97 will prefer 59.94 over 60 and 30
1298 {
1299 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1300 mConfig30, mConfig60, mConfig60Frac};
1301 auto refreshRateConfigs =
1302 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1303 lr.desiredRefreshRate = Fps(29.97f);
1304 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1305 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1306 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1307 .getModeId());
1308 }
1309}
1310
1311TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1312 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1313 auto& lr = layers[0];
1314
1315 // Test that voting for supported refresh rate will select this refresh rate
1316 {
1317 auto refreshRateConfigs =
1318 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1319 /*currentConfigId=*/HWC_CONFIG_ID_60);
1320
1321 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1322 lr.vote = LayerVoteType::ExplicitExact;
1323 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1324 std::stringstream ss;
1325 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1326 lr.name = ss.str();
1327
1328 auto selecteRefreshRate =
1329 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1330
1331 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1332 << "Expecting " << lr.desiredRefreshRate << " but it was "
1333 << selecteRefreshRate.getFps();
1334 }
1335 }
1336
1337 // Test that 23.976 will choose 24 if 23.976 is not supported
1338 {
1339 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1340 mConfig30Frac, mConfig60, mConfig60Frac};
1341 auto refreshRateConfigs =
1342 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1343 lr.vote = LayerVoteType::ExplicitExact;
1344 lr.desiredRefreshRate = Fps(23.976f);
1345 lr.name = "ExplicitExact 23.976 fps";
1346 EXPECT_EQ(HWC_CONFIG_ID_24,
1347 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1348 .getModeId());
1349 }
1350
1351 // Test that 24 will choose 23.976 if 24 is not supported
1352 {
1353 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1354 mConfig30Frac, mConfig60, mConfig60Frac};
1355 auto refreshRateConfigs =
1356 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1357 lr.desiredRefreshRate = Fps(24.f);
1358 lr.name = "ExplicitExact 24 fps";
1359 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1360 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1361 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001362 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001363}
1364
Alec Mouri11232a22020-05-14 18:06:25 -07001365TEST_F(RefreshRateConfigsTest,
1366 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1367 auto refreshRateConfigs =
1368 std::make_unique<RefreshRateConfigs>(m60_90Device,
1369 /*currentConfigId=*/HWC_CONFIG_ID_90);
1370
1371 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001372 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001373 0);
1374
1375 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1376 auto& lr = layers[0];
1377
Ady Abrahamdfd62162020-06-10 16:11:56 -07001378 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001379 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001380 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001381 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001382 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001383 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001384 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1385 &consideredSignals));
1386 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001387}
1388
1389TEST_F(RefreshRateConfigsTest,
1390 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1391 auto refreshRateConfigs =
1392 std::make_unique<RefreshRateConfigs>(m60_90Device,
1393 /*currentConfigId=*/HWC_CONFIG_ID_60);
1394
1395 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001396 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001397 0);
1398
1399 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1400 auto& lr = layers[0];
1401
Alec Mouri11232a22020-05-14 18:06:25 -07001402 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001403 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001404 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001405 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001406 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001407 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001408}
1409
1410TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001411 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001412 auto refreshRateConfigs =
1413 std::make_unique<RefreshRateConfigs>(m60_90Device,
1414 /*currentConfigId=*/HWC_CONFIG_ID_90);
1415
1416 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001417 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001418 0);
1419
Ady Abrahamdfd62162020-06-10 16:11:56 -07001420 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001421 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001422 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1423 &consideredSignals));
1424 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001425
1426 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1427 auto& lr = layers[0];
1428
1429 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001430 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001431 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001432 lr.focused = false;
1433 EXPECT_EQ(mExpected90Config,
1434 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1435
1436 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001437 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001438 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001439
1440 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001441 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001442 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001443 lr.focused = false;
1444 EXPECT_EQ(mExpected90Config,
1445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1446
1447 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001448 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001449 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001450
1451 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001452 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001453 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001454 lr.focused = false;
1455 EXPECT_EQ(mExpected90Config,
1456 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1457
1458 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001459 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001460 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001461
1462 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001463 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001464 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001465 lr.focused = false;
1466 EXPECT_EQ(mExpected90Config,
1467 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1468
1469 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001470 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001471 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001472
1473 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001474 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001475 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001476 lr.focused = false;
1477 EXPECT_EQ(mExpected90Config,
1478 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1479
1480 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001481 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001482 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001483}
1484
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001485TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001486 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001487 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1488 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001489
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001490 // The default policy doesn't allow group switching. Verify that no
1491 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001492 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1493 auto& layer = layers[0];
1494 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001495 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001496 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001497 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001498 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001499
Steven Thomasd4071902020-03-24 16:02:53 -07001500 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001501 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001502 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001503}
Steven Thomasd4071902020-03-24 16:02:53 -07001504
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001505TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1506 auto refreshRateConfigs =
1507 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1508 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001509 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001510 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001511 policy.allowGroupSwitching = true;
1512 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001513
1514 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1515 auto& layer = layers[0];
1516 layer.vote = LayerVoteType::ExplicitDefault;
1517 layer.desiredRefreshRate = Fps(90.0f);
1518 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1519 layer.name = "90Hz ExplicitDefault";
1520 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001521 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001522 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001523 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001524}
1525
1526TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1527 auto refreshRateConfigs =
1528 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1529 /*currentConfigId=*/HWC_CONFIG_ID_60);
1530 RefreshRateConfigs::Policy policy;
1531 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1532 policy.allowGroupSwitching = true;
1533 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001534
1535 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001536 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1537 auto& layer = layers[0];
1538 layer.vote = LayerVoteType::ExplicitDefault;
1539 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001540 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001541 layer.name = "90Hz ExplicitDefault";
1542 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001543 ASSERT_EQ(HWC_CONFIG_ID_60,
1544 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001545 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001546}
1547
1548TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1549 auto refreshRateConfigs =
1550 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1551 /*currentConfigId=*/HWC_CONFIG_ID_60);
1552 RefreshRateConfigs::Policy policy;
1553 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1554 policy.allowGroupSwitching = true;
1555 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1556
1557 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001558
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001559 // 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 +01001560 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1561 auto& layer = layers[0];
1562 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001563 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001564 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001565 layer.name = "60Hz ExplicitDefault";
1566 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001567 ASSERT_EQ(HWC_CONFIG_ID_90,
1568 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001569 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001570}
1571
1572TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1573 auto refreshRateConfigs =
1574 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1575 /*currentConfigId=*/HWC_CONFIG_ID_60);
1576 RefreshRateConfigs::Policy policy;
1577 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1578 policy.allowGroupSwitching = true;
1579 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1580
1581 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001582
1583 // Verify that if the current config is in another group and there are no layers with
1584 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001585
1586 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1587 auto& layer = layers[0];
1588 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001589 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001590 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001591 layer.name = "60Hz ExplicitDefault";
1592 layer.focused = true;
1593
Marin Shalamanov46084422020-10-13 12:33:42 +02001594 ASSERT_EQ(HWC_CONFIG_ID_60,
1595 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001596 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001597}
1598
1599TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1600 auto refreshRateConfigs =
1601 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1602 /*currentConfigId=*/HWC_CONFIG_ID_60);
1603 RefreshRateConfigs::Policy policy;
1604 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1605 policy.allowGroupSwitching = true;
1606 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1607
1608 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001609
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001610 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001611 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001612 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1613 layers[0].vote = LayerVoteType::ExplicitDefault;
1614 layers[0].desiredRefreshRate = Fps(60.0f);
1615 layers[0].seamlessness = Seamlessness::OnlySeamless;
1616 layers[0].name = "60Hz ExplicitDefault";
1617 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001618
1619 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001620 layers[1].vote = LayerVoteType::ExplicitDefault;
1621 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1622 layers[1].desiredRefreshRate = Fps(90.0f);
1623 layers[1].name = "90Hz ExplicitDefault";
1624 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001625
1626 ASSERT_EQ(HWC_CONFIG_ID_90,
1627 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001628 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001629}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001630
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001631TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001632 auto refreshRateConfigs =
1633 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1634 /*currentConfigId=*/HWC_CONFIG_ID_60);
1635 RefreshRateConfigs::Policy policy;
1636 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1637 policy.allowGroupSwitching = true;
1638 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1639
1640 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001641
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001642 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1643 // seamlessness=Default can't change the mode group back to the group of the default
1644 // mode.
1645 // For example, this may happen when a video playback requests and gets a seamed switch,
1646 // but another layer (with default seamlessness) starts animating. The animating layer
1647 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001648 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001649 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001650 layers[0].desiredRefreshRate = Fps(60.0f);
1651 layers[0].focused = true;
1652 layers[0].vote = LayerVoteType::ExplicitDefault;
1653 layers[0].name = "60Hz ExplicitDefault";
1654
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001655 layers.push_back(LayerRequirement{.weight = 0.1f});
1656 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1657 layers[1].desiredRefreshRate = Fps(90.0f);
1658 layers[1].focused = true;
1659 layers[1].vote = LayerVoteType::ExplicitDefault;
1660 layers[1].name = "90Hz ExplicitDefault";
1661
Marin Shalamanov46084422020-10-13 12:33:42 +02001662 ASSERT_EQ(HWC_CONFIG_ID_90,
1663 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001664 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001665}
1666
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001667TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1668 auto refreshRateConfigs =
1669 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1670 /*currentConfigId=*/HWC_CONFIG_ID_60);
1671 RefreshRateConfigs::Policy policy;
1672 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1673 policy.allowGroupSwitching = true;
1674 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1675
1676 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1677
1678 // Layer with seamlessness=Default can change the mode group if there's a not
1679 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1680 // when in split screen mode the user switches between the two visible applications.
1681 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1682 layers[0].seamlessness = Seamlessness::Default;
1683 layers[0].desiredRefreshRate = Fps(60.0f);
1684 layers[0].focused = true;
1685 layers[0].vote = LayerVoteType::ExplicitDefault;
1686 layers[0].name = "60Hz ExplicitDefault";
1687
1688 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001689 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1690 layers[1].desiredRefreshRate = Fps(90.0f);
1691 layers[1].focused = false;
1692 layers[1].vote = LayerVoteType::ExplicitDefault;
1693 layers[1].name = "90Hz ExplicitDefault";
1694
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001695 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001696 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1697 .getModeId());
1698}
1699
1700TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1701 auto refreshRateConfigs =
1702 std::make_unique<RefreshRateConfigs>(m30_60Device,
1703 /*currentConfigId=*/HWC_CONFIG_ID_60);
1704
1705 // Allow group switching.
1706 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001707 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001708 policy.allowGroupSwitching = true;
1709 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1710
1711 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1712 auto& layer = layers[0];
1713 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001714 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001715 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001716 layer.name = "60Hz ExplicitExactOrMultiple";
1717 layer.focused = true;
1718
1719 ASSERT_EQ(HWC_CONFIG_ID_60,
1720 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001721 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001722
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001723 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001724 ASSERT_EQ(HWC_CONFIG_ID_120,
1725 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001726 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001727}
1728
1729TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1730 auto refreshRateConfigs =
1731 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1732 /*currentConfigId=*/HWC_CONFIG_ID_60);
1733
1734 // Allow group switching.
1735 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001736 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001737 policy.allowGroupSwitching = true;
1738 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1739
1740 auto layers = std::vector<
1741 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1742 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001743 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001744 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001745 .weight = 0.5f,
1746 .focused = false},
1747 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1748 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001749 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001750 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001751 .weight = 1.0f,
1752 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001753
1754 ASSERT_EQ(HWC_CONFIG_ID_50,
1755 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001756 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001757
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001758 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001759 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001760 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001761
1762 ASSERT_EQ(HWC_CONFIG_ID_25,
1763 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001764 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001765}
1766
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001767TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1768 auto refreshRateConfigs =
1769 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1770 /*currentConfigId=*/HWC_CONFIG_ID_90);
1771
1772 // Allow group switching.
1773 RefreshRateConfigs::Policy policy;
1774 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1775 policy.allowGroupSwitching = true;
1776 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1777
1778 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1779 .vote = LayerVoteType::Min,
1780 .weight = 1.f,
1781 .focused = true}};
1782
1783 ASSERT_EQ(HWC_CONFIG_ID_90,
1784 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1785 .getModeId());
1786}
1787
Steven Thomasf734df42020-04-13 21:09:28 -07001788TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1789 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001790 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001791 /*currentConfigId=*/HWC_CONFIG_ID_60);
1792
1793 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1794 layers[0].name = "Test layer";
1795
Steven Thomasbb374322020-04-28 22:47:16 -07001796 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001797 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001798 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001799 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001800 layers[0].vote = voteType;
1801 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001802 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001803 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001804 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001805 };
1806
1807 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001808 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001809 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001810 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001811 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001812 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001813 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1814 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1815 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1816 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1817 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1818 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001819
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001820 // Layers not focused are not allowed to override primary config
1821 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001822 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001823 /*focused=*/false));
1824 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001825 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001826 /*focused=*/false));
1827
Steven Thomasf734df42020-04-13 21:09:28 -07001828 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001829 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001830 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1831 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001832 EXPECT_EQ(HWC_CONFIG_ID_90,
1833 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001834 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001835 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001836
1837 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001838 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001839 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001840 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1841 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1842 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1843 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1844 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1845 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001846}
1847
Steven Thomasbb374322020-04-28 22:47:16 -07001848TEST_F(RefreshRateConfigsTest, idle) {
1849 auto refreshRateConfigs =
1850 std::make_unique<RefreshRateConfigs>(m60_90Device,
1851 /*currentConfigId=*/HWC_CONFIG_ID_60);
1852
1853 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1854 layers[0].name = "Test layer";
1855
Marin Shalamanov23c44202020-12-22 19:09:20 +01001856 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001857 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001858 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001859 RefreshRateConfigs::GlobalSignals consideredSignals;
1860 const auto configId =
1861 refreshRateConfigs
1862 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1863 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001864 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001865 // Refresh rate will be chosen by either touch state or idle state
1866 EXPECT_EQ(!touchActive, consideredSignals.idle);
1867 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001868 };
1869
1870 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001871 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001872 0);
1873
1874 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001875 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1876 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1877 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1878 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1879 EXPECT_EQ(HWC_CONFIG_ID_90,
1880 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1881 EXPECT_EQ(HWC_CONFIG_ID_90,
1882 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001883
1884 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001885 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001886 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001887 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001888
1889 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001890 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001891 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1892 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1893 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1894 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1895 EXPECT_EQ(HWC_CONFIG_ID_60,
1896 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1897 EXPECT_EQ(HWC_CONFIG_ID_60,
1898 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001899
1900 // Idle should be applied rather than the current config when there are no layers.
1901 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001902 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001903 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001904}
1905
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001906TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1907 auto refreshRateConfigs =
1908 std::make_unique<RefreshRateConfigs>(m60_90Device,
1909 /*currentConfigId=*/HWC_CONFIG_ID_60);
1910
1911 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001912 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1913 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001914 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001915 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001916 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001917 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001918 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001919 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001920 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001921 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001922 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001923 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001924 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001925 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001926 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001927 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001928 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1929 }
1930}
1931
1932TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001933 auto refreshRateConfigs =
1934 std::make_unique<RefreshRateConfigs>(m60_90Device,
1935 /*currentConfigId=*/HWC_CONFIG_ID_60);
1936
1937 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001938 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001939 const RefreshRate& expected;
1940 };
1941
1942 /* clang-format off */
1943 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001944 {Fps(24.0f), mExpected60Config},
1945 {Fps(30.0f), mExpected60Config},
1946 {Fps(45.0f), mExpected90Config},
1947 {Fps(60.0f), mExpected60Config},
1948 {Fps(72.0f), mExpected90Config},
1949 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001950 };
1951 /* clang-format on */
1952
1953 // Make sure the test tests all the known frame rate
1954 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001955 const auto equal =
1956 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1957 knownFrameRatesExpectations.begin(),
1958 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001959 EXPECT_TRUE(equal);
1960
1961 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1962 auto& layer = layers[0];
1963 layer.vote = LayerVoteType::Heuristic;
1964 for (const auto& expectedRate : knownFrameRatesExpectations) {
1965 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001966 const auto& refreshRate =
1967 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001968 EXPECT_EQ(expectedRate.expected, refreshRate);
1969 }
1970}
1971
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001972TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1973 auto refreshRateConfigs =
1974 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1975 /*currentConfigId=*/HWC_CONFIG_ID_60);
1976
1977 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1978 LayerRequirement{.weight = 0.5f}};
1979 auto& explicitExactLayer = layers[0];
1980 auto& explicitExactOrMultipleLayer = layers[1];
1981
1982 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1983 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1984 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1985
1986 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1987 explicitExactLayer.name = "ExplicitExact";
1988 explicitExactLayer.desiredRefreshRate = Fps(30);
1989
1990 EXPECT_EQ(mExpected30Config,
1991 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1992 EXPECT_EQ(mExpected30Config,
1993 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1994
1995 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1996 explicitExactLayer.desiredRefreshRate = Fps(60);
1997 EXPECT_EQ(mExpected60Config,
1998 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1999
2000 explicitExactLayer.desiredRefreshRate = Fps(72);
2001 EXPECT_EQ(mExpected72Config,
2002 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2003
2004 explicitExactLayer.desiredRefreshRate = Fps(90);
2005 EXPECT_EQ(mExpected90Config,
2006 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2007
2008 explicitExactLayer.desiredRefreshRate = Fps(120);
2009 EXPECT_EQ(mExpected120Config,
2010 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2011}
2012
2013TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002014 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002015 auto refreshRateConfigs =
2016 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002017 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002018
2019 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2020 LayerRequirement{.weight = 0.5f}};
2021 auto& explicitExactLayer = layers[0];
2022 auto& explicitExactOrMultipleLayer = layers[1];
2023
2024 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2025 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2026 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2027
2028 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2029 explicitExactLayer.name = "ExplicitExact";
2030 explicitExactLayer.desiredRefreshRate = Fps(30);
2031
2032 EXPECT_EQ(mExpected60Config,
2033 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2034 EXPECT_EQ(mExpected120Config,
2035 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2036
2037 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2038 explicitExactLayer.desiredRefreshRate = Fps(60);
2039 EXPECT_EQ(mExpected120Config,
2040 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2041
2042 explicitExactLayer.desiredRefreshRate = Fps(72);
2043 EXPECT_EQ(mExpected72Config,
2044 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2045
2046 explicitExactLayer.desiredRefreshRate = Fps(90);
2047 EXPECT_EQ(mExpected90Config,
2048 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2049
2050 explicitExactLayer.desiredRefreshRate = Fps(120);
2051 EXPECT_EQ(mExpected120Config,
2052 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2053}
2054
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002055TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2056 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2057
2058 auto refreshRateConfigs =
2059 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2060 /*currentConfigId=*/HWC_CONFIG_ID_60);
2061
2062 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2063 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2064 LayerRequirement>(),
2065 .globalSignals = {.touch = true,
2066 .idle = true},
2067 .outSignalsConsidered =
2068 {.touch = true,
2069 .idle = false},
2070 .resultingBestRefreshRate =
2071 createRefreshRate(
2072 mConfig90)});
2073
2074 EXPECT_EQ(createRefreshRate(mConfig90),
2075 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2076 {.touch = true, .idle = true}));
2077
2078 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2079 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2080 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2081 LayerRequirement>(),
2082 .globalSignals = {.touch = true,
2083 .idle = true},
2084 .outSignalsConsidered =
2085 cachedSignalsConsidered,
2086 .resultingBestRefreshRate =
2087 createRefreshRate(
2088 mConfig30)});
2089
2090 GlobalSignals signalsConsidered;
2091 EXPECT_EQ(createRefreshRate(mConfig30),
2092 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2093 {.touch = true, .idle = true},
2094 &signalsConsidered));
2095
2096 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2097}
2098
2099TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2100 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2101
2102 auto refreshRateConfigs =
2103 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2104 /*currentConfigId=*/HWC_CONFIG_ID_60);
2105 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2106
2107 GlobalSignals globalSignals{.touch = true, .idle = true};
2108 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2109 LayerRequirement{.weight = 0.5f}};
2110 const auto lastResult =
2111 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2112 /* outSignalsConsidered */ nullptr);
2113
2114 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2115
2116 ASSERT_TRUE(lastInvocation.has_value());
2117 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2118 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2119 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2120
2121 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2122 // to getBestRefreshRate()
2123 GlobalSignals detaultSignals;
2124 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2125}
2126
Ady Abraham5e4e9832021-06-14 13:40:56 -07002127TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002128 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002129 auto refreshRateConfigs =
2130 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002131 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002132
2133 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2134 LayerRequirement{.weight = 0.5f}};
2135 auto& explicitExactLayer = layers[0];
2136 auto& explicitExactOrMultipleLayer = layers[1];
2137
2138 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2139 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2140 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2141
2142 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2143 explicitExactLayer.name = "ExplicitExact";
2144 explicitExactLayer.desiredRefreshRate = Fps(30);
2145
2146 EXPECT_EQ(mExpected60Config,
2147 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2148 EXPECT_EQ(mExpected120Config,
2149 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2150
2151 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2152
2153 EXPECT_EQ(mExpected60Config,
2154 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2155 EXPECT_EQ(mExpected60Config,
2156 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2157}
2158
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002159TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2160 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2161 auto refreshRateConfigs =
2162 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2163 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2164
2165 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2166 LayerRequirement{.weight = 0.5f}};
2167 auto& explicitDefaultLayer = layers[0];
2168 auto& explicitExactOrMultipleLayer = layers[1];
2169
2170 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2171 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2172 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2173
2174 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2175 explicitDefaultLayer.name = "ExplicitDefault";
2176 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2177
2178 EXPECT_EQ(mExpected60Config,
2179 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2180}
2181
Ana Krulecb9afd792020-06-11 13:16:15 -07002182TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2183 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2184 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2185 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2186}
2187
2188TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2189 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2190
2191 auto refreshRateConfigs =
2192 std::make_unique<RefreshRateConfigs>(m60_90Device,
2193 /*currentConfigId=*/HWC_CONFIG_ID_90);
2194 // SetPolicy(60, 90), current 90Hz => TurnOn.
2195 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2196
2197 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002198 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2199 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002200 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2201
Ady Abrahama91605e2021-06-18 11:41:47 -07002202 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002203 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2204 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002205 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002206
2207 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002208 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2209 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002210 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2211}
2212
TreeHugger Robot758ab612021-06-22 19:17:29 +00002213TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2214 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2215
2216 // Tests with 120Hz
2217 auto refreshRateConfigs =
2218 std::make_unique<RefreshRateConfigs>(m60_120Device,
2219 /*currentConfigId=*/HWC_CONFIG_ID_120);
2220 // SetPolicy(0, 60), current 60Hz => TurnOn.
2221 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2222 0);
2223 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2224
2225 // SetPolicy(60, 60), current 60Hz => TurnOff.
2226 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2227 0);
2228 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2229
2230 // SetPolicy(60, 120), current 60Hz => TurnOn.
2231 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2232 0);
2233 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2234
2235 // SetPolicy(120, 120), current 120Hz => TurnOff.
2236 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2237 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2238 0);
2239 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2240}
2241
Ady Abraham5cc2e262021-03-25 13:09:17 -07002242TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002243 auto refreshRateConfigs =
2244 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2245 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002246
2247 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002248 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2249 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002250
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002251 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002252 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2253 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002254
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002255 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002256 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2257 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002258
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002259 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002260 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2261 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002262
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002263 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002264 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2265 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002266
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002267 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002268 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2269 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002270
2271 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2272 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2273 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2274 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
2275}
2276
2277TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2278 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2279 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2280
2281 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2282 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2283
2284 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2285 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2286
2287 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2288 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2289
2290 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2291 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2292
2293 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2294 for (auto refreshRate : refreshRates) {
2295 EXPECT_FALSE(
2296 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2297 }
2298
2299 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2300 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2301 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002302}
2303
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002304TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002305 auto refreshRateConfigs =
2306 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2307 HWC_CONFIG_ID_120);
2308
2309 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002310 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2311 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002312}
2313
2314TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002315 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002316 auto refreshRateConfigs =
2317 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002318 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002319
2320 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2321 layers[0].name = "Test layer";
2322 layers[0].ownerUid = 1234;
2323 layers[0].desiredRefreshRate = Fps(60.0f);
2324 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002325 auto frameRateOverrides =
2326 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002327 ASSERT_EQ(1, frameRateOverrides.size());
2328 ASSERT_EQ(1, frameRateOverrides.count(1234));
2329 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2330
2331 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002332 frameRateOverrides =
2333 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002334 ASSERT_EQ(1, frameRateOverrides.size());
2335 ASSERT_EQ(1, frameRateOverrides.count(1234));
2336 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2337
2338 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002339 frameRateOverrides =
2340 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002341 ASSERT_TRUE(frameRateOverrides.empty());
2342
2343 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002344 frameRateOverrides =
2345 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002346 ASSERT_TRUE(frameRateOverrides.empty());
2347
2348 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002349 frameRateOverrides =
2350 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002351 ASSERT_TRUE(frameRateOverrides.empty());
2352
2353 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002354 frameRateOverrides =
2355 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002356 ASSERT_TRUE(frameRateOverrides.empty());
2357}
2358
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002359TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002360 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002361 auto refreshRateConfigs =
2362 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002363 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002364
2365 auto layers = std::vector<LayerRequirement>{
2366 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2367 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2368 };
2369
2370 layers[0].name = "Test layer 1234";
2371 layers[0].desiredRefreshRate = Fps(60.0f);
2372 layers[0].vote = LayerVoteType::ExplicitDefault;
2373
2374 layers[1].name = "Test layer 5678";
2375 layers[1].desiredRefreshRate = Fps(30.0f);
2376 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002377 auto frameRateOverrides =
2378 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002379
2380 ASSERT_EQ(2, frameRateOverrides.size());
2381 ASSERT_EQ(1, frameRateOverrides.count(1234));
2382 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2383 ASSERT_EQ(1, frameRateOverrides.count(5678));
2384 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2385
2386 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002387 frameRateOverrides =
2388 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002389 ASSERT_EQ(1, frameRateOverrides.size());
2390 ASSERT_EQ(1, frameRateOverrides.count(1234));
2391 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2392
2393 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002394 frameRateOverrides =
2395 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2396 ASSERT_TRUE(frameRateOverrides.empty());
2397}
2398
2399TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002400 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002401 auto refreshRateConfigs =
2402 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002403 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002404
2405 auto layers = std::vector<LayerRequirement>{
2406 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2407 };
2408
2409 layers[0].name = "Test layer";
2410 layers[0].desiredRefreshRate = Fps(60.0f);
2411 layers[0].vote = LayerVoteType::ExplicitDefault;
2412
2413 auto frameRateOverrides =
2414 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2415 ASSERT_EQ(1, frameRateOverrides.size());
2416 ASSERT_EQ(1, frameRateOverrides.count(1234));
2417 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2418
2419 frameRateOverrides =
2420 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2421 ASSERT_EQ(1, frameRateOverrides.size());
2422 ASSERT_EQ(1, frameRateOverrides.count(1234));
2423 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2424
2425 layers[0].vote = LayerVoteType::ExplicitExact;
2426 frameRateOverrides =
2427 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2428 ASSERT_EQ(1, frameRateOverrides.size());
2429 ASSERT_EQ(1, frameRateOverrides.count(1234));
2430 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2431
2432 frameRateOverrides =
2433 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2434 ASSERT_EQ(1, frameRateOverrides.size());
2435 ASSERT_EQ(1, frameRateOverrides.count(1234));
2436 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2437
2438 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2439 frameRateOverrides =
2440 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2441 ASSERT_EQ(1, frameRateOverrides.size());
2442 ASSERT_EQ(1, frameRateOverrides.count(1234));
2443 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2444
2445 frameRateOverrides =
2446 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002447 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002448}
2449
Alec Mouri0a1cc962019-03-14 12:33:02 -07002450} // namespace
2451} // namespace scheduler
2452} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002453
2454// TODO(b/129481165): remove the #pragma below and fix conversion issues
2455#pragma clang diagnostic pop // ignored "-Wextra"