blob: a8e3e5ee6d62da08f8a67f7ed91c2d46e4cd7266 [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
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100178 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
179 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700180};
181
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100182using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700183
Alec Mouri0a1cc962019-03-14 12:33:02 -0700184RefreshRateConfigsTest::RefreshRateConfigsTest() {
185 const ::testing::TestInfo* const test_info =
186 ::testing::UnitTest::GetInstance()->current_test_info();
187 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
188}
189
190RefreshRateConfigsTest::~RefreshRateConfigsTest() {
191 const ::testing::TestInfo* const test_info =
192 ::testing::UnitTest::GetInstance()->current_test_info();
193 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
194}
195
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100196DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
197 int64_t vsyncPeriod, ui::Size resolution) {
198 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
199 .setId(modeId)
Ady Abraham5e7ee862021-06-23 17:43:41 -0700200 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
Ady Abrahamabc27602020-04-08 17:20:29 -0700201 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100202 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100203 .setHeight(resolution.height)
204 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700205 .build();
206}
207
Alec Mouri0a1cc962019-03-14 12:33:02 -0700208namespace {
209/* ------------------------------------------------------------------------
210 * Test cases
211 */
Ady Abraham2139f732019-11-13 18:56:40 -0800212TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700213 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700214 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
215 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700216}
217
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100218TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100219 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700220 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
221 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100222 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100223 0);
224 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
225 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100226}
227
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700228TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700229 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700230 std::make_unique<RefreshRateConfigs>(m60_90Device,
231 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700232
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100233 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
234 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700235
Ady Abrahamabc27602020-04-08 17:20:29 -0700236 ASSERT_EQ(mExpected60Config, minRate);
237 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800238
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100239 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800240 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800241 ASSERT_EQ(minRateByPolicy, minRate);
242 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700243}
Ady Abraham2139f732019-11-13 18:56:40 -0800244
245TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800246 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700247 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
248 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800249
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100250 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
251 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
252 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800253 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800254
Ady Abrahamabc27602020-04-08 17:20:29 -0700255 ASSERT_EQ(mExpected60Config, minRate);
256 ASSERT_EQ(mExpected60Config, minRate60);
257 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800258
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100259 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
260 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100261 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800262
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100263 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800264 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800265
Ady Abrahamabc27602020-04-08 17:20:29 -0700266 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
267 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
268 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
269}
270
271TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
272 auto refreshRateConfigs =
273 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
274 /*currentConfigId=*/HWC_CONFIG_ID_60);
275
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100276 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
277 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
278 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700279 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
280
281 ASSERT_EQ(mExpected60Config, minRate);
282 ASSERT_EQ(mExpected60Config, minRate60);
283 ASSERT_EQ(mExpected60Config, performanceRate60);
284
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100285 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
286 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100287 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700288
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100289 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700290 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
291
292 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
293 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
294 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800295}
296
297TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800298 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700299 std::make_unique<RefreshRateConfigs>(m60_90Device,
300 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800301
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100302 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
303 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800304
Ady Abrahamabc27602020-04-08 17:20:29 -0700305 ASSERT_EQ(mExpected60Config, minRate);
306 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800307
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100308 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
309 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800310
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100311 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
312 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700313 ASSERT_EQ(mExpected60Config, minRate60);
314 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800315}
316
317TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800318 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700319 std::make_unique<RefreshRateConfigs>(m60_90Device,
320 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800321 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100322 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100323 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800324 }
325
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100326 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800327 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100328 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100329 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800330 }
331
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100332 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
333 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800334 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100335 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100336 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800337 }
338}
339
Steven Thomasbb374322020-04-28 22:47:16 -0700340TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700341 auto refreshRateConfigs =
342 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
343 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800344
Steven Thomasdebafed2020-05-18 17:30:35 -0700345 // If there are no layers we select the default frame rate, which is the max of the primary
346 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800347 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700348 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700349 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800350
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200351 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
352 NO_ERROR);
Ady Abrahamabc27602020-04-08 17:20:29 -0700353 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700354 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200355
356 // We select max even when this will cause a non-seamless switch.
357 refreshRateConfigs = std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
358 /*currentConfigId=*/HWC_CONFIG_ID_60);
359 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy(
360 {HWC_CONFIG_ID_90, /*allowGroupSwitching*/ true, {Fps(0), Fps(90)}}),
361 NO_ERROR);
362 EXPECT_EQ(mExpected90DifferentGroupConfig,
363 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800364}
365
Steven Thomasbb374322020-04-28 22:47:16 -0700366TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800367 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700368 std::make_unique<RefreshRateConfigs>(m60_90Device,
369 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
371 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
372 auto& lr = layers[0];
373
374 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800375 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700376 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700377 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
379 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800380 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700381 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700382 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100384 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800386 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700387 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700388 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100390 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800391 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700392 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700393 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100395 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800396 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700397 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700398 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100400 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800401 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700402 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700403 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100405 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800406 lr.name = "24Hz Heuristic";
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
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800410 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100411 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
412 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
414 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700415 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700416 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800417
418 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700419 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700420 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100422 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.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 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700436 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700437 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100439 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700440 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100443 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
444 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
445 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
447 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700448 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700449 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
451 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700452 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700453 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100455 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.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 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700469 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700470 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800471
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100472 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700473 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700474 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800475
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100476 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
477 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
478 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700480 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700481 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482
483 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700484 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700485 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100487 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800488 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700497 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700498 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800499
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100500 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700501 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700502 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800503
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100504 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700505 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700506 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800507}
508
rnlee3bd610662021-06-23 16:27:57 -0700509TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
510 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
511 auto refreshRateConfigs =
512 std::make_unique<RefreshRateConfigs>(m60_90Device,
513 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
514
515 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
516 auto& lr = layers[0];
517
518 lr.vote = LayerVoteType::Min;
519 lr.name = "Min";
520 EXPECT_EQ(mExpected60Config,
521 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
522
523 lr.vote = LayerVoteType::Max;
524 lr.name = "Max";
525 EXPECT_EQ(mExpected90Config,
526 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
527
528 lr.desiredRefreshRate = Fps(90.0f);
529 lr.vote = LayerVoteType::Heuristic;
530 lr.name = "90Hz Heuristic";
531 EXPECT_EQ(mExpected90Config,
532 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
533
534 lr.desiredRefreshRate = Fps(60.0f);
535 lr.name = "60Hz Heuristic";
536 EXPECT_EQ(mExpected60Config,
537 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
538
539 lr.desiredRefreshRate = Fps(45.0f);
540 lr.name = "45Hz Heuristic";
541 EXPECT_EQ(mExpected90Config,
542 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
543
544 lr.desiredRefreshRate = Fps(30.0f);
545 lr.name = "30Hz Heuristic";
546 EXPECT_EQ(mExpected60Config,
547 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
548
549 lr.desiredRefreshRate = Fps(24.0f);
550 lr.name = "24Hz Heuristic";
551 EXPECT_EQ(mExpected60Config,
552 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
553}
554
Steven Thomasbb374322020-04-28 22:47:16 -0700555TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800556 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700557 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
558 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800559
560 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
561 auto& lr = layers[0];
562
563 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700564 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700565 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800566
567 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700568 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700569 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800570
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100571 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800572 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700581 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700582 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800583
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100584 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700585 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700586 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800587
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100588 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700589 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700590 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800591}
592
Steven Thomasbb374322020-04-28 22:47:16 -0700593TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800594 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700595 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
596 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800597
598 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
599 LayerRequirement{.weight = 1.0f}};
600 auto& lr1 = layers[0];
601 auto& lr2 = layers[1];
602
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100603 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800604 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100605 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800606 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700607 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700608 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800609
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100610 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800611 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100612 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800613 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700614 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700615 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800616
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100617 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800618 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100619 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800620 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700621 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700622 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800623}
624
Steven Thomasbb374322020-04-28 22:47:16 -0700625TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800626 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700627 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
628 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800629
630 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
631 LayerRequirement{.weight = 1.0f}};
632 auto& lr1 = layers[0];
633 auto& lr2 = layers[1];
634
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100635 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800637 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100638 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800639 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800640 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700641 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700642 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800643
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100644 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800645 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800646 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100647 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800648 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700650 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700651 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800652
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100653 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800654 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800655 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100656 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800657 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800658 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700659 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700660 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800661
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100662 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800663 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800664 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100665 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800666 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800667 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700668 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700669 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800670
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100671 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800672 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
673 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100674 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800675 lr2.vote = LayerVoteType::ExplicitDefault;
676 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700677 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700678 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800679
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100680 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800681 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800682 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100683 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800684 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800685 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700686 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700687 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800688
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100689 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800690 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800691 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100692 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800693 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800694 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700695 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700696 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800697
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100698 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800699 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800700 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100701 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800702 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800703 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700704 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700705 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800706
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100707 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800708 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800709 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100710 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800711 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800712 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700713 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700714 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800715}
716
rnlee3bd610662021-06-23 16:27:57 -0700717TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
718 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
719 auto refreshRateConfigs =
720 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
721 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
722
723 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
724 LayerRequirement{.weight = 1.0f}};
725 auto& lr1 = layers[0];
726 auto& lr2 = layers[1];
727
728 lr1.desiredRefreshRate = Fps(24.0f);
729 lr1.vote = LayerVoteType::ExplicitDefault;
730 lr1.name = "24Hz ExplicitDefault";
731 lr2.desiredRefreshRate = Fps(60.0f);
732 lr2.vote = LayerVoteType::Heuristic;
733 lr2.name = "60Hz Heuristic";
734 EXPECT_EQ(mExpected120Config,
735 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
736
737 lr1.desiredRefreshRate = Fps(24.0f);
738 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
739 lr1.name = "24Hz ExplicitExactOrMultiple";
740 lr2.desiredRefreshRate = Fps(60.0f);
741 lr2.vote = LayerVoteType::Heuristic;
742 lr2.name = "60Hz Heuristic";
743 EXPECT_EQ(mExpected60Config,
744 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
745
746 lr1.desiredRefreshRate = Fps(24.0f);
747 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
748 lr1.name = "24Hz ExplicitExactOrMultiple";
749 lr2.desiredRefreshRate = Fps(60.0f);
750 lr2.vote = LayerVoteType::ExplicitDefault;
751 lr2.name = "60Hz ExplicitDefault";
752 EXPECT_EQ(mExpected72Config,
753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
754
755 lr1.desiredRefreshRate = Fps(24.0f);
756 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
757 lr1.name = "24Hz ExplicitExactOrMultiple";
758 lr2.desiredRefreshRate = Fps(90.0f);
759 lr2.vote = LayerVoteType::Heuristic;
760 lr2.name = "90Hz Heuristic";
761 EXPECT_EQ(mExpected90Config,
762 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
763
764 lr1.desiredRefreshRate = Fps(24.0f);
765 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
766 lr1.name = "24Hz ExplicitExactOrMultiple";
767 lr2.desiredRefreshRate = Fps(90.0f);
768 lr2.vote = LayerVoteType::ExplicitDefault;
769 lr2.name = "90Hz Heuristic";
770 EXPECT_EQ(mExpected72Config,
771 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
772
773 lr1.desiredRefreshRate = Fps(24.0f);
774 lr1.vote = LayerVoteType::ExplicitDefault;
775 lr1.name = "24Hz ExplicitDefault";
776 lr2.desiredRefreshRate = Fps(90.0f);
777 lr2.vote = LayerVoteType::Heuristic;
778 lr2.name = "90Hz Heuristic";
779 EXPECT_EQ(mExpected90Config,
780 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
781
782 lr1.desiredRefreshRate = Fps(24.0f);
783 lr1.vote = LayerVoteType::Heuristic;
784 lr1.name = "24Hz Heuristic";
785 lr2.desiredRefreshRate = Fps(90.0f);
786 lr2.vote = LayerVoteType::ExplicitDefault;
787 lr2.name = "90Hz ExplicitDefault";
788 EXPECT_EQ(mExpected72Config,
789 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
790
791 lr1.desiredRefreshRate = Fps(24.0f);
792 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
793 lr1.name = "24Hz ExplicitExactOrMultiple";
794 lr2.desiredRefreshRate = Fps(90.0f);
795 lr2.vote = LayerVoteType::ExplicitDefault;
796 lr2.name = "90Hz ExplicitDefault";
797 EXPECT_EQ(mExpected72Config,
798 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
799
800 lr1.desiredRefreshRate = Fps(24.0f);
801 lr1.vote = LayerVoteType::ExplicitDefault;
802 lr1.name = "24Hz ExplicitDefault";
803 lr2.desiredRefreshRate = Fps(90.0f);
804 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
805 lr2.name = "90Hz ExplicitExactOrMultiple";
806 EXPECT_EQ(mExpected90Config,
807 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
808}
809
Steven Thomasbb374322020-04-28 22:47:16 -0700810TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800811 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700812 std::make_unique<RefreshRateConfigs>(m30_60Device,
813 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814
815 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
816 auto& lr = layers[0];
817
818 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700819 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700820 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821
822 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700823 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700824 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800825
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100826 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800827 lr.vote = LayerVoteType::Heuristic;
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(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700832 EXPECT_EQ(mExpected60Config,
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(45.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
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100839 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700840 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700841 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800842
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100843 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700844 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700845 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800846}
847
Steven Thomasbb374322020-04-28 22:47:16 -0700848TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800849 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700850 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
851 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
853 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
854 auto& lr = layers[0];
855
856 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800857 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700858 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700859 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800860
861 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800862 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700864 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800865
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100866 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800867 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800868 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700869 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800871
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100872 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800873 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700874 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700875 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700876 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700877 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800878
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100879 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800880 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700881 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700882 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700883 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700884 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800885
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100886 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800887 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700888 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700889 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700890 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700891 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800892
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100893 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800894 lr.name = "24Hz Heuristic";
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 Abraham4ccdcb42020-02-11 17:34:34 -0800899
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100900 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800901 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
902 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700903 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700904 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700905 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700906 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800907}
908
Steven Thomasbb374322020-04-28 22:47:16 -0700909TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800910 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700911 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
912 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800913
914 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
915 LayerRequirement{.weight = 1.0f}};
916 auto& lr1 = layers[0];
917 auto& lr2 = layers[1];
918
919 lr1.vote = LayerVoteType::Min;
920 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700921 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700922 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800923
924 lr1.vote = LayerVoteType::Min;
925 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100926 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800929
930 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800931 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100932 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700933 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700934 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800935
936 lr1.vote = LayerVoteType::Max;
937 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100938 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700939 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700940 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800941
942 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800943 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100944 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700945 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700946 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800947
948 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100949 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800950 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100951 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700952 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700953 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800954
955 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100956 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800957 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100958 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700959 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700960 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800961}
962
Steven Thomasbb374322020-04-28 22:47:16 -0700963TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800964 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700965 std::make_unique<RefreshRateConfigs>(m60_90Device,
966 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800967
968 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
969 auto& lr = layers[0];
970
Ady Abraham71c437d2020-01-31 15:56:57 -0800971 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800972 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100973 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800974 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700975 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700976 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800977 }
978}
979
rnlee3bd610662021-06-23 16:27:57 -0700980TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
981 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
982 auto refreshRateConfigs =
983 std::make_unique<RefreshRateConfigs>(m60_120Device,
984 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
985
986 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
987 auto& lr = layers[0];
988
989 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
990 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
991 lr.desiredRefreshRate = Fps(fps);
992 const auto& refreshRate =
993 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
994 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
995 }
996}
997
Steven Thomasbb374322020-04-28 22:47:16 -0700998TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800999 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001000 std::make_unique<RefreshRateConfigs>(m60_90Device,
1001 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -08001002
1003 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1004 LayerRequirement{.weight = 1.0f}};
1005 auto& lr1 = layers[0];
1006 auto& lr2 = layers[1];
1007
1008 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001009 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001010 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001011 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001012 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001013 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001014
1015 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001016 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001017 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001018 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001019 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001020 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001021
1022 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001023 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001024 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001025 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001026 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001027 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001028}
1029
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001030TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001031 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1032 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1033 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1034 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1035 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001036}
1037
Steven Thomasbb374322020-04-28 22:47:16 -07001038TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001039 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001040 std::make_unique<RefreshRateConfigs>(m60_90Device,
1041 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001042
1043 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1044 auto& lr = layers[0];
1045
Ady Abraham71c437d2020-01-31 15:56:57 -08001046 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001047 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001048 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001049 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001050 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001051 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001052 }
1053}
1054
Steven Thomasbb374322020-04-28 22:47:16 -07001055TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001056 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001057 std::make_unique<RefreshRateConfigs>(m60_90Device,
1058 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001059
1060 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1061 LayerRequirement{.weight = 1.0f}};
1062 auto& lr1 = layers[0];
1063 auto& lr2 = layers[1];
1064
1065 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001066 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001067 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001068 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001069 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001070 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001071 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001072 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001073
1074 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001075 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001076 lr1.name = "60Hz ExplicitExactOrMultiple";
1077 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001078 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001079 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001080 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001081 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001082
1083 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001084 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001085 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001086 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001087 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001088 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001089 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001090
1091 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001092 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001093 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001094 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001095 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001096 lr2.name = "90Hz Heuristic";
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 Abraham34702102020-02-10 14:12:05 -08001099
1100 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001101 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001102 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001103 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001104 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001105 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001106 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001107}
1108
1109TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001110 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001111 std::make_unique<RefreshRateConfigs>(m60_90Device,
1112 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001113
1114 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1115 LayerRequirement{.weight = 1.0f}};
1116 auto& lr1 = layers[0];
1117 auto& lr2 = layers[1];
1118
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(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001125 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .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::NoVote;
1131 lr2.name = "NoVote";
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 = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001142
1143 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001144 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001145 lr1.name = "60Hz ExplicitExactOrMultiple";
1146 lr2.vote = LayerVoteType::Max;
1147 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001148 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001149 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001150
1151 // The other layer starts to provide buffers
1152 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001153 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001154 lr1.name = "60Hz ExplicitExactOrMultiple";
1155 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001156 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001157 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001158 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001159 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001160}
1161
1162TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001163 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001164 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001165 std::make_unique<RefreshRateConfigs>(m60_90Device,
1166 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001167
Ady Abrahamdfd62162020-06-10 16:11:56 -07001168 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1169 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001170
Ady Abrahamdfd62162020-06-10 16:11:56 -07001171 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1172 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001173
1174 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1175 LayerRequirement{.weight = 1.0f}};
1176 auto& lr1 = layers[0];
1177 auto& lr2 = layers[1];
1178
1179 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001180 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001181 lr1.name = "60Hz ExplicitExactOrMultiple";
1182 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001183 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001184 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001185 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1186 &consideredSignals);
1187 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001188
1189 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001190 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001191 lr1.name = "60Hz ExplicitExactOrMultiple";
1192 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001193 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001194 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001195 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1196 &consideredSignals);
1197 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001198
1199 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001200 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001201 lr1.name = "60Hz ExplicitExactOrMultiple";
1202 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001203 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001204 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001205 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1206 &consideredSignals);
1207 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001208
1209 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001210 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001211 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001212 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001213 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001214 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001215 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1216 &consideredSignals);
1217 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001218}
1219
Steven Thomasbb374322020-04-28 22:47:16 -07001220TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001221 auto refreshRateConfigs =
1222 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1223 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001224
1225 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1226 auto& lr = layers[0];
1227
1228 // Prepare a table with the vote and the expected refresh rate
1229 const std::vector<std::pair<float, float>> testCases = {
1230 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1231
1232 {100, 90}, {90, 90}, {89, 90},
1233
1234 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1235
1236 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1237
1238 {55, 90}, {50, 90}, {45, 90},
1239
1240 {42, 120}, {40, 120}, {39, 120},
1241
1242 {37, 72}, {36, 72}, {35, 72},
1243
1244 {30, 60},
1245 };
1246
1247 for (const auto& test : testCases) {
1248 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001249 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001250
1251 std::stringstream ss;
1252 ss << "ExplicitDefault " << test.first << " fps";
1253 lr.name = ss.str();
1254
1255 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001256 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001257 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001258 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1259 << " but it was " << refreshRate.getFps();
1260 }
1261}
1262
1263TEST_F(RefreshRateConfigsTest,
1264 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1265 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1266 auto& lr = layers[0];
1267
1268 // Test that 23.976 will choose 24 if 23.976 is not supported
1269 {
1270 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1271 mConfig30Frac, mConfig60, mConfig60Frac};
1272 auto refreshRateConfigs =
1273 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1274
1275 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1276 lr.desiredRefreshRate = Fps(23.976f);
1277 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1278 EXPECT_EQ(HWC_CONFIG_ID_24,
1279 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1280 .getModeId());
1281 }
1282
1283 // Test that 24 will choose 23.976 if 24 is not supported
1284 {
1285 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1286 mConfig30Frac, mConfig60, mConfig60Frac};
1287 auto refreshRateConfigs =
1288 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1289 lr.desiredRefreshRate = Fps(24.f);
1290 lr.name = "ExplicitExactOrMultiple 24 fps";
1291 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1292 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1293 .getModeId());
1294 }
1295
1296 // Test that 29.97 will prefer 59.94 over 60 and 30
1297 {
1298 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1299 mConfig30, mConfig60, mConfig60Frac};
1300 auto refreshRateConfigs =
1301 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1302 lr.desiredRefreshRate = Fps(29.97f);
1303 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1304 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1305 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1306 .getModeId());
1307 }
1308}
1309
1310TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1311 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1312 auto& lr = layers[0];
1313
1314 // Test that voting for supported refresh rate will select this refresh rate
1315 {
1316 auto refreshRateConfigs =
1317 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1318 /*currentConfigId=*/HWC_CONFIG_ID_60);
1319
1320 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1321 lr.vote = LayerVoteType::ExplicitExact;
1322 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1323 std::stringstream ss;
1324 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1325 lr.name = ss.str();
1326
1327 auto selecteRefreshRate =
1328 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1329
1330 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1331 << "Expecting " << lr.desiredRefreshRate << " but it was "
1332 << selecteRefreshRate.getFps();
1333 }
1334 }
1335
1336 // Test that 23.976 will choose 24 if 23.976 is not supported
1337 {
1338 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1339 mConfig30Frac, mConfig60, mConfig60Frac};
1340 auto refreshRateConfigs =
1341 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1342 lr.vote = LayerVoteType::ExplicitExact;
1343 lr.desiredRefreshRate = Fps(23.976f);
1344 lr.name = "ExplicitExact 23.976 fps";
1345 EXPECT_EQ(HWC_CONFIG_ID_24,
1346 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1347 .getModeId());
1348 }
1349
1350 // Test that 24 will choose 23.976 if 24 is not supported
1351 {
1352 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1353 mConfig30Frac, mConfig60, mConfig60Frac};
1354 auto refreshRateConfigs =
1355 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1356 lr.desiredRefreshRate = Fps(24.f);
1357 lr.name = "ExplicitExact 24 fps";
1358 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1359 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1360 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001361 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001362}
1363
Alec Mouri11232a22020-05-14 18:06:25 -07001364TEST_F(RefreshRateConfigsTest,
1365 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1366 auto refreshRateConfigs =
1367 std::make_unique<RefreshRateConfigs>(m60_90Device,
1368 /*currentConfigId=*/HWC_CONFIG_ID_90);
1369
1370 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001371 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001372 0);
1373
1374 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1375 auto& lr = layers[0];
1376
Ady Abrahamdfd62162020-06-10 16:11:56 -07001377 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001378 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001379 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001380 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001381 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001382 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1384 &consideredSignals));
1385 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001386}
1387
1388TEST_F(RefreshRateConfigsTest,
1389 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1390 auto refreshRateConfigs =
1391 std::make_unique<RefreshRateConfigs>(m60_90Device,
1392 /*currentConfigId=*/HWC_CONFIG_ID_60);
1393
1394 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001395 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001396 0);
1397
1398 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1399 auto& lr = layers[0];
1400
Alec Mouri11232a22020-05-14 18:06:25 -07001401 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001402 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001403 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001404 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001405 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001406 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001407}
1408
1409TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001410 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001411 auto refreshRateConfigs =
1412 std::make_unique<RefreshRateConfigs>(m60_90Device,
1413 /*currentConfigId=*/HWC_CONFIG_ID_90);
1414
1415 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001416 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001417 0);
1418
Ady Abrahamdfd62162020-06-10 16:11:56 -07001419 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001420 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001421 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1422 &consideredSignals));
1423 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001424
1425 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1426 auto& lr = layers[0];
1427
1428 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001429 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001430 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001431 lr.focused = false;
1432 EXPECT_EQ(mExpected90Config,
1433 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1434
1435 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001436 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001437 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001438
1439 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001440 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001441 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001442 lr.focused = false;
1443 EXPECT_EQ(mExpected90Config,
1444 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1445
1446 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001447 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001448 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001449
1450 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001451 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001452 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001453 lr.focused = false;
1454 EXPECT_EQ(mExpected90Config,
1455 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1456
1457 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001458 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001459 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001460
1461 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001462 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001463 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001464 lr.focused = false;
1465 EXPECT_EQ(mExpected90Config,
1466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1467
1468 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001469 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001470 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001471
1472 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001473 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001474 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001475 lr.focused = false;
1476 EXPECT_EQ(mExpected90Config,
1477 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1478
1479 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001480 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001481 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001482}
1483
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001484TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001485 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001486 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1487 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001488
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001489 // The default policy doesn't allow group switching. Verify that no
1490 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001491 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1492 auto& layer = layers[0];
1493 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001494 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001495 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001496 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001497 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001498
Steven Thomasd4071902020-03-24 16:02:53 -07001499 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001500 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001501 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001502}
Steven Thomasd4071902020-03-24 16:02:53 -07001503
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001504TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1505 auto refreshRateConfigs =
1506 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1507 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001508 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001509 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001510 policy.allowGroupSwitching = true;
1511 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001512
1513 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1514 auto& layer = layers[0];
1515 layer.vote = LayerVoteType::ExplicitDefault;
1516 layer.desiredRefreshRate = Fps(90.0f);
1517 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1518 layer.name = "90Hz ExplicitDefault";
1519 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001520 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001521 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001522 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001523}
1524
1525TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1526 auto refreshRateConfigs =
1527 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1528 /*currentConfigId=*/HWC_CONFIG_ID_60);
1529 RefreshRateConfigs::Policy policy;
1530 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1531 policy.allowGroupSwitching = true;
1532 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001533
1534 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001535 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1536 auto& layer = layers[0];
1537 layer.vote = LayerVoteType::ExplicitDefault;
1538 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001539 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001540 layer.name = "90Hz ExplicitDefault";
1541 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001542 ASSERT_EQ(HWC_CONFIG_ID_60,
1543 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001544 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001545}
1546
1547TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1548 auto refreshRateConfigs =
1549 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1550 /*currentConfigId=*/HWC_CONFIG_ID_60);
1551 RefreshRateConfigs::Policy policy;
1552 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1553 policy.allowGroupSwitching = true;
1554 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1555
1556 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001557
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001558 // 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 +01001559 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1560 auto& layer = layers[0];
1561 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001562 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001563 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001564 layer.name = "60Hz ExplicitDefault";
1565 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001566 ASSERT_EQ(HWC_CONFIG_ID_90,
1567 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001568 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001569}
1570
1571TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1572 auto refreshRateConfigs =
1573 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1574 /*currentConfigId=*/HWC_CONFIG_ID_60);
1575 RefreshRateConfigs::Policy policy;
1576 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1577 policy.allowGroupSwitching = true;
1578 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1579
1580 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001581
1582 // Verify that if the current config is in another group and there are no layers with
1583 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001584
1585 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1586 auto& layer = layers[0];
1587 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001588 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001589 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001590 layer.name = "60Hz ExplicitDefault";
1591 layer.focused = true;
1592
Marin Shalamanov46084422020-10-13 12:33:42 +02001593 ASSERT_EQ(HWC_CONFIG_ID_60,
1594 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001595 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001596}
1597
1598TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1599 auto refreshRateConfigs =
1600 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1601 /*currentConfigId=*/HWC_CONFIG_ID_60);
1602 RefreshRateConfigs::Policy policy;
1603 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1604 policy.allowGroupSwitching = true;
1605 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1606
1607 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001608
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001609 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001610 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001611 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1612 layers[0].vote = LayerVoteType::ExplicitDefault;
1613 layers[0].desiredRefreshRate = Fps(60.0f);
1614 layers[0].seamlessness = Seamlessness::OnlySeamless;
1615 layers[0].name = "60Hz ExplicitDefault";
1616 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001617
1618 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001619 layers[1].vote = LayerVoteType::ExplicitDefault;
1620 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1621 layers[1].desiredRefreshRate = Fps(90.0f);
1622 layers[1].name = "90Hz ExplicitDefault";
1623 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001624
1625 ASSERT_EQ(HWC_CONFIG_ID_90,
1626 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001627 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001628}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001629
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001630TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001631 auto refreshRateConfigs =
1632 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1633 /*currentConfigId=*/HWC_CONFIG_ID_60);
1634 RefreshRateConfigs::Policy policy;
1635 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1636 policy.allowGroupSwitching = true;
1637 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1638
1639 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001640
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001641 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1642 // seamlessness=Default can't change the mode group back to the group of the default
1643 // mode.
1644 // For example, this may happen when a video playback requests and gets a seamed switch,
1645 // but another layer (with default seamlessness) starts animating. The animating layer
1646 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001647 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001648 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001649 layers[0].desiredRefreshRate = Fps(60.0f);
1650 layers[0].focused = true;
1651 layers[0].vote = LayerVoteType::ExplicitDefault;
1652 layers[0].name = "60Hz ExplicitDefault";
1653
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001654 layers.push_back(LayerRequirement{.weight = 0.1f});
1655 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1656 layers[1].desiredRefreshRate = Fps(90.0f);
1657 layers[1].focused = true;
1658 layers[1].vote = LayerVoteType::ExplicitDefault;
1659 layers[1].name = "90Hz ExplicitDefault";
1660
Marin Shalamanov46084422020-10-13 12:33:42 +02001661 ASSERT_EQ(HWC_CONFIG_ID_90,
1662 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001663 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001664}
1665
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001666TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1667 auto refreshRateConfigs =
1668 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1669 /*currentConfigId=*/HWC_CONFIG_ID_60);
1670 RefreshRateConfigs::Policy policy;
1671 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1672 policy.allowGroupSwitching = true;
1673 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1674
1675 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1676
1677 // Layer with seamlessness=Default can change the mode group if there's a not
1678 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1679 // when in split screen mode the user switches between the two visible applications.
1680 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1681 layers[0].seamlessness = Seamlessness::Default;
1682 layers[0].desiredRefreshRate = Fps(60.0f);
1683 layers[0].focused = true;
1684 layers[0].vote = LayerVoteType::ExplicitDefault;
1685 layers[0].name = "60Hz ExplicitDefault";
1686
1687 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001688 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1689 layers[1].desiredRefreshRate = Fps(90.0f);
1690 layers[1].focused = false;
1691 layers[1].vote = LayerVoteType::ExplicitDefault;
1692 layers[1].name = "90Hz ExplicitDefault";
1693
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001694 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001695 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1696 .getModeId());
1697}
1698
1699TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1700 auto refreshRateConfigs =
1701 std::make_unique<RefreshRateConfigs>(m30_60Device,
1702 /*currentConfigId=*/HWC_CONFIG_ID_60);
1703
1704 // Allow group switching.
1705 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001706 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001707 policy.allowGroupSwitching = true;
1708 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1709
1710 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1711 auto& layer = layers[0];
1712 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001713 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001714 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001715 layer.name = "60Hz ExplicitExactOrMultiple";
1716 layer.focused = true;
1717
1718 ASSERT_EQ(HWC_CONFIG_ID_60,
1719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001720 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001721
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001722 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001723 ASSERT_EQ(HWC_CONFIG_ID_120,
1724 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001725 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001726}
1727
1728TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1729 auto refreshRateConfigs =
1730 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1731 /*currentConfigId=*/HWC_CONFIG_ID_60);
1732
1733 // Allow group switching.
1734 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001735 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001736 policy.allowGroupSwitching = true;
1737 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1738
1739 auto layers = std::vector<
1740 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1741 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001742 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001743 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001744 .weight = 0.5f,
1745 .focused = false},
1746 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1747 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001748 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001749 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001750 .weight = 1.0f,
1751 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001752
1753 ASSERT_EQ(HWC_CONFIG_ID_50,
1754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001755 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001756
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001757 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001758 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001759 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001760
1761 ASSERT_EQ(HWC_CONFIG_ID_25,
1762 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001763 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001764}
1765
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001766TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1767 auto refreshRateConfigs =
1768 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1769 /*currentConfigId=*/HWC_CONFIG_ID_90);
1770
1771 // Allow group switching.
1772 RefreshRateConfigs::Policy policy;
1773 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1774 policy.allowGroupSwitching = true;
1775 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1776
1777 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1778 .vote = LayerVoteType::Min,
1779 .weight = 1.f,
1780 .focused = true}};
1781
1782 ASSERT_EQ(HWC_CONFIG_ID_90,
1783 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1784 .getModeId());
1785}
1786
Steven Thomasf734df42020-04-13 21:09:28 -07001787TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1788 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001789 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001790 /*currentConfigId=*/HWC_CONFIG_ID_60);
1791
1792 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1793 layers[0].name = "Test layer";
1794
Steven Thomasbb374322020-04-28 22:47:16 -07001795 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001796 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001797 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001798 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001799 layers[0].vote = voteType;
1800 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001801 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001802 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001803 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001804 };
1805
1806 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001807 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001808 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001809 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001810 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001811 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001812 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1813 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1814 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1815 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1816 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1817 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001818
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001819 // Layers not focused are not allowed to override primary config
1820 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001821 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001822 /*focused=*/false));
1823 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001824 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001825 /*focused=*/false));
1826
Steven Thomasf734df42020-04-13 21:09:28 -07001827 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001828 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001829 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1830 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001831 EXPECT_EQ(HWC_CONFIG_ID_90,
1832 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001833 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001834 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001835
1836 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001837 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001838 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001839 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1840 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1841 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1842 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1843 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1844 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001845}
1846
Steven Thomasbb374322020-04-28 22:47:16 -07001847TEST_F(RefreshRateConfigsTest, idle) {
1848 auto refreshRateConfigs =
1849 std::make_unique<RefreshRateConfigs>(m60_90Device,
1850 /*currentConfigId=*/HWC_CONFIG_ID_60);
1851
1852 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1853 layers[0].name = "Test layer";
1854
Marin Shalamanov23c44202020-12-22 19:09:20 +01001855 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001856 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001857 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001858 RefreshRateConfigs::GlobalSignals consideredSignals;
1859 const auto configId =
1860 refreshRateConfigs
1861 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1862 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001863 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001864 // Refresh rate will be chosen by either touch state or idle state
1865 EXPECT_EQ(!touchActive, consideredSignals.idle);
1866 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001867 };
1868
1869 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001870 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001871 0);
1872
1873 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001874 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1875 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1876 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1877 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1878 EXPECT_EQ(HWC_CONFIG_ID_90,
1879 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1880 EXPECT_EQ(HWC_CONFIG_ID_90,
1881 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001882
1883 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001884 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001885 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001886 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001887
1888 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001889 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001890 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1891 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1892 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1893 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1894 EXPECT_EQ(HWC_CONFIG_ID_60,
1895 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1896 EXPECT_EQ(HWC_CONFIG_ID_60,
1897 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001898
1899 // Idle should be applied rather than the current config when there are no layers.
1900 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001901 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001902 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001903}
1904
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001905TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1906 auto refreshRateConfigs =
1907 std::make_unique<RefreshRateConfigs>(m60_90Device,
1908 /*currentConfigId=*/HWC_CONFIG_ID_60);
1909
1910 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001911 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1912 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001913 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001914 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001915 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001916 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001917 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001918 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001919 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001920 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001921 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001922 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001923 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001924 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001925 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001926 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001927 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1928 }
1929}
1930
1931TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001932 auto refreshRateConfigs =
1933 std::make_unique<RefreshRateConfigs>(m60_90Device,
1934 /*currentConfigId=*/HWC_CONFIG_ID_60);
1935
1936 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001937 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001938 const RefreshRate& expected;
1939 };
1940
1941 /* clang-format off */
1942 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001943 {Fps(24.0f), mExpected60Config},
1944 {Fps(30.0f), mExpected60Config},
1945 {Fps(45.0f), mExpected90Config},
1946 {Fps(60.0f), mExpected60Config},
1947 {Fps(72.0f), mExpected90Config},
1948 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001949 };
1950 /* clang-format on */
1951
1952 // Make sure the test tests all the known frame rate
1953 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001954 const auto equal =
1955 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1956 knownFrameRatesExpectations.begin(),
1957 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001958 EXPECT_TRUE(equal);
1959
1960 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1961 auto& layer = layers[0];
1962 layer.vote = LayerVoteType::Heuristic;
1963 for (const auto& expectedRate : knownFrameRatesExpectations) {
1964 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001965 const auto& refreshRate =
1966 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001967 EXPECT_EQ(expectedRate.expected, refreshRate);
1968 }
1969}
1970
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001971TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1972 auto refreshRateConfigs =
1973 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1974 /*currentConfigId=*/HWC_CONFIG_ID_60);
1975
1976 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1977 LayerRequirement{.weight = 0.5f}};
1978 auto& explicitExactLayer = layers[0];
1979 auto& explicitExactOrMultipleLayer = layers[1];
1980
1981 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1982 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1983 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1984
1985 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1986 explicitExactLayer.name = "ExplicitExact";
1987 explicitExactLayer.desiredRefreshRate = Fps(30);
1988
1989 EXPECT_EQ(mExpected30Config,
1990 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1991 EXPECT_EQ(mExpected30Config,
1992 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1993
1994 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1995 explicitExactLayer.desiredRefreshRate = Fps(60);
1996 EXPECT_EQ(mExpected60Config,
1997 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1998
1999 explicitExactLayer.desiredRefreshRate = Fps(72);
2000 EXPECT_EQ(mExpected72Config,
2001 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2002
2003 explicitExactLayer.desiredRefreshRate = Fps(90);
2004 EXPECT_EQ(mExpected90Config,
2005 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2006
2007 explicitExactLayer.desiredRefreshRate = Fps(120);
2008 EXPECT_EQ(mExpected120Config,
2009 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2010}
2011
2012TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002013 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002014 auto refreshRateConfigs =
2015 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002016 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002017
2018 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2019 LayerRequirement{.weight = 0.5f}};
2020 auto& explicitExactLayer = layers[0];
2021 auto& explicitExactOrMultipleLayer = layers[1];
2022
2023 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2024 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2025 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2026
2027 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2028 explicitExactLayer.name = "ExplicitExact";
2029 explicitExactLayer.desiredRefreshRate = Fps(30);
2030
2031 EXPECT_EQ(mExpected60Config,
2032 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2033 EXPECT_EQ(mExpected120Config,
2034 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2035
2036 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2037 explicitExactLayer.desiredRefreshRate = Fps(60);
2038 EXPECT_EQ(mExpected120Config,
2039 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2040
2041 explicitExactLayer.desiredRefreshRate = Fps(72);
2042 EXPECT_EQ(mExpected72Config,
2043 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2044
2045 explicitExactLayer.desiredRefreshRate = Fps(90);
2046 EXPECT_EQ(mExpected90Config,
2047 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2048
2049 explicitExactLayer.desiredRefreshRate = Fps(120);
2050 EXPECT_EQ(mExpected120Config,
2051 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2052}
2053
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002054TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2055 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2056
2057 auto refreshRateConfigs =
2058 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2059 /*currentConfigId=*/HWC_CONFIG_ID_60);
2060
2061 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2062 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2063 LayerRequirement>(),
2064 .globalSignals = {.touch = true,
2065 .idle = true},
2066 .outSignalsConsidered =
2067 {.touch = true,
2068 .idle = false},
2069 .resultingBestRefreshRate =
2070 createRefreshRate(
2071 mConfig90)});
2072
2073 EXPECT_EQ(createRefreshRate(mConfig90),
2074 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2075 {.touch = true, .idle = true}));
2076
2077 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2078 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2079 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2080 LayerRequirement>(),
2081 .globalSignals = {.touch = true,
2082 .idle = true},
2083 .outSignalsConsidered =
2084 cachedSignalsConsidered,
2085 .resultingBestRefreshRate =
2086 createRefreshRate(
2087 mConfig30)});
2088
2089 GlobalSignals signalsConsidered;
2090 EXPECT_EQ(createRefreshRate(mConfig30),
2091 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2092 {.touch = true, .idle = true},
2093 &signalsConsidered));
2094
2095 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2096}
2097
2098TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2099 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2100
2101 auto refreshRateConfigs =
2102 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2103 /*currentConfigId=*/HWC_CONFIG_ID_60);
2104 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2105
2106 GlobalSignals globalSignals{.touch = true, .idle = true};
2107 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2108 LayerRequirement{.weight = 0.5f}};
2109 const auto lastResult =
2110 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2111 /* outSignalsConsidered */ nullptr);
2112
2113 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2114
2115 ASSERT_TRUE(lastInvocation.has_value());
2116 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2117 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2118 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2119
2120 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2121 // to getBestRefreshRate()
2122 GlobalSignals detaultSignals;
2123 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2124}
2125
Ady Abraham5e4e9832021-06-14 13:40:56 -07002126TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002127 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002128 auto refreshRateConfigs =
2129 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002130 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002131
2132 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2133 LayerRequirement{.weight = 0.5f}};
2134 auto& explicitExactLayer = layers[0];
2135 auto& explicitExactOrMultipleLayer = layers[1];
2136
2137 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2138 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2139 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2140
2141 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2142 explicitExactLayer.name = "ExplicitExact";
2143 explicitExactLayer.desiredRefreshRate = Fps(30);
2144
2145 EXPECT_EQ(mExpected60Config,
2146 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2147 EXPECT_EQ(mExpected120Config,
2148 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2149
2150 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2151
2152 EXPECT_EQ(mExpected60Config,
2153 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2154 EXPECT_EQ(mExpected60Config,
2155 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2156}
2157
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002158TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2159 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2160 auto refreshRateConfigs =
2161 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2162 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2163
2164 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2165 LayerRequirement{.weight = 0.5f}};
2166 auto& explicitDefaultLayer = layers[0];
2167 auto& explicitExactOrMultipleLayer = layers[1];
2168
2169 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2170 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2171 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2172
2173 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2174 explicitDefaultLayer.name = "ExplicitDefault";
2175 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2176
2177 EXPECT_EQ(mExpected60Config,
2178 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2179}
2180
Ady Abraham05243be2021-09-16 15:58:52 -07002181// b/190578904
2182TEST_F(RefreshRateConfigsTest, getBestRefreshRate_deviceWithCloseRefreshRates) {
2183 constexpr int kMinRefreshRate = 10;
2184 constexpr int kMaxRefreshRate = 240;
2185
2186 DisplayModes displayModes;
2187 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2188 constexpr int32_t kGroup = 0;
2189 const auto refreshRate = Fps(static_cast<float>(fps));
2190 displayModes.push_back(
2191 createDisplayMode(DisplayModeId(fps), kGroup, refreshRate.getPeriodNsecs()));
2192 }
2193
2194 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
2195 auto refreshRateConfigs =
2196 std::make_unique<RefreshRateConfigs>(displayModes,
2197 /*currentConfigId=*/displayModes[0]->getId());
2198
2199 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2200 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2201 layers[0].desiredRefreshRate = fps;
2202 layers[0].vote = vote;
2203 EXPECT_EQ(fps.getIntValue(),
2204 refreshRateConfigs->getBestRefreshRate(layers, globalSignals)
2205 .getFps()
2206 .getIntValue())
2207 << "Failed for " << RefreshRateConfigs::layerVoteTypeString(vote);
2208 };
2209
2210 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2211 const auto refreshRate = Fps(static_cast<float>(fps));
2212 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2213 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2214 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2215 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2216 }
2217}
2218
Ana Krulecb9afd792020-06-11 13:16:15 -07002219TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2220 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2221 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2222 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2223}
2224
2225TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2226 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2227
2228 auto refreshRateConfigs =
2229 std::make_unique<RefreshRateConfigs>(m60_90Device,
2230 /*currentConfigId=*/HWC_CONFIG_ID_90);
2231 // SetPolicy(60, 90), current 90Hz => TurnOn.
2232 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2233
2234 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002235 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2236 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002237 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2238
Ady Abrahama91605e2021-06-18 11:41:47 -07002239 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002240 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2241 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002242 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002243
2244 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002245 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2246 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002247 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2248}
2249
TreeHugger Robot758ab612021-06-22 19:17:29 +00002250TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2251 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2252
2253 // Tests with 120Hz
2254 auto refreshRateConfigs =
2255 std::make_unique<RefreshRateConfigs>(m60_120Device,
2256 /*currentConfigId=*/HWC_CONFIG_ID_120);
2257 // SetPolicy(0, 60), current 60Hz => TurnOn.
2258 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2259 0);
2260 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2261
2262 // SetPolicy(60, 60), current 60Hz => TurnOff.
2263 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2264 0);
2265 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2266
2267 // SetPolicy(60, 120), current 60Hz => TurnOn.
2268 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2269 0);
2270 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2271
2272 // SetPolicy(120, 120), current 120Hz => TurnOff.
2273 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2274 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2275 0);
2276 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2277}
2278
Ady Abraham5cc2e262021-03-25 13:09:17 -07002279TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002280 auto refreshRateConfigs =
2281 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2282 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002283
2284 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002285 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2286 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002287
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002288 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002289 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2290 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002291
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002292 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002293 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2294 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002295
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002296 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002297 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2298 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002299
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002300 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002301 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2302 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002303
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002304 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002305 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2306 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002307
2308 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2309 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2310 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2311 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
2312}
2313
2314TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2315 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2316 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2317
2318 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2319 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2320
2321 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2322 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2323
2324 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2325 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2326
2327 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2328 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2329
2330 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2331 for (auto refreshRate : refreshRates) {
2332 EXPECT_FALSE(
2333 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2334 }
2335
2336 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2337 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2338 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002339}
2340
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002341TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002342 auto refreshRateConfigs =
2343 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2344 HWC_CONFIG_ID_120);
2345
2346 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002347 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2348 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002349}
2350
2351TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002352 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002353 auto refreshRateConfigs =
2354 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002355 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002356
2357 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2358 layers[0].name = "Test layer";
2359 layers[0].ownerUid = 1234;
2360 layers[0].desiredRefreshRate = Fps(60.0f);
2361 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002362 auto frameRateOverrides =
2363 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002364 ASSERT_EQ(1, frameRateOverrides.size());
2365 ASSERT_EQ(1, frameRateOverrides.count(1234));
2366 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2367
2368 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002369 frameRateOverrides =
2370 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002371 ASSERT_EQ(1, frameRateOverrides.size());
2372 ASSERT_EQ(1, frameRateOverrides.count(1234));
2373 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2374
2375 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002376 frameRateOverrides =
2377 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002378 ASSERT_TRUE(frameRateOverrides.empty());
2379
2380 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002381 frameRateOverrides =
2382 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002383 ASSERT_TRUE(frameRateOverrides.empty());
2384
2385 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002386 frameRateOverrides =
2387 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002388 ASSERT_TRUE(frameRateOverrides.empty());
2389
2390 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002391 frameRateOverrides =
2392 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002393 ASSERT_TRUE(frameRateOverrides.empty());
2394}
2395
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002396TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002397 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002398 auto refreshRateConfigs =
2399 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002400 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002401
2402 auto layers = std::vector<LayerRequirement>{
2403 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2404 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2405 };
2406
2407 layers[0].name = "Test layer 1234";
2408 layers[0].desiredRefreshRate = Fps(60.0f);
2409 layers[0].vote = LayerVoteType::ExplicitDefault;
2410
2411 layers[1].name = "Test layer 5678";
2412 layers[1].desiredRefreshRate = Fps(30.0f);
2413 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002414 auto frameRateOverrides =
2415 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002416
2417 ASSERT_EQ(2, frameRateOverrides.size());
2418 ASSERT_EQ(1, frameRateOverrides.count(1234));
2419 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2420 ASSERT_EQ(1, frameRateOverrides.count(5678));
2421 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2422
2423 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002424 frameRateOverrides =
2425 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002426 ASSERT_EQ(1, frameRateOverrides.size());
2427 ASSERT_EQ(1, frameRateOverrides.count(1234));
2428 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2429
2430 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002431 frameRateOverrides =
2432 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2433 ASSERT_TRUE(frameRateOverrides.empty());
2434}
2435
2436TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002437 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002438 auto refreshRateConfigs =
2439 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002440 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002441
2442 auto layers = std::vector<LayerRequirement>{
2443 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2444 };
2445
2446 layers[0].name = "Test layer";
2447 layers[0].desiredRefreshRate = Fps(60.0f);
2448 layers[0].vote = LayerVoteType::ExplicitDefault;
2449
2450 auto frameRateOverrides =
2451 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2452 ASSERT_EQ(1, frameRateOverrides.size());
2453 ASSERT_EQ(1, frameRateOverrides.count(1234));
2454 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2455
2456 frameRateOverrides =
2457 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2458 ASSERT_EQ(1, frameRateOverrides.size());
2459 ASSERT_EQ(1, frameRateOverrides.count(1234));
2460 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2461
2462 layers[0].vote = LayerVoteType::ExplicitExact;
2463 frameRateOverrides =
2464 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2465 ASSERT_EQ(1, frameRateOverrides.size());
2466 ASSERT_EQ(1, frameRateOverrides.count(1234));
2467 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2468
2469 frameRateOverrides =
2470 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2471 ASSERT_EQ(1, frameRateOverrides.size());
2472 ASSERT_EQ(1, frameRateOverrides.count(1234));
2473 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2474
2475 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2476 frameRateOverrides =
2477 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2478 ASSERT_EQ(1, frameRateOverrides.size());
2479 ASSERT_EQ(1, frameRateOverrides.count(1234));
2480 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2481
2482 frameRateOverrides =
2483 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002484 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002485}
2486
Alec Mouri0a1cc962019-03-14 12:33:02 -07002487} // namespace
2488} // namespace scheduler
2489} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002490
2491// TODO(b/129481165): remove the #pragma below and fix conversion issues
2492#pragma clang diagnostic pop // ignored "-Wextra"