blob: a6bfde791bbca3b9ba23f92ead166693c1b8138f [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 Shalamanove8a663d2020-11-24 17:48:00 +0100352 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
353 0);
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}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800356}
357
Steven Thomasbb374322020-04-28 22:47:16 -0700358TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700360 std::make_unique<RefreshRateConfigs>(m60_90Device,
361 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
363 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
364 auto& lr = layers[0];
365
366 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800367 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700368 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700369 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
371 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800372 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700373 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700374 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800375
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100376 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800378 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700379 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700380 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100382 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800383 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700384 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700385 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100387 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800388 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700389 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700390 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100392 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800393 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700394 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700395 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800396
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100397 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800398 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700399 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700400 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800402 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100403 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
404 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
406 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700407 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700408 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800409
410 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700411 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700412 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100414 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700416 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700417 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800418
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100419 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700420 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700421 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800422
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100423 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700424 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700425 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100427 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700428 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700429 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100431 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700432 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700433 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100435 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
436 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
437 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438
439 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700440 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
443 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700444 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100447 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800451
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100452 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700453 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100456 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700457 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100460 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700461 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700462 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100464 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700465 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100468 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
469 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
470 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800471 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700472 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700473 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
475 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700476 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700477 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100479 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700481 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700482 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800483
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100484 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700485 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700486 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100488 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700489 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700490 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800491
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100492 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700493 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700494 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800495
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100496 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700497 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700498 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800499}
500
rnlee3bd610662021-06-23 16:27:57 -0700501TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
502 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
503 auto refreshRateConfigs =
504 std::make_unique<RefreshRateConfigs>(m60_90Device,
505 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
506
507 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
508 auto& lr = layers[0];
509
510 lr.vote = LayerVoteType::Min;
511 lr.name = "Min";
512 EXPECT_EQ(mExpected60Config,
513 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
514
515 lr.vote = LayerVoteType::Max;
516 lr.name = "Max";
517 EXPECT_EQ(mExpected90Config,
518 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
519
520 lr.desiredRefreshRate = Fps(90.0f);
521 lr.vote = LayerVoteType::Heuristic;
522 lr.name = "90Hz Heuristic";
523 EXPECT_EQ(mExpected90Config,
524 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
525
526 lr.desiredRefreshRate = Fps(60.0f);
527 lr.name = "60Hz Heuristic";
528 EXPECT_EQ(mExpected60Config,
529 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
530
531 lr.desiredRefreshRate = Fps(45.0f);
532 lr.name = "45Hz Heuristic";
533 EXPECT_EQ(mExpected90Config,
534 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
535
536 lr.desiredRefreshRate = Fps(30.0f);
537 lr.name = "30Hz Heuristic";
538 EXPECT_EQ(mExpected60Config,
539 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
540
541 lr.desiredRefreshRate = Fps(24.0f);
542 lr.name = "24Hz Heuristic";
543 EXPECT_EQ(mExpected60Config,
544 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
545}
546
Steven Thomasbb374322020-04-28 22:47:16 -0700547TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700549 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
550 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800551
552 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
553 auto& lr = layers[0];
554
555 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700556 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700557 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800558
559 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700560 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700561 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800562
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100563 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800564 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700565 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700566 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800567
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100568 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700569 EXPECT_EQ(mExpected60Config,
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700573 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700574 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800575
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100576 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700577 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700578 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800579
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100580 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700581 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700582 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800583}
584
Steven Thomasbb374322020-04-28 22:47:16 -0700585TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800586 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700587 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
588 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800589
590 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
591 LayerRequirement{.weight = 1.0f}};
592 auto& lr1 = layers[0];
593 auto& lr2 = layers[1];
594
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100595 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800596 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100597 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800598 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700599 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700600 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800601
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100602 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800603 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100604 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800605 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700606 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700607 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800608
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100609 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800610 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100611 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800612 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700613 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700614 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800615}
616
Steven Thomasbb374322020-04-28 22:47:16 -0700617TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800618 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700619 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
620 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800621
622 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
623 LayerRequirement{.weight = 1.0f}};
624 auto& lr1 = layers[0];
625 auto& lr2 = layers[1];
626
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100627 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800628 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100630 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800631 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800632 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700633 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700634 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800635
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100636 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100639 lr2.desiredRefreshRate = Fps(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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800650 lr2.name = "60Hz ExplicitDefault";
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(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800658 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800659 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700660 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700661 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800662
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100663 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800664 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
665 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100666 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800667 lr2.vote = LayerVoteType::ExplicitDefault;
668 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700669 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700670 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800671
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100672 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800673 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800674 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100675 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800676 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800677 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700678 EXPECT_EQ(mExpected90Config,
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::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800683 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100684 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800685 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800686 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700687 EXPECT_EQ(mExpected72Config,
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::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800692 lr1.name = "24Hz ExplicitExactOrMultiple";
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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100702 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800703 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800704 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700705 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700706 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800707}
708
rnlee3bd610662021-06-23 16:27:57 -0700709TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
710 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
711 auto refreshRateConfigs =
712 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
713 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
714
715 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
716 LayerRequirement{.weight = 1.0f}};
717 auto& lr1 = layers[0];
718 auto& lr2 = layers[1];
719
720 lr1.desiredRefreshRate = Fps(24.0f);
721 lr1.vote = LayerVoteType::ExplicitDefault;
722 lr1.name = "24Hz ExplicitDefault";
723 lr2.desiredRefreshRate = Fps(60.0f);
724 lr2.vote = LayerVoteType::Heuristic;
725 lr2.name = "60Hz Heuristic";
726 EXPECT_EQ(mExpected120Config,
727 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
728
729 lr1.desiredRefreshRate = Fps(24.0f);
730 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
731 lr1.name = "24Hz ExplicitExactOrMultiple";
732 lr2.desiredRefreshRate = Fps(60.0f);
733 lr2.vote = LayerVoteType::Heuristic;
734 lr2.name = "60Hz Heuristic";
735 EXPECT_EQ(mExpected60Config,
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::ExplicitDefault;
743 lr2.name = "60Hz ExplicitDefault";
744 EXPECT_EQ(mExpected72Config,
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(90.0f);
751 lr2.vote = LayerVoteType::Heuristic;
752 lr2.name = "90Hz Heuristic";
753 EXPECT_EQ(mExpected90Config,
754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
755
756 lr1.desiredRefreshRate = Fps(24.0f);
757 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
758 lr1.name = "24Hz ExplicitExactOrMultiple";
759 lr2.desiredRefreshRate = Fps(90.0f);
760 lr2.vote = LayerVoteType::ExplicitDefault;
761 lr2.name = "90Hz Heuristic";
762 EXPECT_EQ(mExpected72Config,
763 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
764
765 lr1.desiredRefreshRate = Fps(24.0f);
766 lr1.vote = LayerVoteType::ExplicitDefault;
767 lr1.name = "24Hz ExplicitDefault";
768 lr2.desiredRefreshRate = Fps(90.0f);
769 lr2.vote = LayerVoteType::Heuristic;
770 lr2.name = "90Hz Heuristic";
771 EXPECT_EQ(mExpected90Config,
772 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
773
774 lr1.desiredRefreshRate = Fps(24.0f);
775 lr1.vote = LayerVoteType::Heuristic;
776 lr1.name = "24Hz Heuristic";
777 lr2.desiredRefreshRate = Fps(90.0f);
778 lr2.vote = LayerVoteType::ExplicitDefault;
779 lr2.name = "90Hz ExplicitDefault";
780 EXPECT_EQ(mExpected72Config,
781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
782
783 lr1.desiredRefreshRate = Fps(24.0f);
784 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
785 lr1.name = "24Hz ExplicitExactOrMultiple";
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::ExplicitDefault;
794 lr1.name = "24Hz ExplicitDefault";
795 lr2.desiredRefreshRate = Fps(90.0f);
796 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
797 lr2.name = "90Hz ExplicitExactOrMultiple";
798 EXPECT_EQ(mExpected90Config,
799 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
800}
801
Steven Thomasbb374322020-04-28 22:47:16 -0700802TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800803 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700804 std::make_unique<RefreshRateConfigs>(m30_60Device,
805 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806
807 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
808 auto& lr = layers[0];
809
810 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700811 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700812 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813
814 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700815 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700816 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800817
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100818 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700820 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700821 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800822
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100823 lr.desiredRefreshRate = Fps(60.0f);
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700828 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700829 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800830
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100831 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700832 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700833 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100835 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700836 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700837 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800838}
839
Steven Thomasbb374322020-04-28 22:47:16 -0700840TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700842 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
843 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844
845 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
846 auto& lr = layers[0];
847
848 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800849 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700850 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700851 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
853 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800854 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700855 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700856 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800857
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100858 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800859 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800860 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700861 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700862 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800863
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100864 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800865 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700866 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700867 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700868 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700869 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800870
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100871 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700873 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700874 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700876 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800877
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100878 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800879 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700880 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700881 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700882 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700883 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100885 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800886 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700887 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700888 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700889 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700890 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800891
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100892 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800893 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
894 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700895 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700896 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700897 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700898 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800899}
900
Steven Thomasbb374322020-04-28 22:47:16 -0700901TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800902 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700903 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
904 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800905
906 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
907 LayerRequirement{.weight = 1.0f}};
908 auto& lr1 = layers[0];
909 auto& lr2 = layers[1];
910
911 lr1.vote = LayerVoteType::Min;
912 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700913 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700914 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800915
916 lr1.vote = LayerVoteType::Min;
917 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100918 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700919 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700920 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921
922 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800923 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100924 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700925 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700926 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800927
928 lr1.vote = LayerVoteType::Max;
929 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100930 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700931 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700932 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800933
934 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800935 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100936 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700937 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700938 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800939
940 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100941 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800942 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100943 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700944 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700945 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800946
947 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100948 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800949 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100950 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700951 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700952 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800953}
954
Steven Thomasbb374322020-04-28 22:47:16 -0700955TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800956 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700957 std::make_unique<RefreshRateConfigs>(m60_90Device,
958 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800959
960 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
961 auto& lr = layers[0];
962
Ady Abraham71c437d2020-01-31 15:56:57 -0800963 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800964 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100965 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800966 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700967 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700968 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800969 }
970}
971
rnlee3bd610662021-06-23 16:27:57 -0700972TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
973 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
974 auto refreshRateConfigs =
975 std::make_unique<RefreshRateConfigs>(m60_120Device,
976 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
977
978 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
979 auto& lr = layers[0];
980
981 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
982 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
983 lr.desiredRefreshRate = Fps(fps);
984 const auto& refreshRate =
985 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
986 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
987 }
988}
989
Steven Thomasbb374322020-04-28 22:47:16 -0700990TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800991 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700992 std::make_unique<RefreshRateConfigs>(m60_90Device,
993 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800994
995 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
996 LayerRequirement{.weight = 1.0f}};
997 auto& lr1 = layers[0];
998 auto& lr2 = layers[1];
999
1000 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001001 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001002 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001003 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001004 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001005 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006
1007 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001008 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001009 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001010 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001011 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001012 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001013
1014 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001015 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001016 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001017 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001018 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001019 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001020}
1021
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001022TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001023 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1024 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1025 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1026 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1027 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001028}
1029
Steven Thomasbb374322020-04-28 22:47:16 -07001030TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001031 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001032 std::make_unique<RefreshRateConfigs>(m60_90Device,
1033 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001034
1035 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1036 auto& lr = layers[0];
1037
Ady Abraham71c437d2020-01-31 15:56:57 -08001038 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001039 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001040 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001041 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001042 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001043 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001044 }
1045}
1046
Steven Thomasbb374322020-04-28 22:47:16 -07001047TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001048 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001049 std::make_unique<RefreshRateConfigs>(m60_90Device,
1050 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001051
1052 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1053 LayerRequirement{.weight = 1.0f}};
1054 auto& lr1 = layers[0];
1055 auto& lr2 = layers[1];
1056
1057 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001058 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001059 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001060 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001061 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001062 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001063 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001064 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001065
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";
1069 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001070 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001071 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001072 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001073 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -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";
Ady Abraham34702102020-02-10 14:12:05 -08001078 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001079 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001080 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001081 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001082
1083 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001084 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001085 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001086 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001087 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001088 lr2.name = "90Hz Heuristic";
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::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001096 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001097 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001098 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001099}
1100
1101TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001102 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001103 std::make_unique<RefreshRateConfigs>(m60_90Device,
1104 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001105
1106 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1107 LayerRequirement{.weight = 1.0f}};
1108 auto& lr1 = layers[0];
1109 auto& lr2 = layers[1];
1110
1111 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001112 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001113 lr1.name = "60Hz ExplicitExactOrMultiple";
1114 lr2.vote = LayerVoteType::NoVote;
1115 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001116 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001117 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001118
1119 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001120 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001121 lr1.name = "60Hz ExplicitExactOrMultiple";
1122 lr2.vote = LayerVoteType::NoVote;
1123 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001124 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001125 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001126
1127 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001128 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001129 lr1.name = "60Hz ExplicitExactOrMultiple";
1130 lr2.vote = LayerVoteType::Max;
1131 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001132 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001133 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001134
1135 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001136 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001137 lr1.name = "60Hz ExplicitExactOrMultiple";
1138 lr2.vote = LayerVoteType::Max;
1139 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001140 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001141 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001142
1143 // The other layer starts to provide buffers
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::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001148 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001149 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001150 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001151 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001152}
1153
1154TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001155 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001156 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001157 std::make_unique<RefreshRateConfigs>(m60_90Device,
1158 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001159
Ady Abrahamdfd62162020-06-10 16:11:56 -07001160 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1161 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001162
Ady Abrahamdfd62162020-06-10 16:11:56 -07001163 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1164 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001165
1166 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1167 LayerRequirement{.weight = 1.0f}};
1168 auto& lr1 = layers[0];
1169 auto& lr2 = layers[1];
1170
1171 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001172 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001173 lr1.name = "60Hz ExplicitExactOrMultiple";
1174 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001175 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001176 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001177 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1178 &consideredSignals);
1179 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001180
1181 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001182 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001183 lr1.name = "60Hz ExplicitExactOrMultiple";
1184 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001185 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001186 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001187 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1188 &consideredSignals);
1189 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001190
1191 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001192 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001193 lr1.name = "60Hz ExplicitExactOrMultiple";
1194 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001195 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001196 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001197 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1198 &consideredSignals);
1199 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001200
1201 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001202 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001203 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001204 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001205 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001206 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001207 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1208 &consideredSignals);
1209 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001210}
1211
Steven Thomasbb374322020-04-28 22:47:16 -07001212TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001213 auto refreshRateConfigs =
1214 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1215 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001216
1217 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1218 auto& lr = layers[0];
1219
1220 // Prepare a table with the vote and the expected refresh rate
1221 const std::vector<std::pair<float, float>> testCases = {
1222 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1223
1224 {100, 90}, {90, 90}, {89, 90},
1225
1226 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1227
1228 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1229
1230 {55, 90}, {50, 90}, {45, 90},
1231
1232 {42, 120}, {40, 120}, {39, 120},
1233
1234 {37, 72}, {36, 72}, {35, 72},
1235
1236 {30, 60},
1237 };
1238
1239 for (const auto& test : testCases) {
1240 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001241 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001242
1243 std::stringstream ss;
1244 ss << "ExplicitDefault " << test.first << " fps";
1245 lr.name = ss.str();
1246
1247 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001248 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001249 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001250 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1251 << " but it was " << refreshRate.getFps();
1252 }
1253}
1254
1255TEST_F(RefreshRateConfigsTest,
1256 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1257 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1258 auto& lr = layers[0];
1259
1260 // Test that 23.976 will choose 24 if 23.976 is not supported
1261 {
1262 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1263 mConfig30Frac, mConfig60, mConfig60Frac};
1264 auto refreshRateConfigs =
1265 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1266
1267 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1268 lr.desiredRefreshRate = Fps(23.976f);
1269 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1270 EXPECT_EQ(HWC_CONFIG_ID_24,
1271 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1272 .getModeId());
1273 }
1274
1275 // Test that 24 will choose 23.976 if 24 is not supported
1276 {
1277 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1278 mConfig30Frac, mConfig60, mConfig60Frac};
1279 auto refreshRateConfigs =
1280 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1281 lr.desiredRefreshRate = Fps(24.f);
1282 lr.name = "ExplicitExactOrMultiple 24 fps";
1283 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1284 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1285 .getModeId());
1286 }
1287
1288 // Test that 29.97 will prefer 59.94 over 60 and 30
1289 {
1290 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1291 mConfig30, mConfig60, mConfig60Frac};
1292 auto refreshRateConfigs =
1293 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1294 lr.desiredRefreshRate = Fps(29.97f);
1295 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1296 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1297 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1298 .getModeId());
1299 }
1300}
1301
1302TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1303 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1304 auto& lr = layers[0];
1305
1306 // Test that voting for supported refresh rate will select this refresh rate
1307 {
1308 auto refreshRateConfigs =
1309 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1310 /*currentConfigId=*/HWC_CONFIG_ID_60);
1311
1312 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1313 lr.vote = LayerVoteType::ExplicitExact;
1314 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1315 std::stringstream ss;
1316 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1317 lr.name = ss.str();
1318
1319 auto selecteRefreshRate =
1320 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1321
1322 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1323 << "Expecting " << lr.desiredRefreshRate << " but it was "
1324 << selecteRefreshRate.getFps();
1325 }
1326 }
1327
1328 // Test that 23.976 will choose 24 if 23.976 is not supported
1329 {
1330 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1331 mConfig30Frac, mConfig60, mConfig60Frac};
1332 auto refreshRateConfigs =
1333 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1334 lr.vote = LayerVoteType::ExplicitExact;
1335 lr.desiredRefreshRate = Fps(23.976f);
1336 lr.name = "ExplicitExact 23.976 fps";
1337 EXPECT_EQ(HWC_CONFIG_ID_24,
1338 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1339 .getModeId());
1340 }
1341
1342 // Test that 24 will choose 23.976 if 24 is not supported
1343 {
1344 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1345 mConfig30Frac, mConfig60, mConfig60Frac};
1346 auto refreshRateConfigs =
1347 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1348 lr.desiredRefreshRate = Fps(24.f);
1349 lr.name = "ExplicitExact 24 fps";
1350 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1351 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1352 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001353 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001354}
1355
Alec Mouri11232a22020-05-14 18:06:25 -07001356TEST_F(RefreshRateConfigsTest,
1357 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1358 auto refreshRateConfigs =
1359 std::make_unique<RefreshRateConfigs>(m60_90Device,
1360 /*currentConfigId=*/HWC_CONFIG_ID_90);
1361
1362 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001363 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001364 0);
1365
1366 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1367 auto& lr = layers[0];
1368
Ady Abrahamdfd62162020-06-10 16:11:56 -07001369 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001370 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001371 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001372 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001373 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001374 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001375 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1376 &consideredSignals));
1377 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001378}
1379
1380TEST_F(RefreshRateConfigsTest,
1381 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1382 auto refreshRateConfigs =
1383 std::make_unique<RefreshRateConfigs>(m60_90Device,
1384 /*currentConfigId=*/HWC_CONFIG_ID_60);
1385
1386 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001387 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001388 0);
1389
1390 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1391 auto& lr = layers[0];
1392
Alec Mouri11232a22020-05-14 18:06:25 -07001393 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001394 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001395 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001396 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001397 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001398 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001399}
1400
1401TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001402 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001403 auto refreshRateConfigs =
1404 std::make_unique<RefreshRateConfigs>(m60_90Device,
1405 /*currentConfigId=*/HWC_CONFIG_ID_90);
1406
1407 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001408 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001409 0);
1410
Ady Abrahamdfd62162020-06-10 16:11:56 -07001411 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001412 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001413 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1414 &consideredSignals));
1415 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001416
1417 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1418 auto& lr = layers[0];
1419
1420 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001421 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001422 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001423 lr.focused = false;
1424 EXPECT_EQ(mExpected90Config,
1425 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1426
1427 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001428 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001429 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001430
1431 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001432 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001433 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001434 lr.focused = false;
1435 EXPECT_EQ(mExpected90Config,
1436 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1437
1438 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001439 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001441
1442 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001443 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001444 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001445 lr.focused = false;
1446 EXPECT_EQ(mExpected90Config,
1447 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1448
1449 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001450 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001451 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001452
1453 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001454 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001455 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001456 lr.focused = false;
1457 EXPECT_EQ(mExpected90Config,
1458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1459
1460 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001461 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001462 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001463
1464 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001465 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001466 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001467 lr.focused = false;
1468 EXPECT_EQ(mExpected90Config,
1469 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1470
1471 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001472 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001473 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001474}
1475
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001476TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001477 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001478 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1479 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001480
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001481 // The default policy doesn't allow group switching. Verify that no
1482 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001483 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1484 auto& layer = layers[0];
1485 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001486 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001487 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001488 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001489 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001490
Steven Thomasd4071902020-03-24 16:02:53 -07001491 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001492 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001493 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001494}
Steven Thomasd4071902020-03-24 16:02:53 -07001495
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001496TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1497 auto refreshRateConfigs =
1498 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1499 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001500 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001501 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001502 policy.allowGroupSwitching = true;
1503 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001504
1505 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1506 auto& layer = layers[0];
1507 layer.vote = LayerVoteType::ExplicitDefault;
1508 layer.desiredRefreshRate = Fps(90.0f);
1509 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1510 layer.name = "90Hz ExplicitDefault";
1511 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001512 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001513 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001514 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001515}
1516
1517TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1518 auto refreshRateConfigs =
1519 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1520 /*currentConfigId=*/HWC_CONFIG_ID_60);
1521 RefreshRateConfigs::Policy policy;
1522 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1523 policy.allowGroupSwitching = true;
1524 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001525
1526 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001527 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1528 auto& layer = layers[0];
1529 layer.vote = LayerVoteType::ExplicitDefault;
1530 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001531 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001532 layer.name = "90Hz ExplicitDefault";
1533 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001534 ASSERT_EQ(HWC_CONFIG_ID_60,
1535 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001536 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001537}
1538
1539TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1540 auto refreshRateConfigs =
1541 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1542 /*currentConfigId=*/HWC_CONFIG_ID_60);
1543 RefreshRateConfigs::Policy policy;
1544 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1545 policy.allowGroupSwitching = true;
1546 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1547
1548 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001549
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001550 // 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 +01001551 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1552 auto& layer = layers[0];
1553 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001554 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001555 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001556 layer.name = "60Hz ExplicitDefault";
1557 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001558 ASSERT_EQ(HWC_CONFIG_ID_90,
1559 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001560 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001561}
1562
1563TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1564 auto refreshRateConfigs =
1565 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1566 /*currentConfigId=*/HWC_CONFIG_ID_60);
1567 RefreshRateConfigs::Policy policy;
1568 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1569 policy.allowGroupSwitching = true;
1570 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1571
1572 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001573
1574 // Verify that if the current config is in another group and there are no layers with
1575 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001576
1577 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1578 auto& layer = layers[0];
1579 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001580 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001581 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001582 layer.name = "60Hz ExplicitDefault";
1583 layer.focused = true;
1584
Marin Shalamanov46084422020-10-13 12:33:42 +02001585 ASSERT_EQ(HWC_CONFIG_ID_60,
1586 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001587 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001588}
1589
1590TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1591 auto refreshRateConfigs =
1592 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1593 /*currentConfigId=*/HWC_CONFIG_ID_60);
1594 RefreshRateConfigs::Policy policy;
1595 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1596 policy.allowGroupSwitching = true;
1597 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1598
1599 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001600
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001601 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001602 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001603 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1604 layers[0].vote = LayerVoteType::ExplicitDefault;
1605 layers[0].desiredRefreshRate = Fps(60.0f);
1606 layers[0].seamlessness = Seamlessness::OnlySeamless;
1607 layers[0].name = "60Hz ExplicitDefault";
1608 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001609
1610 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001611 layers[1].vote = LayerVoteType::ExplicitDefault;
1612 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1613 layers[1].desiredRefreshRate = Fps(90.0f);
1614 layers[1].name = "90Hz ExplicitDefault";
1615 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001616
1617 ASSERT_EQ(HWC_CONFIG_ID_90,
1618 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001619 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001620}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001621
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001622TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001623 auto refreshRateConfigs =
1624 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1625 /*currentConfigId=*/HWC_CONFIG_ID_60);
1626 RefreshRateConfigs::Policy policy;
1627 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1628 policy.allowGroupSwitching = true;
1629 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1630
1631 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001632
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001633 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1634 // seamlessness=Default can't change the mode group back to the group of the default
1635 // mode.
1636 // For example, this may happen when a video playback requests and gets a seamed switch,
1637 // but another layer (with default seamlessness) starts animating. The animating layer
1638 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001639 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001640 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001641 layers[0].desiredRefreshRate = Fps(60.0f);
1642 layers[0].focused = true;
1643 layers[0].vote = LayerVoteType::ExplicitDefault;
1644 layers[0].name = "60Hz ExplicitDefault";
1645
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001646 layers.push_back(LayerRequirement{.weight = 0.1f});
1647 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1648 layers[1].desiredRefreshRate = Fps(90.0f);
1649 layers[1].focused = true;
1650 layers[1].vote = LayerVoteType::ExplicitDefault;
1651 layers[1].name = "90Hz ExplicitDefault";
1652
Marin Shalamanov46084422020-10-13 12:33:42 +02001653 ASSERT_EQ(HWC_CONFIG_ID_90,
1654 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001655 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001656}
1657
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001658TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1659 auto refreshRateConfigs =
1660 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1661 /*currentConfigId=*/HWC_CONFIG_ID_60);
1662 RefreshRateConfigs::Policy policy;
1663 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1664 policy.allowGroupSwitching = true;
1665 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1666
1667 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1668
1669 // Layer with seamlessness=Default can change the mode group if there's a not
1670 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1671 // when in split screen mode the user switches between the two visible applications.
1672 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1673 layers[0].seamlessness = Seamlessness::Default;
1674 layers[0].desiredRefreshRate = Fps(60.0f);
1675 layers[0].focused = true;
1676 layers[0].vote = LayerVoteType::ExplicitDefault;
1677 layers[0].name = "60Hz ExplicitDefault";
1678
1679 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001680 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1681 layers[1].desiredRefreshRate = Fps(90.0f);
1682 layers[1].focused = false;
1683 layers[1].vote = LayerVoteType::ExplicitDefault;
1684 layers[1].name = "90Hz ExplicitDefault";
1685
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001686 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001687 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1688 .getModeId());
1689}
1690
1691TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1692 auto refreshRateConfigs =
1693 std::make_unique<RefreshRateConfigs>(m30_60Device,
1694 /*currentConfigId=*/HWC_CONFIG_ID_60);
1695
1696 // Allow group switching.
1697 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001698 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001699 policy.allowGroupSwitching = true;
1700 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1701
1702 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1703 auto& layer = layers[0];
1704 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001705 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001706 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001707 layer.name = "60Hz ExplicitExactOrMultiple";
1708 layer.focused = true;
1709
1710 ASSERT_EQ(HWC_CONFIG_ID_60,
1711 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001712 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001713
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001714 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001715 ASSERT_EQ(HWC_CONFIG_ID_120,
1716 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001717 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001718}
1719
1720TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1721 auto refreshRateConfigs =
1722 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1723 /*currentConfigId=*/HWC_CONFIG_ID_60);
1724
1725 // Allow group switching.
1726 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001727 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001728 policy.allowGroupSwitching = true;
1729 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1730
1731 auto layers = std::vector<
1732 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1733 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001734 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001735 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001736 .weight = 0.5f,
1737 .focused = false},
1738 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1739 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001740 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001741 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001742 .weight = 1.0f,
1743 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001744
1745 ASSERT_EQ(HWC_CONFIG_ID_50,
1746 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001747 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001748
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001749 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001750 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001751 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001752
1753 ASSERT_EQ(HWC_CONFIG_ID_25,
1754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001755 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001756}
1757
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001758TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1759 auto refreshRateConfigs =
1760 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1761 /*currentConfigId=*/HWC_CONFIG_ID_90);
1762
1763 // Allow group switching.
1764 RefreshRateConfigs::Policy policy;
1765 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1766 policy.allowGroupSwitching = true;
1767 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1768
1769 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1770 .vote = LayerVoteType::Min,
1771 .weight = 1.f,
1772 .focused = true}};
1773
1774 ASSERT_EQ(HWC_CONFIG_ID_90,
1775 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1776 .getModeId());
1777}
1778
Steven Thomasf734df42020-04-13 21:09:28 -07001779TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1780 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001781 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001782 /*currentConfigId=*/HWC_CONFIG_ID_60);
1783
1784 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1785 layers[0].name = "Test layer";
1786
Steven Thomasbb374322020-04-28 22:47:16 -07001787 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001788 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001789 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001790 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001791 layers[0].vote = voteType;
1792 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001793 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001794 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001795 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001796 };
1797
1798 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001799 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001800 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001801 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001802 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001803 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001804 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1805 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1806 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1807 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1808 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1809 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001810
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001811 // Layers not focused are not allowed to override primary config
1812 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001813 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001814 /*focused=*/false));
1815 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001816 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001817 /*focused=*/false));
1818
Steven Thomasf734df42020-04-13 21:09:28 -07001819 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001820 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001821 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1822 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001823 EXPECT_EQ(HWC_CONFIG_ID_90,
1824 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001825 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001826 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001827
1828 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001829 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001830 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001831 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1832 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1833 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1834 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1835 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1836 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001837}
1838
Steven Thomasbb374322020-04-28 22:47:16 -07001839TEST_F(RefreshRateConfigsTest, idle) {
1840 auto refreshRateConfigs =
1841 std::make_unique<RefreshRateConfigs>(m60_90Device,
1842 /*currentConfigId=*/HWC_CONFIG_ID_60);
1843
1844 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1845 layers[0].name = "Test layer";
1846
Marin Shalamanov23c44202020-12-22 19:09:20 +01001847 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001848 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001849 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001850 RefreshRateConfigs::GlobalSignals consideredSignals;
1851 const auto configId =
1852 refreshRateConfigs
1853 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1854 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001855 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001856 // Refresh rate will be chosen by either touch state or idle state
1857 EXPECT_EQ(!touchActive, consideredSignals.idle);
1858 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001859 };
1860
1861 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001862 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001863 0);
1864
1865 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001866 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1867 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1868 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1869 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1870 EXPECT_EQ(HWC_CONFIG_ID_90,
1871 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1872 EXPECT_EQ(HWC_CONFIG_ID_90,
1873 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001874
1875 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001876 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001877 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001878 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001879
1880 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001881 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001882 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1883 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1884 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1885 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1886 EXPECT_EQ(HWC_CONFIG_ID_60,
1887 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1888 EXPECT_EQ(HWC_CONFIG_ID_60,
1889 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001890
1891 // Idle should be applied rather than the current config when there are no layers.
1892 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001893 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001894 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001895}
1896
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001897TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1898 auto refreshRateConfigs =
1899 std::make_unique<RefreshRateConfigs>(m60_90Device,
1900 /*currentConfigId=*/HWC_CONFIG_ID_60);
1901
1902 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001903 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1904 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001905 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001906 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001907 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001908 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001909 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001910 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001911 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001912 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001913 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001914 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001915 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001916 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001917 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001918 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001919 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1920 }
1921}
1922
1923TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001924 auto refreshRateConfigs =
1925 std::make_unique<RefreshRateConfigs>(m60_90Device,
1926 /*currentConfigId=*/HWC_CONFIG_ID_60);
1927
1928 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001929 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001930 const RefreshRate& expected;
1931 };
1932
1933 /* clang-format off */
1934 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001935 {Fps(24.0f), mExpected60Config},
1936 {Fps(30.0f), mExpected60Config},
1937 {Fps(45.0f), mExpected90Config},
1938 {Fps(60.0f), mExpected60Config},
1939 {Fps(72.0f), mExpected90Config},
1940 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001941 };
1942 /* clang-format on */
1943
1944 // Make sure the test tests all the known frame rate
1945 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001946 const auto equal =
1947 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1948 knownFrameRatesExpectations.begin(),
1949 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001950 EXPECT_TRUE(equal);
1951
1952 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1953 auto& layer = layers[0];
1954 layer.vote = LayerVoteType::Heuristic;
1955 for (const auto& expectedRate : knownFrameRatesExpectations) {
1956 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001957 const auto& refreshRate =
1958 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001959 EXPECT_EQ(expectedRate.expected, refreshRate);
1960 }
1961}
1962
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001963TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1964 auto refreshRateConfigs =
1965 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1966 /*currentConfigId=*/HWC_CONFIG_ID_60);
1967
1968 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1969 LayerRequirement{.weight = 0.5f}};
1970 auto& explicitExactLayer = layers[0];
1971 auto& explicitExactOrMultipleLayer = layers[1];
1972
1973 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1974 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1975 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1976
1977 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1978 explicitExactLayer.name = "ExplicitExact";
1979 explicitExactLayer.desiredRefreshRate = Fps(30);
1980
1981 EXPECT_EQ(mExpected30Config,
1982 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1983 EXPECT_EQ(mExpected30Config,
1984 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1985
1986 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1987 explicitExactLayer.desiredRefreshRate = Fps(60);
1988 EXPECT_EQ(mExpected60Config,
1989 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1990
1991 explicitExactLayer.desiredRefreshRate = Fps(72);
1992 EXPECT_EQ(mExpected72Config,
1993 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1994
1995 explicitExactLayer.desiredRefreshRate = Fps(90);
1996 EXPECT_EQ(mExpected90Config,
1997 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1998
1999 explicitExactLayer.desiredRefreshRate = Fps(120);
2000 EXPECT_EQ(mExpected120Config,
2001 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2002}
2003
2004TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002005 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002006 auto refreshRateConfigs =
2007 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002008 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002009
2010 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2011 LayerRequirement{.weight = 0.5f}};
2012 auto& explicitExactLayer = layers[0];
2013 auto& explicitExactOrMultipleLayer = layers[1];
2014
2015 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2016 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2017 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2018
2019 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2020 explicitExactLayer.name = "ExplicitExact";
2021 explicitExactLayer.desiredRefreshRate = Fps(30);
2022
2023 EXPECT_EQ(mExpected60Config,
2024 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2025 EXPECT_EQ(mExpected120Config,
2026 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2027
2028 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2029 explicitExactLayer.desiredRefreshRate = Fps(60);
2030 EXPECT_EQ(mExpected120Config,
2031 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2032
2033 explicitExactLayer.desiredRefreshRate = Fps(72);
2034 EXPECT_EQ(mExpected72Config,
2035 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2036
2037 explicitExactLayer.desiredRefreshRate = Fps(90);
2038 EXPECT_EQ(mExpected90Config,
2039 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2040
2041 explicitExactLayer.desiredRefreshRate = Fps(120);
2042 EXPECT_EQ(mExpected120Config,
2043 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2044}
2045
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002046TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2047 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2048
2049 auto refreshRateConfigs =
2050 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2051 /*currentConfigId=*/HWC_CONFIG_ID_60);
2052
2053 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2054 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2055 LayerRequirement>(),
2056 .globalSignals = {.touch = true,
2057 .idle = true},
2058 .outSignalsConsidered =
2059 {.touch = true,
2060 .idle = false},
2061 .resultingBestRefreshRate =
2062 createRefreshRate(
2063 mConfig90)});
2064
2065 EXPECT_EQ(createRefreshRate(mConfig90),
2066 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2067 {.touch = true, .idle = true}));
2068
2069 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2070 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2071 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2072 LayerRequirement>(),
2073 .globalSignals = {.touch = true,
2074 .idle = true},
2075 .outSignalsConsidered =
2076 cachedSignalsConsidered,
2077 .resultingBestRefreshRate =
2078 createRefreshRate(
2079 mConfig30)});
2080
2081 GlobalSignals signalsConsidered;
2082 EXPECT_EQ(createRefreshRate(mConfig30),
2083 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2084 {.touch = true, .idle = true},
2085 &signalsConsidered));
2086
2087 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2088}
2089
2090TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2091 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2092
2093 auto refreshRateConfigs =
2094 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2095 /*currentConfigId=*/HWC_CONFIG_ID_60);
2096 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2097
2098 GlobalSignals globalSignals{.touch = true, .idle = true};
2099 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2100 LayerRequirement{.weight = 0.5f}};
2101 const auto lastResult =
2102 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2103 /* outSignalsConsidered */ nullptr);
2104
2105 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2106
2107 ASSERT_TRUE(lastInvocation.has_value());
2108 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2109 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2110 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2111
2112 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2113 // to getBestRefreshRate()
2114 GlobalSignals detaultSignals;
2115 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2116}
2117
Ady Abraham5e4e9832021-06-14 13:40:56 -07002118TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002119 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002120 auto refreshRateConfigs =
2121 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002122 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002123
2124 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2125 LayerRequirement{.weight = 0.5f}};
2126 auto& explicitExactLayer = layers[0];
2127 auto& explicitExactOrMultipleLayer = layers[1];
2128
2129 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2130 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2131 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2132
2133 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2134 explicitExactLayer.name = "ExplicitExact";
2135 explicitExactLayer.desiredRefreshRate = Fps(30);
2136
2137 EXPECT_EQ(mExpected60Config,
2138 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2139 EXPECT_EQ(mExpected120Config,
2140 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2141
2142 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2143
2144 EXPECT_EQ(mExpected60Config,
2145 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2146 EXPECT_EQ(mExpected60Config,
2147 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2148}
2149
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002150TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2151 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2152 auto refreshRateConfigs =
2153 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2154 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2155
2156 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2157 LayerRequirement{.weight = 0.5f}};
2158 auto& explicitDefaultLayer = layers[0];
2159 auto& explicitExactOrMultipleLayer = layers[1];
2160
2161 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2162 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2163 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2164
2165 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2166 explicitDefaultLayer.name = "ExplicitDefault";
2167 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2168
2169 EXPECT_EQ(mExpected60Config,
2170 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2171}
2172
Ana Krulecb9afd792020-06-11 13:16:15 -07002173TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2174 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2175 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2176 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2177}
2178
2179TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2180 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2181
2182 auto refreshRateConfigs =
2183 std::make_unique<RefreshRateConfigs>(m60_90Device,
2184 /*currentConfigId=*/HWC_CONFIG_ID_90);
2185 // SetPolicy(60, 90), current 90Hz => TurnOn.
2186 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2187
2188 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002189 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2190 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002191 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2192
Ady Abrahama91605e2021-06-18 11:41:47 -07002193 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002194 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2195 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002196 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002197
2198 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002199 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2200 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002201 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2202}
2203
TreeHugger Robot758ab612021-06-22 19:17:29 +00002204TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2205 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2206
2207 // Tests with 120Hz
2208 auto refreshRateConfigs =
2209 std::make_unique<RefreshRateConfigs>(m60_120Device,
2210 /*currentConfigId=*/HWC_CONFIG_ID_120);
2211 // SetPolicy(0, 60), current 60Hz => TurnOn.
2212 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2213 0);
2214 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2215
2216 // SetPolicy(60, 60), current 60Hz => TurnOff.
2217 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2218 0);
2219 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2220
2221 // SetPolicy(60, 120), current 60Hz => TurnOn.
2222 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2223 0);
2224 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2225
2226 // SetPolicy(120, 120), current 120Hz => TurnOff.
2227 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2228 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2229 0);
2230 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2231}
2232
Ady Abraham5cc2e262021-03-25 13:09:17 -07002233TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002234 auto refreshRateConfigs =
2235 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2236 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002237
2238 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002239 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2240 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002241
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002242 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002243 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2244 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002245
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002246 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002247 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2248 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002249
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002250 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002251 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2252 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002253
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002254 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002255 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2256 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002257
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002258 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002259 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2260 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002261
2262 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2263 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2264 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2265 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
2266}
2267
2268TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2269 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2270 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2271
2272 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2273 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2274
2275 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2276 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2277
2278 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2279 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2280
2281 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2282 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2283
2284 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2285 for (auto refreshRate : refreshRates) {
2286 EXPECT_FALSE(
2287 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2288 }
2289
2290 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2291 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2292 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002293}
2294
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002295TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002296 auto refreshRateConfigs =
2297 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2298 HWC_CONFIG_ID_120);
2299
2300 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002301 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2302 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002303}
2304
2305TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002306 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002307 auto refreshRateConfigs =
2308 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002309 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002310
2311 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2312 layers[0].name = "Test layer";
2313 layers[0].ownerUid = 1234;
2314 layers[0].desiredRefreshRate = Fps(60.0f);
2315 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002316 auto frameRateOverrides =
2317 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002318 ASSERT_EQ(1, frameRateOverrides.size());
2319 ASSERT_EQ(1, frameRateOverrides.count(1234));
2320 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2321
2322 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002323 frameRateOverrides =
2324 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002325 ASSERT_EQ(1, frameRateOverrides.size());
2326 ASSERT_EQ(1, frameRateOverrides.count(1234));
2327 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2328
2329 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002330 frameRateOverrides =
2331 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002332 ASSERT_TRUE(frameRateOverrides.empty());
2333
2334 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002335 frameRateOverrides =
2336 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002337 ASSERT_TRUE(frameRateOverrides.empty());
2338
2339 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002340 frameRateOverrides =
2341 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002342 ASSERT_TRUE(frameRateOverrides.empty());
2343
2344 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002345 frameRateOverrides =
2346 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002347 ASSERT_TRUE(frameRateOverrides.empty());
2348}
2349
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002350TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002351 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002352 auto refreshRateConfigs =
2353 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002354 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002355
2356 auto layers = std::vector<LayerRequirement>{
2357 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2358 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2359 };
2360
2361 layers[0].name = "Test layer 1234";
2362 layers[0].desiredRefreshRate = Fps(60.0f);
2363 layers[0].vote = LayerVoteType::ExplicitDefault;
2364
2365 layers[1].name = "Test layer 5678";
2366 layers[1].desiredRefreshRate = Fps(30.0f);
2367 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002368 auto frameRateOverrides =
2369 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002370
2371 ASSERT_EQ(2, frameRateOverrides.size());
2372 ASSERT_EQ(1, frameRateOverrides.count(1234));
2373 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2374 ASSERT_EQ(1, frameRateOverrides.count(5678));
2375 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2376
2377 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002378 frameRateOverrides =
2379 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002380 ASSERT_EQ(1, frameRateOverrides.size());
2381 ASSERT_EQ(1, frameRateOverrides.count(1234));
2382 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2383
2384 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002385 frameRateOverrides =
2386 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2387 ASSERT_TRUE(frameRateOverrides.empty());
2388}
2389
2390TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002391 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002392 auto refreshRateConfigs =
2393 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002394 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002395
2396 auto layers = std::vector<LayerRequirement>{
2397 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2398 };
2399
2400 layers[0].name = "Test layer";
2401 layers[0].desiredRefreshRate = Fps(60.0f);
2402 layers[0].vote = LayerVoteType::ExplicitDefault;
2403
2404 auto frameRateOverrides =
2405 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2406 ASSERT_EQ(1, frameRateOverrides.size());
2407 ASSERT_EQ(1, frameRateOverrides.count(1234));
2408 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2409
2410 frameRateOverrides =
2411 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2412 ASSERT_EQ(1, frameRateOverrides.size());
2413 ASSERT_EQ(1, frameRateOverrides.count(1234));
2414 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2415
2416 layers[0].vote = LayerVoteType::ExplicitExact;
2417 frameRateOverrides =
2418 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2419 ASSERT_EQ(1, frameRateOverrides.size());
2420 ASSERT_EQ(1, frameRateOverrides.count(1234));
2421 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2422
2423 frameRateOverrides =
2424 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2425 ASSERT_EQ(1, frameRateOverrides.size());
2426 ASSERT_EQ(1, frameRateOverrides.count(1234));
2427 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2428
2429 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2430 frameRateOverrides =
2431 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2432 ASSERT_EQ(1, frameRateOverrides.size());
2433 ASSERT_EQ(1, frameRateOverrides.count(1234));
2434 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2435
2436 frameRateOverrides =
2437 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002438 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002439}
2440
Alec Mouri0a1cc962019-03-14 12:33:02 -07002441} // namespace
2442} // namespace scheduler
2443} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002444
2445// TODO(b/129481165): remove the #pragma below and fix conversion issues
2446#pragma clang diagnostic pop // ignored "-Wextra"