blob: d8c9babac3c804f7ae83ed09e07368a8682d248c [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 Shalamanove3e68ad2021-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 Shalamanove3e68ad2021-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 Shalamanove3e68ad2021-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 Shalamanove3e68ad2021-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 Shalamanove3e68ad2021-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 Abrahamf3e81d22021-06-23 17:43:41 -0700200 .setPhysicalDisplayId(PhysicalDisplayId(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 Shalamanove8a663d2020-11-24 17:48:00 +0100351 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
352 0);
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}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800355}
356
Steven Thomasbb374322020-04-28 22:47:16 -0700357TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700359 std::make_unique<RefreshRateConfigs>(m60_90Device,
360 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
362 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
363 auto& lr = layers[0];
364
365 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800366 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700368 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
370 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800371 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700372 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100375 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800377 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700378 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700379 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800380
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100381 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800382 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700383 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700384 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100386 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100391 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800392 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700393 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700394 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100396 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800397 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700398 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700399 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800401 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100402 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
403 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404
405 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700407 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
409 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700410 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700411 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100413 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800414 lr.vote = LayerVoteType::Heuristic;
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
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100418 lr.desiredRefreshRate = Fps(60.0f);
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700423 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700424 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800425
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100426 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700427 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700428 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100430 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700431 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700432 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800433
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100434 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
435 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
436 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
438 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700439 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
442 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700443 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700444 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800445
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100446 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447 lr.vote = LayerVoteType::Heuristic;
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
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100451 lr.desiredRefreshRate = Fps(60.0f);
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700456 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700457 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800458
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100459 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700460 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700461 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800462
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100463 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700464 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700465 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100467 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
468 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
469 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
474 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700475 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100478 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800479 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700480 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700481 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100483 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700484 EXPECT_EQ(mExpected60Config,
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700488 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700489 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800490
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100491 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700492 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700493 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100495 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700496 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700497 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498}
499
rnlee3bd610662021-06-23 16:27:57 -0700500TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
501 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
502 auto refreshRateConfigs =
503 std::make_unique<RefreshRateConfigs>(m60_90Device,
504 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
505
506 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
507 auto& lr = layers[0];
508
509 lr.vote = LayerVoteType::Min;
510 lr.name = "Min";
511 EXPECT_EQ(mExpected60Config,
512 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
513
514 lr.vote = LayerVoteType::Max;
515 lr.name = "Max";
516 EXPECT_EQ(mExpected90Config,
517 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
518
519 lr.desiredRefreshRate = Fps(90.0f);
520 lr.vote = LayerVoteType::Heuristic;
521 lr.name = "90Hz Heuristic";
522 EXPECT_EQ(mExpected90Config,
523 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
524
525 lr.desiredRefreshRate = Fps(60.0f);
526 lr.name = "60Hz Heuristic";
527 EXPECT_EQ(mExpected60Config,
528 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
529
530 lr.desiredRefreshRate = Fps(45.0f);
531 lr.name = "45Hz Heuristic";
532 EXPECT_EQ(mExpected90Config,
533 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
534
535 lr.desiredRefreshRate = Fps(30.0f);
536 lr.name = "30Hz Heuristic";
537 EXPECT_EQ(mExpected60Config,
538 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
539
540 lr.desiredRefreshRate = Fps(24.0f);
541 lr.name = "24Hz Heuristic";
542 EXPECT_EQ(mExpected60Config,
543 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
544}
545
Steven Thomasbb374322020-04-28 22:47:16 -0700546TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700548 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
549 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800550
551 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
552 auto& lr = layers[0];
553
554 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700556 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557
558 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700559 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700560 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100562 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800563 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700564 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700565 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800566
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100567 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700568 EXPECT_EQ(mExpected60Config,
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700572 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700573 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800574
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100575 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700576 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700577 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800578
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100579 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700580 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700581 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800582}
583
Steven Thomasbb374322020-04-28 22:47:16 -0700584TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800585 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700586 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
587 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800588
589 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
590 LayerRequirement{.weight = 1.0f}};
591 auto& lr1 = layers[0];
592 auto& lr2 = layers[1];
593
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100594 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100596 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800597 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700598 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700599 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800600
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100601 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800602 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100603 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800604 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700605 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700606 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800607
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100608 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800609 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100610 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800611 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700612 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700613 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800614}
615
Steven Thomasbb374322020-04-28 22:47:16 -0700616TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800617 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700618 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
619 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800620
621 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
622 LayerRequirement{.weight = 1.0f}};
623 auto& lr1 = layers[0];
624 auto& lr2 = layers[1];
625
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100626 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100629 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800630 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800631 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700632 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700633 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800634
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100635 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800637 lr1.name = "24Hz ExplicitExactOrMultiple";
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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr2.name = "60Hz ExplicitDefault";
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(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800657 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800658 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700659 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700660 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800661
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100662 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800663 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
664 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100665 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800666 lr2.vote = LayerVoteType::ExplicitDefault;
667 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700668 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700669 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800670
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100671 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800672 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800673 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100674 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800675 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800676 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700677 EXPECT_EQ(mExpected90Config,
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::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800682 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100683 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800684 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800685 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700686 EXPECT_EQ(mExpected72Config,
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::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800691 lr1.name = "24Hz ExplicitExactOrMultiple";
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::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800700 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100701 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800702 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800703 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700704 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700705 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800706}
707
rnlee3bd610662021-06-23 16:27:57 -0700708TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
709 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
710 auto refreshRateConfigs =
711 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
712 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
713
714 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
715 LayerRequirement{.weight = 1.0f}};
716 auto& lr1 = layers[0];
717 auto& lr2 = layers[1];
718
719 lr1.desiredRefreshRate = Fps(24.0f);
720 lr1.vote = LayerVoteType::ExplicitDefault;
721 lr1.name = "24Hz ExplicitDefault";
722 lr2.desiredRefreshRate = Fps(60.0f);
723 lr2.vote = LayerVoteType::Heuristic;
724 lr2.name = "60Hz Heuristic";
725 EXPECT_EQ(mExpected120Config,
726 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
727
728 lr1.desiredRefreshRate = Fps(24.0f);
729 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
730 lr1.name = "24Hz ExplicitExactOrMultiple";
731 lr2.desiredRefreshRate = Fps(60.0f);
732 lr2.vote = LayerVoteType::Heuristic;
733 lr2.name = "60Hz Heuristic";
734 EXPECT_EQ(mExpected60Config,
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::ExplicitDefault;
742 lr2.name = "60Hz ExplicitDefault";
743 EXPECT_EQ(mExpected72Config,
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(90.0f);
750 lr2.vote = LayerVoteType::Heuristic;
751 lr2.name = "90Hz Heuristic";
752 EXPECT_EQ(mExpected90Config,
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::ExplicitDefault;
760 lr2.name = "90Hz Heuristic";
761 EXPECT_EQ(mExpected72Config,
762 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
763
764 lr1.desiredRefreshRate = Fps(24.0f);
765 lr1.vote = LayerVoteType::ExplicitDefault;
766 lr1.name = "24Hz ExplicitDefault";
767 lr2.desiredRefreshRate = Fps(90.0f);
768 lr2.vote = LayerVoteType::Heuristic;
769 lr2.name = "90Hz Heuristic";
770 EXPECT_EQ(mExpected90Config,
771 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
772
773 lr1.desiredRefreshRate = Fps(24.0f);
774 lr1.vote = LayerVoteType::Heuristic;
775 lr1.name = "24Hz Heuristic";
776 lr2.desiredRefreshRate = Fps(90.0f);
777 lr2.vote = LayerVoteType::ExplicitDefault;
778 lr2.name = "90Hz ExplicitDefault";
779 EXPECT_EQ(mExpected72Config,
780 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
781
782 lr1.desiredRefreshRate = Fps(24.0f);
783 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
784 lr1.name = "24Hz ExplicitExactOrMultiple";
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::ExplicitDefault;
793 lr1.name = "24Hz ExplicitDefault";
794 lr2.desiredRefreshRate = Fps(90.0f);
795 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
796 lr2.name = "90Hz ExplicitExactOrMultiple";
797 EXPECT_EQ(mExpected90Config,
798 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
799}
800
Steven Thomasbb374322020-04-28 22:47:16 -0700801TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800802 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 std::make_unique<RefreshRateConfigs>(m30_60Device,
804 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
806 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
807 auto& lr = layers[0];
808
809 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700811 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812
813 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700814 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700815 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100817 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800818 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700819 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700820 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100822 lr.desiredRefreshRate = Fps(60.0f);
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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700827 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700828 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100830 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700831 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700832 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800833
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100834 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700835 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700836 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800837}
838
Steven Thomasbb374322020-04-28 22:47:16 -0700839TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700841 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
842 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800843
844 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
845 auto& lr = layers[0];
846
847 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800848 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700850 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800851
852 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800853 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700854 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700855 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800856
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100857 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800859 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700860 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700861 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100863 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800864 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700865 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700866 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700867 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700868 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800869
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100870 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800871 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700872 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700874 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700875 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800876
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100877 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800878 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700879 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700880 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700881 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700882 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800883
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100884 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700886 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700887 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700888 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700889 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800890
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100891 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800892 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
893 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700894 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700895 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700896 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700897 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800898}
899
Steven Thomasbb374322020-04-28 22:47:16 -0700900TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800901 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700902 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
903 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800904
905 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
906 LayerRequirement{.weight = 1.0f}};
907 auto& lr1 = layers[0];
908 auto& lr2 = layers[1];
909
910 lr1.vote = LayerVoteType::Min;
911 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700912 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700913 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800914
915 lr1.vote = LayerVoteType::Min;
916 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100917 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700918 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700919 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800920
921 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800922 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100923 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700924 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700925 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800926
927 lr1.vote = LayerVoteType::Max;
928 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100929 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700930 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700931 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800932
933 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800934 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100935 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700936 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700937 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800938
939 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100940 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800941 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100942 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700943 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700944 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800945
946 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100947 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800948 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100949 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700950 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700951 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800952}
953
Steven Thomasbb374322020-04-28 22:47:16 -0700954TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800955 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700956 std::make_unique<RefreshRateConfigs>(m60_90Device,
957 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800958
959 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
960 auto& lr = layers[0];
961
Ady Abraham71c437d2020-01-31 15:56:57 -0800962 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800963 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100964 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800965 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700966 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700967 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800968 }
969}
970
rnlee3bd610662021-06-23 16:27:57 -0700971TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
972 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
973 auto refreshRateConfigs =
974 std::make_unique<RefreshRateConfigs>(m60_120Device,
975 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
976
977 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
978 auto& lr = layers[0];
979
980 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
981 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
982 lr.desiredRefreshRate = Fps(fps);
983 const auto& refreshRate =
984 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
985 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
986 }
987}
988
Steven Thomasbb374322020-04-28 22:47:16 -0700989TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800990 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700991 std::make_unique<RefreshRateConfigs>(m60_90Device,
992 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800993
994 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
995 LayerRequirement{.weight = 1.0f}};
996 auto& lr1 = layers[0];
997 auto& lr2 = layers[1];
998
999 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001000 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001001 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001002 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001003 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001004 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001005
1006 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001007 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001008 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001009 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001010 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001011 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001012
1013 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001014 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001015 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001016 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001017 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001018 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001019}
1020
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001021TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001022 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1023 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1024 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1025 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1026 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001027}
1028
Steven Thomasbb374322020-04-28 22:47:16 -07001029TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001030 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001031 std::make_unique<RefreshRateConfigs>(m60_90Device,
1032 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001033
1034 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1035 auto& lr = layers[0];
1036
Ady Abraham71c437d2020-01-31 15:56:57 -08001037 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001038 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001039 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001040 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001041 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001042 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001043 }
1044}
1045
Steven Thomasbb374322020-04-28 22:47:16 -07001046TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001047 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001048 std::make_unique<RefreshRateConfigs>(m60_90Device,
1049 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001050
1051 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1052 LayerRequirement{.weight = 1.0f}};
1053 auto& lr1 = layers[0];
1054 auto& lr2 = layers[1];
1055
1056 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001057 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001058 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001059 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001060 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001061 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001062 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001063 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001064
1065 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001066 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001067 lr1.name = "60Hz ExplicitExactOrMultiple";
1068 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001069 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001070 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001071 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001072 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -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";
Ady Abraham34702102020-02-10 14:12:05 -08001077 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001078 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001079 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001081
1082 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001083 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001084 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001085 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001086 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001087 lr2.name = "90Hz Heuristic";
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::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001095 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001096 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001097 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001098}
1099
1100TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001101 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001102 std::make_unique<RefreshRateConfigs>(m60_90Device,
1103 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001104
1105 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1106 LayerRequirement{.weight = 1.0f}};
1107 auto& lr1 = layers[0];
1108 auto& lr2 = layers[1];
1109
1110 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001111 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001112 lr1.name = "60Hz ExplicitExactOrMultiple";
1113 lr2.vote = LayerVoteType::NoVote;
1114 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001115 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001116 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001117
1118 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001119 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001120 lr1.name = "60Hz ExplicitExactOrMultiple";
1121 lr2.vote = LayerVoteType::NoVote;
1122 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001123 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001124 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001125
1126 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001127 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001128 lr1.name = "60Hz ExplicitExactOrMultiple";
1129 lr2.vote = LayerVoteType::Max;
1130 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001131 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001132 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001133
1134 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001135 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001136 lr1.name = "60Hz ExplicitExactOrMultiple";
1137 lr2.vote = LayerVoteType::Max;
1138 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001139 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001140 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001141
1142 // The other layer starts to provide buffers
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::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001147 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001148 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001149 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001150 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001151}
1152
1153TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001154 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001155 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001156 std::make_unique<RefreshRateConfigs>(m60_90Device,
1157 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001158
Ady Abrahamdfd62162020-06-10 16:11:56 -07001159 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1160 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001161
Ady Abrahamdfd62162020-06-10 16:11:56 -07001162 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1163 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001164
1165 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1166 LayerRequirement{.weight = 1.0f}};
1167 auto& lr1 = layers[0];
1168 auto& lr2 = layers[1];
1169
1170 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001171 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001172 lr1.name = "60Hz ExplicitExactOrMultiple";
1173 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001174 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001175 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001176 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1177 &consideredSignals);
1178 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001179
1180 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001181 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001182 lr1.name = "60Hz ExplicitExactOrMultiple";
1183 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001184 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001185 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001186 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1187 &consideredSignals);
1188 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001189
1190 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001191 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001192 lr1.name = "60Hz ExplicitExactOrMultiple";
1193 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001194 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001195 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001196 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1197 &consideredSignals);
1198 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001199
1200 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001201 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001202 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001203 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001204 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001205 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001206 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1207 &consideredSignals);
1208 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001209}
1210
Steven Thomasbb374322020-04-28 22:47:16 -07001211TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001212 auto refreshRateConfigs =
1213 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1214 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001215
1216 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1217 auto& lr = layers[0];
1218
1219 // Prepare a table with the vote and the expected refresh rate
1220 const std::vector<std::pair<float, float>> testCases = {
1221 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1222
1223 {100, 90}, {90, 90}, {89, 90},
1224
1225 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1226
1227 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1228
1229 {55, 90}, {50, 90}, {45, 90},
1230
1231 {42, 120}, {40, 120}, {39, 120},
1232
1233 {37, 72}, {36, 72}, {35, 72},
1234
1235 {30, 60},
1236 };
1237
1238 for (const auto& test : testCases) {
1239 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001240 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001241
1242 std::stringstream ss;
1243 ss << "ExplicitDefault " << test.first << " fps";
1244 lr.name = ss.str();
1245
1246 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001247 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001248 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanove3e68ad2021-08-16 18:20:21 +02001249 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1250 << " but it was " << refreshRate.getFps();
1251 }
1252}
1253
1254TEST_F(RefreshRateConfigsTest,
1255 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1256 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1257 auto& lr = layers[0];
1258
1259 // Test that 23.976 will choose 24 if 23.976 is not supported
1260 {
1261 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1262 mConfig30Frac, mConfig60, mConfig60Frac};
1263 auto refreshRateConfigs =
1264 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1265
1266 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1267 lr.desiredRefreshRate = Fps(23.976f);
1268 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1269 EXPECT_EQ(HWC_CONFIG_ID_24,
1270 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1271 .getModeId());
1272 }
1273
1274 // Test that 24 will choose 23.976 if 24 is not supported
1275 {
1276 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1277 mConfig30Frac, mConfig60, mConfig60Frac};
1278 auto refreshRateConfigs =
1279 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1280 lr.desiredRefreshRate = Fps(24.f);
1281 lr.name = "ExplicitExactOrMultiple 24 fps";
1282 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1283 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1284 .getModeId());
1285 }
1286
1287 // Test that 29.97 will prefer 59.94 over 60 and 30
1288 {
1289 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1290 mConfig30, mConfig60, mConfig60Frac};
1291 auto refreshRateConfigs =
1292 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1293 lr.desiredRefreshRate = Fps(29.97f);
1294 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1295 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1296 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1297 .getModeId());
1298 }
1299}
1300
1301TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1302 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1303 auto& lr = layers[0];
1304
1305 // Test that voting for supported refresh rate will select this refresh rate
1306 {
1307 auto refreshRateConfigs =
1308 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1309 /*currentConfigId=*/HWC_CONFIG_ID_60);
1310
1311 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1312 lr.vote = LayerVoteType::ExplicitExact;
1313 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1314 std::stringstream ss;
1315 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1316 lr.name = ss.str();
1317
1318 auto selecteRefreshRate =
1319 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1320
1321 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1322 << "Expecting " << lr.desiredRefreshRate << " but it was "
1323 << selecteRefreshRate.getFps();
1324 }
1325 }
1326
1327 // Test that 23.976 will choose 24 if 23.976 is not supported
1328 {
1329 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1330 mConfig30Frac, mConfig60, mConfig60Frac};
1331 auto refreshRateConfigs =
1332 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1333 lr.vote = LayerVoteType::ExplicitExact;
1334 lr.desiredRefreshRate = Fps(23.976f);
1335 lr.name = "ExplicitExact 23.976 fps";
1336 EXPECT_EQ(HWC_CONFIG_ID_24,
1337 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1338 .getModeId());
1339 }
1340
1341 // Test that 24 will choose 23.976 if 24 is not supported
1342 {
1343 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1344 mConfig30Frac, mConfig60, mConfig60Frac};
1345 auto refreshRateConfigs =
1346 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1347 lr.desiredRefreshRate = Fps(24.f);
1348 lr.name = "ExplicitExact 24 fps";
1349 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1350 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1351 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001352 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001353}
1354
Alec Mouri11232a22020-05-14 18:06:25 -07001355TEST_F(RefreshRateConfigsTest,
1356 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1357 auto refreshRateConfigs =
1358 std::make_unique<RefreshRateConfigs>(m60_90Device,
1359 /*currentConfigId=*/HWC_CONFIG_ID_90);
1360
1361 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001362 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001363 0);
1364
1365 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1366 auto& lr = layers[0];
1367
Ady Abrahamdfd62162020-06-10 16:11:56 -07001368 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001369 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001370 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001371 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001372 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001373 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001374 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1375 &consideredSignals));
1376 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001377}
1378
1379TEST_F(RefreshRateConfigsTest,
1380 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1381 auto refreshRateConfigs =
1382 std::make_unique<RefreshRateConfigs>(m60_90Device,
1383 /*currentConfigId=*/HWC_CONFIG_ID_60);
1384
1385 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001386 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001387 0);
1388
1389 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1390 auto& lr = layers[0];
1391
Alec Mouri11232a22020-05-14 18:06:25 -07001392 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001393 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001394 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001395 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001396 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001397 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001398}
1399
1400TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001401 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001402 auto refreshRateConfigs =
1403 std::make_unique<RefreshRateConfigs>(m60_90Device,
1404 /*currentConfigId=*/HWC_CONFIG_ID_90);
1405
1406 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001407 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001408 0);
1409
Ady Abrahamdfd62162020-06-10 16:11:56 -07001410 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001411 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001412 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1413 &consideredSignals));
1414 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001415
1416 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1417 auto& lr = layers[0];
1418
1419 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001420 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001421 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001422 lr.focused = false;
1423 EXPECT_EQ(mExpected90Config,
1424 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1425
1426 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001427 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001428 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001429
1430 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001431 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001432 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001433 lr.focused = false;
1434 EXPECT_EQ(mExpected90Config,
1435 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1436
1437 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001438 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001439 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001440
1441 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001442 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001443 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001444 lr.focused = false;
1445 EXPECT_EQ(mExpected90Config,
1446 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1447
1448 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001449 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001450 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001451
1452 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001453 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001454 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001455 lr.focused = false;
1456 EXPECT_EQ(mExpected90Config,
1457 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1458
1459 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001460 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001461 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001462
1463 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001464 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001465 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001466 lr.focused = false;
1467 EXPECT_EQ(mExpected90Config,
1468 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1469
1470 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001471 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001473}
1474
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001475TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001476 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001477 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1478 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001479
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001480 // The default policy doesn't allow group switching. Verify that no
1481 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001482 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1483 auto& layer = layers[0];
1484 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001485 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001486 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001487 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001488 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001489
Steven Thomasd4071902020-03-24 16:02:53 -07001490 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001491 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001492 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001493}
Steven Thomasd4071902020-03-24 16:02:53 -07001494
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001495TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1496 auto refreshRateConfigs =
1497 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1498 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001499 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001500 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001501 policy.allowGroupSwitching = true;
1502 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001503
1504 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1505 auto& layer = layers[0];
1506 layer.vote = LayerVoteType::ExplicitDefault;
1507 layer.desiredRefreshRate = Fps(90.0f);
1508 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1509 layer.name = "90Hz ExplicitDefault";
1510 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001511 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001512 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001513 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001514}
1515
1516TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1517 auto refreshRateConfigs =
1518 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1519 /*currentConfigId=*/HWC_CONFIG_ID_60);
1520 RefreshRateConfigs::Policy policy;
1521 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1522 policy.allowGroupSwitching = true;
1523 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001524
1525 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001526 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1527 auto& layer = layers[0];
1528 layer.vote = LayerVoteType::ExplicitDefault;
1529 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001530 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001531 layer.name = "90Hz ExplicitDefault";
1532 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001533 ASSERT_EQ(HWC_CONFIG_ID_60,
1534 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001535 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001536}
1537
1538TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1539 auto refreshRateConfigs =
1540 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1541 /*currentConfigId=*/HWC_CONFIG_ID_60);
1542 RefreshRateConfigs::Policy policy;
1543 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1544 policy.allowGroupSwitching = true;
1545 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1546
1547 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001548
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001549 // 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 +01001550 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1551 auto& layer = layers[0];
1552 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001553 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001554 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001555 layer.name = "60Hz ExplicitDefault";
1556 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001557 ASSERT_EQ(HWC_CONFIG_ID_90,
1558 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001559 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001560}
1561
1562TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1563 auto refreshRateConfigs =
1564 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1565 /*currentConfigId=*/HWC_CONFIG_ID_60);
1566 RefreshRateConfigs::Policy policy;
1567 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1568 policy.allowGroupSwitching = true;
1569 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1570
1571 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001572
1573 // Verify that if the current config is in another group and there are no layers with
1574 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001575
1576 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1577 auto& layer = layers[0];
1578 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001579 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001580 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001581 layer.name = "60Hz ExplicitDefault";
1582 layer.focused = true;
1583
Marin Shalamanov46084422020-10-13 12:33:42 +02001584 ASSERT_EQ(HWC_CONFIG_ID_60,
1585 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001586 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001587}
1588
1589TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1590 auto refreshRateConfigs =
1591 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1592 /*currentConfigId=*/HWC_CONFIG_ID_60);
1593 RefreshRateConfigs::Policy policy;
1594 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1595 policy.allowGroupSwitching = true;
1596 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1597
1598 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001599
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001600 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001601 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001602 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1603 layers[0].vote = LayerVoteType::ExplicitDefault;
1604 layers[0].desiredRefreshRate = Fps(60.0f);
1605 layers[0].seamlessness = Seamlessness::OnlySeamless;
1606 layers[0].name = "60Hz ExplicitDefault";
1607 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001608
1609 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001610 layers[1].vote = LayerVoteType::ExplicitDefault;
1611 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1612 layers[1].desiredRefreshRate = Fps(90.0f);
1613 layers[1].name = "90Hz ExplicitDefault";
1614 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001615
1616 ASSERT_EQ(HWC_CONFIG_ID_90,
1617 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001618 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001619}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001620
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001621TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001622 auto refreshRateConfigs =
1623 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1624 /*currentConfigId=*/HWC_CONFIG_ID_60);
1625 RefreshRateConfigs::Policy policy;
1626 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1627 policy.allowGroupSwitching = true;
1628 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1629
1630 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001631
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001632 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1633 // seamlessness=Default can't change the mode group back to the group of the default
1634 // mode.
1635 // For example, this may happen when a video playback requests and gets a seamed switch,
1636 // but another layer (with default seamlessness) starts animating. The animating layer
1637 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001638 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001639 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001640 layers[0].desiredRefreshRate = Fps(60.0f);
1641 layers[0].focused = true;
1642 layers[0].vote = LayerVoteType::ExplicitDefault;
1643 layers[0].name = "60Hz ExplicitDefault";
1644
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001645 layers.push_back(LayerRequirement{.weight = 0.1f});
1646 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1647 layers[1].desiredRefreshRate = Fps(90.0f);
1648 layers[1].focused = true;
1649 layers[1].vote = LayerVoteType::ExplicitDefault;
1650 layers[1].name = "90Hz ExplicitDefault";
1651
Marin Shalamanov46084422020-10-13 12:33:42 +02001652 ASSERT_EQ(HWC_CONFIG_ID_90,
1653 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001654 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001655}
1656
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001657TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1658 auto refreshRateConfigs =
1659 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1660 /*currentConfigId=*/HWC_CONFIG_ID_60);
1661 RefreshRateConfigs::Policy policy;
1662 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1663 policy.allowGroupSwitching = true;
1664 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1665
1666 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1667
1668 // Layer with seamlessness=Default can change the mode group if there's a not
1669 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1670 // when in split screen mode the user switches between the two visible applications.
1671 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1672 layers[0].seamlessness = Seamlessness::Default;
1673 layers[0].desiredRefreshRate = Fps(60.0f);
1674 layers[0].focused = true;
1675 layers[0].vote = LayerVoteType::ExplicitDefault;
1676 layers[0].name = "60Hz ExplicitDefault";
1677
1678 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001679 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1680 layers[1].desiredRefreshRate = Fps(90.0f);
1681 layers[1].focused = false;
1682 layers[1].vote = LayerVoteType::ExplicitDefault;
1683 layers[1].name = "90Hz ExplicitDefault";
1684
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001685 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001686 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1687 .getModeId());
1688}
1689
1690TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1691 auto refreshRateConfigs =
1692 std::make_unique<RefreshRateConfigs>(m30_60Device,
1693 /*currentConfigId=*/HWC_CONFIG_ID_60);
1694
1695 // Allow group switching.
1696 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001697 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001698 policy.allowGroupSwitching = true;
1699 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1700
1701 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1702 auto& layer = layers[0];
1703 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001704 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001705 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001706 layer.name = "60Hz ExplicitExactOrMultiple";
1707 layer.focused = true;
1708
1709 ASSERT_EQ(HWC_CONFIG_ID_60,
1710 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001711 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001712
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001713 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001714 ASSERT_EQ(HWC_CONFIG_ID_120,
1715 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001716 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001717}
1718
1719TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1720 auto refreshRateConfigs =
1721 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1722 /*currentConfigId=*/HWC_CONFIG_ID_60);
1723
1724 // Allow group switching.
1725 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001726 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001727 policy.allowGroupSwitching = true;
1728 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1729
1730 auto layers = std::vector<
1731 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1732 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001733 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001734 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001735 .weight = 0.5f,
1736 .focused = false},
1737 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1738 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001739 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001740 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001741 .weight = 1.0f,
1742 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001743
1744 ASSERT_EQ(HWC_CONFIG_ID_50,
1745 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001746 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001747
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001748 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001749 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001750 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001751
1752 ASSERT_EQ(HWC_CONFIG_ID_25,
1753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001754 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001755}
1756
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001757TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1758 auto refreshRateConfigs =
1759 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1760 /*currentConfigId=*/HWC_CONFIG_ID_90);
1761
1762 // Allow group switching.
1763 RefreshRateConfigs::Policy policy;
1764 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1765 policy.allowGroupSwitching = true;
1766 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1767
1768 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1769 .vote = LayerVoteType::Min,
1770 .weight = 1.f,
1771 .focused = true}};
1772
1773 ASSERT_EQ(HWC_CONFIG_ID_90,
1774 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1775 .getModeId());
1776}
1777
Steven Thomasf734df42020-04-13 21:09:28 -07001778TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1779 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001780 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001781 /*currentConfigId=*/HWC_CONFIG_ID_60);
1782
1783 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1784 layers[0].name = "Test layer";
1785
Steven Thomasbb374322020-04-28 22:47:16 -07001786 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001787 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001788 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001789 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001790 layers[0].vote = voteType;
1791 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001792 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001793 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001794 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001795 };
1796
1797 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001798 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001799 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001800 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001801 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001802 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001803 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1804 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1805 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1806 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1807 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1808 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001809
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001810 // Layers not focused are not allowed to override primary config
1811 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001812 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001813 /*focused=*/false));
1814 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001815 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001816 /*focused=*/false));
1817
Steven Thomasf734df42020-04-13 21:09:28 -07001818 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001819 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001820 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1821 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001822 EXPECT_EQ(HWC_CONFIG_ID_90,
1823 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001824 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001825 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001826
1827 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001828 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001829 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001830 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1831 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1832 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1833 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1834 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1835 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001836}
1837
Steven Thomasbb374322020-04-28 22:47:16 -07001838TEST_F(RefreshRateConfigsTest, idle) {
1839 auto refreshRateConfigs =
1840 std::make_unique<RefreshRateConfigs>(m60_90Device,
1841 /*currentConfigId=*/HWC_CONFIG_ID_60);
1842
1843 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1844 layers[0].name = "Test layer";
1845
Marin Shalamanov23c44202020-12-22 19:09:20 +01001846 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001847 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001848 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001849 RefreshRateConfigs::GlobalSignals consideredSignals;
1850 const auto configId =
1851 refreshRateConfigs
1852 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1853 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001854 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001855 // Refresh rate will be chosen by either touch state or idle state
1856 EXPECT_EQ(!touchActive, consideredSignals.idle);
1857 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001858 };
1859
1860 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001861 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001862 0);
1863
1864 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001865 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1866 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1867 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1868 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1869 EXPECT_EQ(HWC_CONFIG_ID_90,
1870 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1871 EXPECT_EQ(HWC_CONFIG_ID_90,
1872 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001873
1874 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001875 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001876 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001877 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001878
1879 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001880 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001881 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1882 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1883 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1884 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1885 EXPECT_EQ(HWC_CONFIG_ID_60,
1886 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1887 EXPECT_EQ(HWC_CONFIG_ID_60,
1888 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001889
1890 // Idle should be applied rather than the current config when there are no layers.
1891 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001892 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001893 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001894}
1895
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001896TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1897 auto refreshRateConfigs =
1898 std::make_unique<RefreshRateConfigs>(m60_90Device,
1899 /*currentConfigId=*/HWC_CONFIG_ID_60);
1900
1901 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001902 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1903 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001904 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001905 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001906 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001907 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001908 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001909 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001910 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001911 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001912 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001913 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001914 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001915 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001916 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001917 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001918 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1919 }
1920}
1921
1922TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001923 auto refreshRateConfigs =
1924 std::make_unique<RefreshRateConfigs>(m60_90Device,
1925 /*currentConfigId=*/HWC_CONFIG_ID_60);
1926
1927 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001928 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001929 const RefreshRate& expected;
1930 };
1931
1932 /* clang-format off */
1933 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001934 {Fps(24.0f), mExpected60Config},
1935 {Fps(30.0f), mExpected60Config},
1936 {Fps(45.0f), mExpected90Config},
1937 {Fps(60.0f), mExpected60Config},
1938 {Fps(72.0f), mExpected90Config},
1939 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001940 };
1941 /* clang-format on */
1942
1943 // Make sure the test tests all the known frame rate
1944 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001945 const auto equal =
1946 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1947 knownFrameRatesExpectations.begin(),
1948 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001949 EXPECT_TRUE(equal);
1950
1951 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1952 auto& layer = layers[0];
1953 layer.vote = LayerVoteType::Heuristic;
1954 for (const auto& expectedRate : knownFrameRatesExpectations) {
1955 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001956 const auto& refreshRate =
1957 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001958 EXPECT_EQ(expectedRate.expected, refreshRate);
1959 }
1960}
1961
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001962TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1963 auto refreshRateConfigs =
1964 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1965 /*currentConfigId=*/HWC_CONFIG_ID_60);
1966
1967 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1968 LayerRequirement{.weight = 0.5f}};
1969 auto& explicitExactLayer = layers[0];
1970 auto& explicitExactOrMultipleLayer = layers[1];
1971
1972 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1973 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1974 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1975
1976 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1977 explicitExactLayer.name = "ExplicitExact";
1978 explicitExactLayer.desiredRefreshRate = Fps(30);
1979
1980 EXPECT_EQ(mExpected30Config,
1981 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1982 EXPECT_EQ(mExpected30Config,
1983 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1984
1985 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1986 explicitExactLayer.desiredRefreshRate = Fps(60);
1987 EXPECT_EQ(mExpected60Config,
1988 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1989
1990 explicitExactLayer.desiredRefreshRate = Fps(72);
1991 EXPECT_EQ(mExpected72Config,
1992 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1993
1994 explicitExactLayer.desiredRefreshRate = Fps(90);
1995 EXPECT_EQ(mExpected90Config,
1996 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1997
1998 explicitExactLayer.desiredRefreshRate = Fps(120);
1999 EXPECT_EQ(mExpected120Config,
2000 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2001}
2002
2003TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002004 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002005 auto refreshRateConfigs =
2006 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002007 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002008
2009 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2010 LayerRequirement{.weight = 0.5f}};
2011 auto& explicitExactLayer = layers[0];
2012 auto& explicitExactOrMultipleLayer = layers[1];
2013
2014 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2015 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2016 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2017
2018 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2019 explicitExactLayer.name = "ExplicitExact";
2020 explicitExactLayer.desiredRefreshRate = Fps(30);
2021
2022 EXPECT_EQ(mExpected60Config,
2023 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2024 EXPECT_EQ(mExpected120Config,
2025 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2026
2027 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2028 explicitExactLayer.desiredRefreshRate = Fps(60);
2029 EXPECT_EQ(mExpected120Config,
2030 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2031
2032 explicitExactLayer.desiredRefreshRate = Fps(72);
2033 EXPECT_EQ(mExpected72Config,
2034 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2035
2036 explicitExactLayer.desiredRefreshRate = Fps(90);
2037 EXPECT_EQ(mExpected90Config,
2038 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2039
2040 explicitExactLayer.desiredRefreshRate = Fps(120);
2041 EXPECT_EQ(mExpected120Config,
2042 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2043}
2044
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002045TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2046 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2047
2048 auto refreshRateConfigs =
2049 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2050 /*currentConfigId=*/HWC_CONFIG_ID_60);
2051
2052 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2053 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2054 LayerRequirement>(),
2055 .globalSignals = {.touch = true,
2056 .idle = true},
2057 .outSignalsConsidered =
2058 {.touch = true,
2059 .idle = false},
2060 .resultingBestRefreshRate =
2061 createRefreshRate(
2062 mConfig90)});
2063
2064 EXPECT_EQ(createRefreshRate(mConfig90),
2065 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2066 {.touch = true, .idle = true}));
2067
2068 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2069 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2070 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2071 LayerRequirement>(),
2072 .globalSignals = {.touch = true,
2073 .idle = true},
2074 .outSignalsConsidered =
2075 cachedSignalsConsidered,
2076 .resultingBestRefreshRate =
2077 createRefreshRate(
2078 mConfig30)});
2079
2080 GlobalSignals signalsConsidered;
2081 EXPECT_EQ(createRefreshRate(mConfig30),
2082 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2083 {.touch = true, .idle = true},
2084 &signalsConsidered));
2085
2086 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2087}
2088
2089TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2090 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2091
2092 auto refreshRateConfigs =
2093 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2094 /*currentConfigId=*/HWC_CONFIG_ID_60);
2095 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2096
2097 GlobalSignals globalSignals{.touch = true, .idle = true};
2098 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2099 LayerRequirement{.weight = 0.5f}};
2100 const auto lastResult =
2101 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2102 /* outSignalsConsidered */ nullptr);
2103
2104 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2105
2106 ASSERT_TRUE(lastInvocation.has_value());
2107 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2108 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2109 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2110
2111 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2112 // to getBestRefreshRate()
2113 GlobalSignals detaultSignals;
2114 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2115}
2116
Ady Abraham5e4e9832021-06-14 13:40:56 -07002117TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002118 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002119 auto refreshRateConfigs =
2120 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002121 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002122
2123 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2124 LayerRequirement{.weight = 0.5f}};
2125 auto& explicitExactLayer = layers[0];
2126 auto& explicitExactOrMultipleLayer = layers[1];
2127
2128 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2129 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2130 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2131
2132 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2133 explicitExactLayer.name = "ExplicitExact";
2134 explicitExactLayer.desiredRefreshRate = Fps(30);
2135
2136 EXPECT_EQ(mExpected60Config,
2137 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2138 EXPECT_EQ(mExpected120Config,
2139 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2140
2141 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2142
2143 EXPECT_EQ(mExpected60Config,
2144 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2145 EXPECT_EQ(mExpected60Config,
2146 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2147}
2148
Marin Shalamanove3e68ad2021-08-16 18:20:21 +02002149TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2150 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2151 auto refreshRateConfigs =
2152 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2153 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2154
2155 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2156 LayerRequirement{.weight = 0.5f}};
2157 auto& explicitDefaultLayer = layers[0];
2158 auto& explicitExactOrMultipleLayer = layers[1];
2159
2160 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2161 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2162 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2163
2164 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2165 explicitDefaultLayer.name = "ExplicitDefault";
2166 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2167
2168 EXPECT_EQ(mExpected60Config,
2169 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2170}
2171
Ady Abrahamb3512452021-09-16 15:58:52 -07002172// b/190578904
2173TEST_F(RefreshRateConfigsTest, getBestRefreshRate_deviceWithCloseRefreshRates) {
2174 constexpr int kMinRefreshRate = 10;
2175 constexpr int kMaxRefreshRate = 240;
2176
2177 DisplayModes displayModes;
2178 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2179 constexpr int32_t kGroup = 0;
2180 const auto refreshRate = Fps(static_cast<float>(fps));
2181 displayModes.push_back(
2182 createDisplayMode(DisplayModeId(fps), kGroup, refreshRate.getPeriodNsecs()));
2183 }
2184
2185 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
2186 auto refreshRateConfigs =
2187 std::make_unique<RefreshRateConfigs>(displayModes,
2188 /*currentConfigId=*/displayModes[0]->getId());
2189
2190 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2191 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2192 layers[0].desiredRefreshRate = fps;
2193 layers[0].vote = vote;
2194 EXPECT_EQ(fps.getIntValue(),
2195 refreshRateConfigs->getBestRefreshRate(layers, globalSignals)
2196 .getFps()
2197 .getIntValue())
2198 << "Failed for " << RefreshRateConfigs::layerVoteTypeString(vote);
2199 };
2200
2201 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2202 const auto refreshRate = Fps(static_cast<float>(fps));
2203 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2204 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2205 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2206 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2207 }
2208}
2209
Ana Krulecb9afd792020-06-11 13:16:15 -07002210TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2211 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2212 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2213 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2214}
2215
2216TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2217 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2218
2219 auto refreshRateConfigs =
2220 std::make_unique<RefreshRateConfigs>(m60_90Device,
2221 /*currentConfigId=*/HWC_CONFIG_ID_90);
2222 // SetPolicy(60, 90), current 90Hz => TurnOn.
2223 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2224
2225 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002226 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2227 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002228 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2229
Ady Abrahama91605e2021-06-18 11:41:47 -07002230 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002231 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2232 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002233 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002234
2235 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002236 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2237 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002238 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2239}
2240
TreeHugger Robot758ab612021-06-22 19:17:29 +00002241TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2242 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2243
2244 // Tests with 120Hz
2245 auto refreshRateConfigs =
2246 std::make_unique<RefreshRateConfigs>(m60_120Device,
2247 /*currentConfigId=*/HWC_CONFIG_ID_120);
2248 // SetPolicy(0, 60), current 60Hz => TurnOn.
2249 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2250 0);
2251 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2252
2253 // SetPolicy(60, 60), current 60Hz => TurnOff.
2254 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2255 0);
2256 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2257
2258 // SetPolicy(60, 120), current 60Hz => TurnOn.
2259 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2260 0);
2261 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2262
2263 // SetPolicy(120, 120), current 120Hz => TurnOff.
2264 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2265 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2266 0);
2267 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2268}
2269
Ady Abraham5cc2e262021-03-25 13:09:17 -07002270TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002271 auto refreshRateConfigs =
2272 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2273 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002274
2275 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002276 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2277 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002278
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002279 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002280 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2281 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002282
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002283 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002284 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2285 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002286
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002287 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002288 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2289 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002290
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002291 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002292 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2293 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002294
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002295 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002296 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2297 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Ady Abraham3819b9f2021-08-20 10:11:31 -07002298
2299 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2300 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2301 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2302 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002303}
2304
Marin Shalamanove3e68ad2021-08-16 18:20:21 +02002305TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2306 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2307 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2308
2309 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2310 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2311
2312 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2313 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2314
2315 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2316 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2317
2318 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2319 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2320
2321 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2322 for (auto refreshRate : refreshRates) {
2323 EXPECT_FALSE(
2324 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2325 }
2326
2327 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2328 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2329 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
2330}
2331
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002332TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002333 auto refreshRateConfigs =
2334 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2335 HWC_CONFIG_ID_120);
2336
2337 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002338 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2339 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002340}
2341
2342TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002343 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002344 auto refreshRateConfigs =
2345 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002346 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002347
2348 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2349 layers[0].name = "Test layer";
2350 layers[0].ownerUid = 1234;
2351 layers[0].desiredRefreshRate = Fps(60.0f);
2352 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002353 auto frameRateOverrides =
2354 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002355 ASSERT_EQ(1, frameRateOverrides.size());
2356 ASSERT_EQ(1, frameRateOverrides.count(1234));
2357 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2358
2359 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002360 frameRateOverrides =
2361 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002362 ASSERT_EQ(1, frameRateOverrides.size());
2363 ASSERT_EQ(1, frameRateOverrides.count(1234));
2364 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2365
2366 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002367 frameRateOverrides =
2368 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002369 ASSERT_TRUE(frameRateOverrides.empty());
2370
2371 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002372 frameRateOverrides =
2373 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002374 ASSERT_TRUE(frameRateOverrides.empty());
2375
2376 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002377 frameRateOverrides =
2378 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002379 ASSERT_TRUE(frameRateOverrides.empty());
2380
2381 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002382 frameRateOverrides =
2383 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002384 ASSERT_TRUE(frameRateOverrides.empty());
2385}
2386
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002387TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002388 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002389 auto refreshRateConfigs =
2390 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002391 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002392
2393 auto layers = std::vector<LayerRequirement>{
2394 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2395 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2396 };
2397
2398 layers[0].name = "Test layer 1234";
2399 layers[0].desiredRefreshRate = Fps(60.0f);
2400 layers[0].vote = LayerVoteType::ExplicitDefault;
2401
2402 layers[1].name = "Test layer 5678";
2403 layers[1].desiredRefreshRate = Fps(30.0f);
2404 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002405 auto frameRateOverrides =
2406 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002407
2408 ASSERT_EQ(2, frameRateOverrides.size());
2409 ASSERT_EQ(1, frameRateOverrides.count(1234));
2410 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2411 ASSERT_EQ(1, frameRateOverrides.count(5678));
2412 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2413
2414 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002415 frameRateOverrides =
2416 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002417 ASSERT_EQ(1, frameRateOverrides.size());
2418 ASSERT_EQ(1, frameRateOverrides.count(1234));
2419 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2420
2421 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002422 frameRateOverrides =
2423 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2424 ASSERT_TRUE(frameRateOverrides.empty());
2425}
2426
2427TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002428 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002429 auto refreshRateConfigs =
2430 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002431 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002432
2433 auto layers = std::vector<LayerRequirement>{
2434 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2435 };
2436
2437 layers[0].name = "Test layer";
2438 layers[0].desiredRefreshRate = Fps(60.0f);
2439 layers[0].vote = LayerVoteType::ExplicitDefault;
2440
2441 auto frameRateOverrides =
2442 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2443 ASSERT_EQ(1, frameRateOverrides.size());
2444 ASSERT_EQ(1, frameRateOverrides.count(1234));
2445 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2446
2447 frameRateOverrides =
2448 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2449 ASSERT_EQ(1, frameRateOverrides.size());
2450 ASSERT_EQ(1, frameRateOverrides.count(1234));
2451 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2452
2453 layers[0].vote = LayerVoteType::ExplicitExact;
2454 frameRateOverrides =
2455 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2456 ASSERT_EQ(1, frameRateOverrides.size());
2457 ASSERT_EQ(1, frameRateOverrides.count(1234));
2458 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2459
2460 frameRateOverrides =
2461 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2462 ASSERT_EQ(1, frameRateOverrides.size());
2463 ASSERT_EQ(1, frameRateOverrides.count(1234));
2464 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2465
2466 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2467 frameRateOverrides =
2468 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2469 ASSERT_EQ(1, frameRateOverrides.size());
2470 ASSERT_EQ(1, frameRateOverrides.count(1234));
2471 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2472
2473 frameRateOverrides =
2474 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002475 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002476}
2477
Alec Mouri0a1cc962019-03-14 12:33:02 -07002478} // namespace
2479} // namespace scheduler
2480} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002481
2482// TODO(b/129481165): remove the #pragma below and fix conversion issues
2483#pragma clang diagnostic pop // ignored "-Wextra"