blob: 407f6903ecd125fd85fa016985997e4119f042ca [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Ady Abraham6fb599b2020-03-05 13:48:22 -080030#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "DisplayHardware/HWC2.h"
32#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
36namespace android {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010037
Alec Mouri0a1cc962019-03-14 12:33:02 -070038namespace scheduler {
39
Peiyong Line9d809e2020-04-14 13:10:48 -070040namespace hal = android::hardware::graphics::composer::hal;
41
Alec Mouri0a1cc962019-03-14 12:33:02 -070042using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080043using LayerVoteType = RefreshRateConfigs::LayerVoteType;
44using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070045
46class RefreshRateConfigsTest : public testing::Test {
47protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020048 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
49
Alec Mouri0a1cc962019-03-14 12:33:02 -070050 RefreshRateConfigsTest();
51 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070052
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020053 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
54 return {displayMode->getId(), displayMode, displayMode->getFps(),
55 RefreshRate::ConstructorTag(0)};
56 }
57
Marin Shalamanove8a663d2020-11-24 17:48:00 +010058 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070059 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
60 }
61
Marin Shalamanove8a663d2020-11-24 17:48:00 +010062 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070063 return refreshRateConfigs.mKnownFrameRates;
64 }
65
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010066 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
67 std::lock_guard lock(refreshRateConfigs.mLock);
68 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
69 }
70
71 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
72 std::lock_guard lock(refreshRateConfigs.mLock);
73 return *refreshRateConfigs.mMinSupportedRefreshRate;
74 }
75
76 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
77 std::lock_guard lock(refreshRateConfigs.mLock);
78 return *refreshRateConfigs.mMaxSupportedRefreshRate;
79 }
80
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020081 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
82 const GetBestRefreshRateInvocation& invocation) {
83 std::lock_guard lock(refreshRateConfigs.mLock);
84 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
85 GetBestRefreshRateInvocation(invocation));
86 }
87
88 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
89 const RefreshRateConfigs& refreshRateConfigs) {
90 std::lock_guard lock(refreshRateConfigs.mLock);
91 return refreshRateConfigs.lastBestRefreshRateInvocation;
92 }
93
Ady Abrahamabc27602020-04-08 17:20:29 -070094 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010095 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
96 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
97 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
98 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
99 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
100 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
101 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Marin Shalamanove09237f2021-08-16 18:20:21 +0200102 static inline const DisplayModeId HWC_CONFIG_ID_24 = DisplayModeId(7);
103 static inline const DisplayModeId HWC_CONFIG_ID_24_FRAC = DisplayModeId(8);
104 static inline const DisplayModeId HWC_CONFIG_ID_30_FRAC = DisplayModeId(9);
105 static inline const DisplayModeId HWC_CONFIG_ID_60_FRAC = DisplayModeId(10);
Ady Abrahamabc27602020-04-08 17:20:29 -0700106
107 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100108 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
Marin Shalamanove09237f2021-08-16 18:20:21 +0200109 DisplayModePtr mConfig60Frac =
110 createDisplayMode(HWC_CONFIG_ID_60_FRAC, 0, Fps(59.94f).getPeriodNsecs());
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100111 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100112 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100113 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100114 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100115 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
116 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100117 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100118 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
119 DisplayModePtr mConfig120 =
120 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100121 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100122 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
123 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100124 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100125 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanove09237f2021-08-16 18:20:21 +0200126 DisplayModePtr mConfig30Frac =
127 createDisplayMode(HWC_CONFIG_ID_30_FRAC, 0, Fps(29.97f).getPeriodNsecs());
128 DisplayModePtr mConfig25 = createDisplayMode(HWC_CONFIG_ID_25, 0, Fps(25.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100129 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100130 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
131 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Marin Shalamanove09237f2021-08-16 18:20:21 +0200132 DisplayModePtr mConfig24 = createDisplayMode(HWC_CONFIG_ID_24, 0, Fps(24.0f).getPeriodNsecs());
133 DisplayModePtr mConfig24Frac =
134 createDisplayMode(HWC_CONFIG_ID_24_FRAC, 0, Fps(23.976f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700135
136 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200137 // The positions of the configs in the arrays below MUST match their IDs. For example,
138 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100139 DisplayModes m60OnlyConfigDevice = {mConfig60};
140 DisplayModes m60_90Device = {mConfig60, mConfig90};
141 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
142 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
143 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
144 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
145 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
146 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
147 mConfig120DifferentGroup, mConfig30};
148 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
149 mConfig30};
150 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
151 mConfig120DifferentGroup, mConfig30};
152 DisplayModes m25_30_50_60Device = {mConfig60,
153 mConfig90,
154 mConfig72DifferentGroup,
155 mConfig120DifferentGroup,
156 mConfig30DifferentGroup,
157 mConfig25DifferentGroup,
158 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700159 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700160
Marin Shalamanove09237f2021-08-16 18:20:21 +0200161 // This is a typical TV configuration.
162 DisplayModes m24_25_30_50_60WithFracDevice = {mConfig24, mConfig24Frac, mConfig25,
163 mConfig30, mConfig30Frac, mConfig50,
164 mConfig60, mConfig60Frac};
165
Ady Abrahamabc27602020-04-08 17:20:29 -0700166 // Expected RefreshRate objects
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100167 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, Fps(60),
Ady Abrahamabc27602020-04-08 17:20:29 -0700168 RefreshRate::ConstructorTag(0)};
169 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100170 createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
171 Fps(60), RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100172 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700173 RefreshRate::ConstructorTag(0)};
174 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100175 Fps(90), RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700176 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100177 mConfig90DifferentResolution, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700178 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100179 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, Fps(72.0f),
Ady Abrahamabc27602020-04-08 17:20:29 -0700180 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100181 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, Fps(30),
Ady Abrahamabc27602020-04-08 17:20:29 -0700182 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100183 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, Fps(120),
Ady Abrahamabc27602020-04-08 17:20:29 -0700184 RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700185
Ady Abrahamabc27602020-04-08 17:20:29 -0700186private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100187 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
188 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700189};
190
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100191using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700192
Alec Mouri0a1cc962019-03-14 12:33:02 -0700193RefreshRateConfigsTest::RefreshRateConfigsTest() {
194 const ::testing::TestInfo* const test_info =
195 ::testing::UnitTest::GetInstance()->current_test_info();
196 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
197}
198
199RefreshRateConfigsTest::~RefreshRateConfigsTest() {
200 const ::testing::TestInfo* const test_info =
201 ::testing::UnitTest::GetInstance()->current_test_info();
202 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
203}
204
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100205DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
206 int64_t vsyncPeriod, ui::Size resolution) {
207 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
208 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700209 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100210 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100211 .setHeight(resolution.height)
212 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700213 .build();
214}
215
Alec Mouri0a1cc962019-03-14 12:33:02 -0700216namespace {
217/* ------------------------------------------------------------------------
218 * Test cases
219 */
Ady Abraham2139f732019-11-13 18:56:40 -0800220TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700221 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700222 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
223 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700224}
225
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100226TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100227 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700228 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
229 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100230 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100231 0);
232 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
233 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100234}
235
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700236TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700237 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700238 std::make_unique<RefreshRateConfigs>(m60_90Device,
239 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700240
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100241 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
242 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700243
Ady Abrahamabc27602020-04-08 17:20:29 -0700244 ASSERT_EQ(mExpected60Config, minRate);
245 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100247 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800248 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800249 ASSERT_EQ(minRateByPolicy, minRate);
250 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700251}
Ady Abraham2139f732019-11-13 18:56:40 -0800252
253TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800254 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700255 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
256 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800257
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100258 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
259 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
260 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800261 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800262
Ady Abrahamabc27602020-04-08 17:20:29 -0700263 ASSERT_EQ(mExpected60Config, minRate);
264 ASSERT_EQ(mExpected60Config, minRate60);
265 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800266
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100267 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
268 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100269 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800270
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100271 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800272 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800273
Ady Abrahamabc27602020-04-08 17:20:29 -0700274 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
275 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
276 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
277}
278
279TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
280 auto refreshRateConfigs =
281 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
282 /*currentConfigId=*/HWC_CONFIG_ID_60);
283
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100284 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
285 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
286 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700287 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
288
289 ASSERT_EQ(mExpected60Config, minRate);
290 ASSERT_EQ(mExpected60Config, minRate60);
291 ASSERT_EQ(mExpected60Config, performanceRate60);
292
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100293 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
294 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100295 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700296
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100297 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700298 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
299
300 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
301 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
302 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800303}
304
305TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800306 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700307 std::make_unique<RefreshRateConfigs>(m60_90Device,
308 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800309
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100310 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
311 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800312
Ady Abrahamabc27602020-04-08 17:20:29 -0700313 ASSERT_EQ(mExpected60Config, minRate);
314 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800315
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100316 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
317 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800318
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100319 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
320 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700321 ASSERT_EQ(mExpected60Config, minRate60);
322 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800323}
324
325TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800326 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700327 std::make_unique<RefreshRateConfigs>(m60_90Device,
328 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800329 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100330 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100331 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800332 }
333
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100334 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800335 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100336 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100337 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800338 }
339
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100340 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
341 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800342 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100343 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100344 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800345 }
346}
347
Steven Thomasbb374322020-04-28 22:47:16 -0700348TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700349 auto refreshRateConfigs =
350 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
351 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800352
Steven Thomasdebafed2020-05-18 17:30:35 -0700353 // If there are no layers we select the default frame rate, which is the max of the primary
354 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800355 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700356 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700357 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800358
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100359 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
360 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700361 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700362 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800363}
364
Steven Thomasbb374322020-04-28 22:47:16 -0700365TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 std::make_unique<RefreshRateConfigs>(m60_90Device,
368 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
370 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
371 auto& lr = layers[0];
372
373 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800374 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700375 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700376 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800377
378 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800379 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700380 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700381 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800382
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100383 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800385 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700386 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700387 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800388
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100389 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800390 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700391 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700392 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800393
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100394 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800395 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700396 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700397 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100399 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800400 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700401 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700402 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100404 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800405 lr.name = "24Hz Heuristic";
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
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800409 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100410 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
411 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
413 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700414 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700415 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
417 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700418 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700419 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100421 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800422 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.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 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700435 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700436 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100438 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700439 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100442 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
443 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
444 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800445
446 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700447 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700448 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
450 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700451 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700452 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100454 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.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 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700468 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700469 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100471 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700472 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700473 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100475 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
476 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
477 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481
482 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700483 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700484 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800485
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100486 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800487 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700496 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700497 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800498
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100499 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700500 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700501 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800502
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100503 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700504 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700505 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800506}
507
rnlee3bd610662021-06-23 16:27:57 -0700508TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
509 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
510 auto refreshRateConfigs =
511 std::make_unique<RefreshRateConfigs>(m60_90Device,
512 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
513
514 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
515 auto& lr = layers[0];
516
517 lr.vote = LayerVoteType::Min;
518 lr.name = "Min";
519 EXPECT_EQ(mExpected60Config,
520 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
521
522 lr.vote = LayerVoteType::Max;
523 lr.name = "Max";
524 EXPECT_EQ(mExpected90Config,
525 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
526
527 lr.desiredRefreshRate = Fps(90.0f);
528 lr.vote = LayerVoteType::Heuristic;
529 lr.name = "90Hz Heuristic";
530 EXPECT_EQ(mExpected90Config,
531 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
532
533 lr.desiredRefreshRate = Fps(60.0f);
534 lr.name = "60Hz Heuristic";
535 EXPECT_EQ(mExpected60Config,
536 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
537
538 lr.desiredRefreshRate = Fps(45.0f);
539 lr.name = "45Hz Heuristic";
540 EXPECT_EQ(mExpected90Config,
541 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
542
543 lr.desiredRefreshRate = Fps(30.0f);
544 lr.name = "30Hz Heuristic";
545 EXPECT_EQ(mExpected60Config,
546 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
547
548 lr.desiredRefreshRate = Fps(24.0f);
549 lr.name = "24Hz Heuristic";
550 EXPECT_EQ(mExpected60Config,
551 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
552}
553
Steven Thomasbb374322020-04-28 22:47:16 -0700554TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700556 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
557 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800558
559 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
560 auto& lr = layers[0];
561
562 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700563 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700564 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800565
566 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700567 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700568 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800569
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100570 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800571 lr.vote = LayerVoteType::Heuristic;
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(60.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(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700580 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700581 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800582
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100583 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700584 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700585 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800586
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100587 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700588 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700589 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800590}
591
Steven Thomasbb374322020-04-28 22:47:16 -0700592TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800593 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700594 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
595 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800596
597 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
598 LayerRequirement{.weight = 1.0f}};
599 auto& lr1 = layers[0];
600 auto& lr2 = layers[1];
601
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100602 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800603 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100604 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800605 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700606 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700607 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800608
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100609 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800610 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100611 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800612 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700613 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700614 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800615
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100616 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800617 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100618 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800619 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700620 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700621 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800622}
623
Steven Thomasbb374322020-04-28 22:47:16 -0700624TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800625 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700626 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
627 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800628
629 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
630 LayerRequirement{.weight = 1.0f}};
631 auto& lr1 = layers[0];
632 auto& lr2 = layers[1];
633
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100634 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800635 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100637 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800638 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700640 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700641 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800642
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100643 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800644 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800645 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100646 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800647 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800648 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700649 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700650 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800651
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100652 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800653 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800654 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100655 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800656 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800657 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700658 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700659 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800660
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100661 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800662 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800663 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100664 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800665 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800666 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700667 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700668 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800669
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100670 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800671 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
672 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100673 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800674 lr2.vote = LayerVoteType::ExplicitDefault;
675 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700676 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700677 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800678
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100679 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800680 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800681 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100682 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800683 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800684 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700685 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700686 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800687
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100688 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800689 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800690 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100691 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800692 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800693 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700694 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700695 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800696
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100697 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800698 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800699 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100700 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800701 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800702 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700703 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700704 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800705
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100706 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800707 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800708 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100709 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800710 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800711 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700712 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700713 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800714}
715
rnlee3bd610662021-06-23 16:27:57 -0700716TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
717 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
718 auto refreshRateConfigs =
719 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
720 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
721
722 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
723 LayerRequirement{.weight = 1.0f}};
724 auto& lr1 = layers[0];
725 auto& lr2 = layers[1];
726
727 lr1.desiredRefreshRate = Fps(24.0f);
728 lr1.vote = LayerVoteType::ExplicitDefault;
729 lr1.name = "24Hz ExplicitDefault";
730 lr2.desiredRefreshRate = Fps(60.0f);
731 lr2.vote = LayerVoteType::Heuristic;
732 lr2.name = "60Hz Heuristic";
733 EXPECT_EQ(mExpected120Config,
734 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
735
736 lr1.desiredRefreshRate = Fps(24.0f);
737 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
738 lr1.name = "24Hz ExplicitExactOrMultiple";
739 lr2.desiredRefreshRate = Fps(60.0f);
740 lr2.vote = LayerVoteType::Heuristic;
741 lr2.name = "60Hz Heuristic";
742 EXPECT_EQ(mExpected60Config,
743 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
744
745 lr1.desiredRefreshRate = Fps(24.0f);
746 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
747 lr1.name = "24Hz ExplicitExactOrMultiple";
748 lr2.desiredRefreshRate = Fps(60.0f);
749 lr2.vote = LayerVoteType::ExplicitDefault;
750 lr2.name = "60Hz ExplicitDefault";
751 EXPECT_EQ(mExpected72Config,
752 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
753
754 lr1.desiredRefreshRate = Fps(24.0f);
755 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
756 lr1.name = "24Hz ExplicitExactOrMultiple";
757 lr2.desiredRefreshRate = Fps(90.0f);
758 lr2.vote = LayerVoteType::Heuristic;
759 lr2.name = "90Hz Heuristic";
760 EXPECT_EQ(mExpected90Config,
761 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
762
763 lr1.desiredRefreshRate = Fps(24.0f);
764 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
765 lr1.name = "24Hz ExplicitExactOrMultiple";
766 lr2.desiredRefreshRate = Fps(90.0f);
767 lr2.vote = LayerVoteType::ExplicitDefault;
768 lr2.name = "90Hz Heuristic";
769 EXPECT_EQ(mExpected72Config,
770 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
771
772 lr1.desiredRefreshRate = Fps(24.0f);
773 lr1.vote = LayerVoteType::ExplicitDefault;
774 lr1.name = "24Hz ExplicitDefault";
775 lr2.desiredRefreshRate = Fps(90.0f);
776 lr2.vote = LayerVoteType::Heuristic;
777 lr2.name = "90Hz Heuristic";
778 EXPECT_EQ(mExpected90Config,
779 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
780
781 lr1.desiredRefreshRate = Fps(24.0f);
782 lr1.vote = LayerVoteType::Heuristic;
783 lr1.name = "24Hz Heuristic";
784 lr2.desiredRefreshRate = Fps(90.0f);
785 lr2.vote = LayerVoteType::ExplicitDefault;
786 lr2.name = "90Hz ExplicitDefault";
787 EXPECT_EQ(mExpected72Config,
788 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
789
790 lr1.desiredRefreshRate = Fps(24.0f);
791 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
792 lr1.name = "24Hz ExplicitExactOrMultiple";
793 lr2.desiredRefreshRate = Fps(90.0f);
794 lr2.vote = LayerVoteType::ExplicitDefault;
795 lr2.name = "90Hz ExplicitDefault";
796 EXPECT_EQ(mExpected72Config,
797 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
798
799 lr1.desiredRefreshRate = Fps(24.0f);
800 lr1.vote = LayerVoteType::ExplicitDefault;
801 lr1.name = "24Hz ExplicitDefault";
802 lr2.desiredRefreshRate = Fps(90.0f);
803 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
804 lr2.name = "90Hz ExplicitExactOrMultiple";
805 EXPECT_EQ(mExpected90Config,
806 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
807}
808
Steven Thomasbb374322020-04-28 22:47:16 -0700809TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800810 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700811 std::make_unique<RefreshRateConfigs>(m30_60Device,
812 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813
814 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
815 auto& lr = layers[0];
816
817 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700818 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700819 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800820
821 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700822 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700823 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100825 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826 lr.vote = LayerVoteType::Heuristic;
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(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700831 EXPECT_EQ(mExpected60Config,
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(45.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
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100838 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700839 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700840 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100842 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700843 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700844 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845}
846
Steven Thomasbb374322020-04-28 22:47:16 -0700847TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800848 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
850 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800851
852 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
853 auto& lr = layers[0];
854
855 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800856 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700857 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700858 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800859
860 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800861 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700862 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700863 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800864
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100865 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800866 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800867 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700868 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700869 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800870
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100871 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800872 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700873 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700874 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700875 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700876 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800877
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100878 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800879 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700880 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700881 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700882 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700883 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100885 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800886 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700887 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700888 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700889 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700890 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800891
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100892 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800893 lr.name = "24Hz Heuristic";
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 Abraham4ccdcb42020-02-11 17:34:34 -0800898
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100899 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
901 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700902 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700903 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700904 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700905 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800906}
907
Steven Thomasbb374322020-04-28 22:47:16 -0700908TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800909 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700910 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
911 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800912
913 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
914 LayerRequirement{.weight = 1.0f}};
915 auto& lr1 = layers[0];
916 auto& lr2 = layers[1];
917
918 lr1.vote = LayerVoteType::Min;
919 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700920 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700921 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800922
923 lr1.vote = LayerVoteType::Min;
924 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100925 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700926 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700927 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800928
929 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800930 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100931 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700932 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700933 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800934
935 lr1.vote = LayerVoteType::Max;
936 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100937 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700938 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700939 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800940
941 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800942 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100943 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700944 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700945 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800946
947 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100948 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800949 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100950 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700951 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700952 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800953
954 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100955 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800956 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100957 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700958 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700959 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800960}
961
Steven Thomasbb374322020-04-28 22:47:16 -0700962TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800963 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700964 std::make_unique<RefreshRateConfigs>(m60_90Device,
965 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800966
967 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
968 auto& lr = layers[0];
969
Ady Abraham71c437d2020-01-31 15:56:57 -0800970 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800971 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100972 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800973 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700974 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700975 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800976 }
977}
978
rnlee3bd610662021-06-23 16:27:57 -0700979TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
980 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
981 auto refreshRateConfigs =
982 std::make_unique<RefreshRateConfigs>(m60_120Device,
983 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
984
985 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
986 auto& lr = layers[0];
987
988 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
989 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
990 lr.desiredRefreshRate = Fps(fps);
991 const auto& refreshRate =
992 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
993 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
994 }
995}
996
Steven Thomasbb374322020-04-28 22:47:16 -0700997TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800998 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700999 std::make_unique<RefreshRateConfigs>(m60_90Device,
1000 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -08001001
1002 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1003 LayerRequirement{.weight = 1.0f}};
1004 auto& lr1 = layers[0];
1005 auto& lr2 = layers[1];
1006
1007 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001008 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001009 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001010 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001011 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001012 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001013
1014 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001015 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001016 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001017 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001018 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001019 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001020
1021 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001022 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001023 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001024 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001025 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001026 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001027}
1028
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001029TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001030 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1031 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1032 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1033 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1034 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001035}
1036
Steven Thomasbb374322020-04-28 22:47:16 -07001037TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001038 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001039 std::make_unique<RefreshRateConfigs>(m60_90Device,
1040 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001041
1042 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1043 auto& lr = layers[0];
1044
Ady Abraham71c437d2020-01-31 15:56:57 -08001045 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001046 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001047 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001048 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001049 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001050 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001051 }
1052}
1053
Steven Thomasbb374322020-04-28 22:47:16 -07001054TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001055 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001056 std::make_unique<RefreshRateConfigs>(m60_90Device,
1057 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001058
1059 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1060 LayerRequirement{.weight = 1.0f}};
1061 auto& lr1 = layers[0];
1062 auto& lr2 = layers[1];
1063
1064 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001065 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001066 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001067 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001068 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001069 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001070 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001071 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001072
1073 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001074 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001075 lr1.name = "60Hz ExplicitExactOrMultiple";
1076 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001077 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001078 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001079 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001081
1082 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001083 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001084 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001085 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001086 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001087 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001088 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001089
1090 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001091 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001092 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001093 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001094 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001095 lr2.name = "90Hz Heuristic";
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 Abraham34702102020-02-10 14:12:05 -08001098
1099 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001100 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001101 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001102 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001103 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001104 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001105 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001106}
1107
1108TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001109 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001110 std::make_unique<RefreshRateConfigs>(m60_90Device,
1111 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001112
1113 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1114 LayerRequirement{.weight = 1.0f}};
1115 auto& lr1 = layers[0];
1116 auto& lr2 = layers[1];
1117
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(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001124 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .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::NoVote;
1130 lr2.name = "NoVote";
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 = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001141
1142 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001143 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001144 lr1.name = "60Hz ExplicitExactOrMultiple";
1145 lr2.vote = LayerVoteType::Max;
1146 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001147 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001148 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001149
1150 // The other layer starts to provide buffers
1151 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001152 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001153 lr1.name = "60Hz ExplicitExactOrMultiple";
1154 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001155 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001156 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001157 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001158 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001159}
1160
1161TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001162 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001163 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001164 std::make_unique<RefreshRateConfigs>(m60_90Device,
1165 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001166
Ady Abrahamdfd62162020-06-10 16:11:56 -07001167 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1168 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001169
Ady Abrahamdfd62162020-06-10 16:11:56 -07001170 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1171 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001172
1173 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1174 LayerRequirement{.weight = 1.0f}};
1175 auto& lr1 = layers[0];
1176 auto& lr2 = layers[1];
1177
1178 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001179 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001180 lr1.name = "60Hz ExplicitExactOrMultiple";
1181 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001182 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001183 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001184 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1185 &consideredSignals);
1186 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001187
1188 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001189 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001190 lr1.name = "60Hz ExplicitExactOrMultiple";
1191 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001192 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001193 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001194 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1195 &consideredSignals);
1196 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001197
1198 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001199 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001200 lr1.name = "60Hz ExplicitExactOrMultiple";
1201 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001202 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001203 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001204 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1205 &consideredSignals);
1206 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001207
1208 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001209 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001210 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001211 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001212 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001213 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001214 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1215 &consideredSignals);
1216 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001217}
1218
Steven Thomasbb374322020-04-28 22:47:16 -07001219TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001220 auto refreshRateConfigs =
1221 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1222 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001223
1224 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1225 auto& lr = layers[0];
1226
1227 // Prepare a table with the vote and the expected refresh rate
1228 const std::vector<std::pair<float, float>> testCases = {
1229 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1230
1231 {100, 90}, {90, 90}, {89, 90},
1232
1233 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1234
1235 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1236
1237 {55, 90}, {50, 90}, {45, 90},
1238
1239 {42, 120}, {40, 120}, {39, 120},
1240
1241 {37, 72}, {36, 72}, {35, 72},
1242
1243 {30, 60},
1244 };
1245
1246 for (const auto& test : testCases) {
1247 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001248 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001249
1250 std::stringstream ss;
1251 ss << "ExplicitDefault " << test.first << " fps";
1252 lr.name = ss.str();
1253
1254 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001255 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001256 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanove09237f2021-08-16 18:20:21 +02001257 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1258 << " but it was " << refreshRate.getFps();
1259 }
1260}
1261
1262TEST_F(RefreshRateConfigsTest,
1263 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1264 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1265 auto& lr = layers[0];
1266
1267 // Test that 23.976 will choose 24 if 23.976 is not supported
1268 {
1269 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1270 mConfig30Frac, mConfig60, mConfig60Frac};
1271 auto refreshRateConfigs =
1272 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1273
1274 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1275 lr.desiredRefreshRate = Fps(23.976f);
1276 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1277 EXPECT_EQ(HWC_CONFIG_ID_24,
1278 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1279 .getModeId());
1280 }
1281
1282 // Test that 24 will choose 23.976 if 24 is not supported
1283 {
1284 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1285 mConfig30Frac, mConfig60, mConfig60Frac};
1286 auto refreshRateConfigs =
1287 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1288 lr.desiredRefreshRate = Fps(24.f);
1289 lr.name = "ExplicitExactOrMultiple 24 fps";
1290 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1291 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1292 .getModeId());
1293 }
1294
1295 // Test that 29.97 will prefer 59.94 over 60 and 30
1296 {
1297 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1298 mConfig30, mConfig60, mConfig60Frac};
1299 auto refreshRateConfigs =
1300 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1301 lr.desiredRefreshRate = Fps(29.97f);
1302 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1303 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1304 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1305 .getModeId());
1306 }
1307}
1308
1309TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1310 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1311 auto& lr = layers[0];
1312
1313 // Test that voting for supported refresh rate will select this refresh rate
1314 {
1315 auto refreshRateConfigs =
1316 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1317 /*currentConfigId=*/HWC_CONFIG_ID_60);
1318
1319 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1320 lr.vote = LayerVoteType::ExplicitExact;
1321 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1322 std::stringstream ss;
1323 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1324 lr.name = ss.str();
1325
1326 auto selecteRefreshRate =
1327 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1328
1329 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1330 << "Expecting " << lr.desiredRefreshRate << " but it was "
1331 << selecteRefreshRate.getFps();
1332 }
1333 }
1334
1335 // Test that 23.976 will choose 24 if 23.976 is not supported
1336 {
1337 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1338 mConfig30Frac, mConfig60, mConfig60Frac};
1339 auto refreshRateConfigs =
1340 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1341 lr.vote = LayerVoteType::ExplicitExact;
1342 lr.desiredRefreshRate = Fps(23.976f);
1343 lr.name = "ExplicitExact 23.976 fps";
1344 EXPECT_EQ(HWC_CONFIG_ID_24,
1345 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1346 .getModeId());
1347 }
1348
1349 // Test that 24 will choose 23.976 if 24 is not supported
1350 {
1351 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1352 mConfig30Frac, mConfig60, mConfig60Frac};
1353 auto refreshRateConfigs =
1354 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1355 lr.desiredRefreshRate = Fps(24.f);
1356 lr.name = "ExplicitExact 24 fps";
1357 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1358 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1359 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001360 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001361}
1362
Alec Mouri11232a22020-05-14 18:06:25 -07001363TEST_F(RefreshRateConfigsTest,
1364 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1365 auto refreshRateConfigs =
1366 std::make_unique<RefreshRateConfigs>(m60_90Device,
1367 /*currentConfigId=*/HWC_CONFIG_ID_90);
1368
1369 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001370 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001371 0);
1372
1373 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1374 auto& lr = layers[0];
1375
Ady Abrahamdfd62162020-06-10 16:11:56 -07001376 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001377 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001378 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001379 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001380 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001381 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001382 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1383 &consideredSignals));
1384 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001385}
1386
1387TEST_F(RefreshRateConfigsTest,
1388 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1389 auto refreshRateConfigs =
1390 std::make_unique<RefreshRateConfigs>(m60_90Device,
1391 /*currentConfigId=*/HWC_CONFIG_ID_60);
1392
1393 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001394 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001395 0);
1396
1397 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1398 auto& lr = layers[0];
1399
Alec Mouri11232a22020-05-14 18:06:25 -07001400 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001401 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001402 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001403 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001404 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001405 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001406}
1407
1408TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001409 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001410 auto refreshRateConfigs =
1411 std::make_unique<RefreshRateConfigs>(m60_90Device,
1412 /*currentConfigId=*/HWC_CONFIG_ID_90);
1413
1414 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001415 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001416 0);
1417
Ady Abrahamdfd62162020-06-10 16:11:56 -07001418 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001419 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001420 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1421 &consideredSignals));
1422 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001423
1424 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1425 auto& lr = layers[0];
1426
1427 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001428 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001429 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001430 lr.focused = false;
1431 EXPECT_EQ(mExpected90Config,
1432 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1433
1434 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001435 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001436 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001437
1438 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001439 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001440 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001441 lr.focused = false;
1442 EXPECT_EQ(mExpected90Config,
1443 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1444
1445 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001446 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001447 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001448
1449 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001450 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001451 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001452 lr.focused = false;
1453 EXPECT_EQ(mExpected90Config,
1454 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1455
1456 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001457 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001458 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001459
1460 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001461 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001462 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001463 lr.focused = false;
1464 EXPECT_EQ(mExpected90Config,
1465 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1466
1467 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001468 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001469 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001470
1471 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001472 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001473 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001474 lr.focused = false;
1475 EXPECT_EQ(mExpected90Config,
1476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1477
1478 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001479 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001481}
1482
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001483TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001484 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001485 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1486 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001487
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001488 // The default policy doesn't allow group switching. Verify that no
1489 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001490 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1491 auto& layer = layers[0];
1492 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001493 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001494 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001495 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001496 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001497
Steven Thomasd4071902020-03-24 16:02:53 -07001498 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001499 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001500 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001501}
Steven Thomasd4071902020-03-24 16:02:53 -07001502
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001503TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1504 auto refreshRateConfigs =
1505 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1506 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001507 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001508 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001509 policy.allowGroupSwitching = true;
1510 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001511
1512 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1513 auto& layer = layers[0];
1514 layer.vote = LayerVoteType::ExplicitDefault;
1515 layer.desiredRefreshRate = Fps(90.0f);
1516 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1517 layer.name = "90Hz ExplicitDefault";
1518 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001519 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001520 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001521 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001522}
1523
1524TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1525 auto refreshRateConfigs =
1526 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1527 /*currentConfigId=*/HWC_CONFIG_ID_60);
1528 RefreshRateConfigs::Policy policy;
1529 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1530 policy.allowGroupSwitching = true;
1531 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001532
1533 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001534 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1535 auto& layer = layers[0];
1536 layer.vote = LayerVoteType::ExplicitDefault;
1537 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001538 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001539 layer.name = "90Hz ExplicitDefault";
1540 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001541 ASSERT_EQ(HWC_CONFIG_ID_60,
1542 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001543 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001544}
1545
1546TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1547 auto refreshRateConfigs =
1548 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1549 /*currentConfigId=*/HWC_CONFIG_ID_60);
1550 RefreshRateConfigs::Policy policy;
1551 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1552 policy.allowGroupSwitching = true;
1553 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1554
1555 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001556
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001557 // 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 +01001558 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1559 auto& layer = layers[0];
1560 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001561 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001562 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001563 layer.name = "60Hz ExplicitDefault";
1564 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001565 ASSERT_EQ(HWC_CONFIG_ID_90,
1566 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001567 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001568}
1569
1570TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1571 auto refreshRateConfigs =
1572 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1573 /*currentConfigId=*/HWC_CONFIG_ID_60);
1574 RefreshRateConfigs::Policy policy;
1575 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1576 policy.allowGroupSwitching = true;
1577 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1578
1579 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001580
1581 // Verify that if the current config is in another group and there are no layers with
1582 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001583
1584 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1585 auto& layer = layers[0];
1586 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001587 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001588 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001589 layer.name = "60Hz ExplicitDefault";
1590 layer.focused = true;
1591
Marin Shalamanov46084422020-10-13 12:33:42 +02001592 ASSERT_EQ(HWC_CONFIG_ID_60,
1593 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001594 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001595}
1596
1597TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1598 auto refreshRateConfigs =
1599 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1600 /*currentConfigId=*/HWC_CONFIG_ID_60);
1601 RefreshRateConfigs::Policy policy;
1602 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1603 policy.allowGroupSwitching = true;
1604 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1605
1606 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001607
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001608 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001609 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001610 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1611 layers[0].vote = LayerVoteType::ExplicitDefault;
1612 layers[0].desiredRefreshRate = Fps(60.0f);
1613 layers[0].seamlessness = Seamlessness::OnlySeamless;
1614 layers[0].name = "60Hz ExplicitDefault";
1615 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001616
1617 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001618 layers[1].vote = LayerVoteType::ExplicitDefault;
1619 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1620 layers[1].desiredRefreshRate = Fps(90.0f);
1621 layers[1].name = "90Hz ExplicitDefault";
1622 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001623
1624 ASSERT_EQ(HWC_CONFIG_ID_90,
1625 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001626 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001627}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001628
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001629TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001630 auto refreshRateConfigs =
1631 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1632 /*currentConfigId=*/HWC_CONFIG_ID_60);
1633 RefreshRateConfigs::Policy policy;
1634 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1635 policy.allowGroupSwitching = true;
1636 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1637
1638 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001639
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001640 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1641 // seamlessness=Default can't change the mode group back to the group of the default
1642 // mode.
1643 // For example, this may happen when a video playback requests and gets a seamed switch,
1644 // but another layer (with default seamlessness) starts animating. The animating layer
1645 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001646 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001647 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001648 layers[0].desiredRefreshRate = Fps(60.0f);
1649 layers[0].focused = true;
1650 layers[0].vote = LayerVoteType::ExplicitDefault;
1651 layers[0].name = "60Hz ExplicitDefault";
1652
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001653 layers.push_back(LayerRequirement{.weight = 0.1f});
1654 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1655 layers[1].desiredRefreshRate = Fps(90.0f);
1656 layers[1].focused = true;
1657 layers[1].vote = LayerVoteType::ExplicitDefault;
1658 layers[1].name = "90Hz ExplicitDefault";
1659
Marin Shalamanov46084422020-10-13 12:33:42 +02001660 ASSERT_EQ(HWC_CONFIG_ID_90,
1661 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001662 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001663}
1664
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001665TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1666 auto refreshRateConfigs =
1667 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1668 /*currentConfigId=*/HWC_CONFIG_ID_60);
1669 RefreshRateConfigs::Policy policy;
1670 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1671 policy.allowGroupSwitching = true;
1672 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1673
1674 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1675
1676 // Layer with seamlessness=Default can change the mode group if there's a not
1677 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1678 // when in split screen mode the user switches between the two visible applications.
1679 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1680 layers[0].seamlessness = Seamlessness::Default;
1681 layers[0].desiredRefreshRate = Fps(60.0f);
1682 layers[0].focused = true;
1683 layers[0].vote = LayerVoteType::ExplicitDefault;
1684 layers[0].name = "60Hz ExplicitDefault";
1685
1686 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001687 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1688 layers[1].desiredRefreshRate = Fps(90.0f);
1689 layers[1].focused = false;
1690 layers[1].vote = LayerVoteType::ExplicitDefault;
1691 layers[1].name = "90Hz ExplicitDefault";
1692
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001693 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001694 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1695 .getModeId());
1696}
1697
1698TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1699 auto refreshRateConfigs =
1700 std::make_unique<RefreshRateConfigs>(m30_60Device,
1701 /*currentConfigId=*/HWC_CONFIG_ID_60);
1702
1703 // Allow group switching.
1704 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001705 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001706 policy.allowGroupSwitching = true;
1707 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1708
1709 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1710 auto& layer = layers[0];
1711 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001712 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001713 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001714 layer.name = "60Hz ExplicitExactOrMultiple";
1715 layer.focused = true;
1716
1717 ASSERT_EQ(HWC_CONFIG_ID_60,
1718 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001719 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001720
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001721 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001722 ASSERT_EQ(HWC_CONFIG_ID_120,
1723 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001724 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001725}
1726
1727TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1728 auto refreshRateConfigs =
1729 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1730 /*currentConfigId=*/HWC_CONFIG_ID_60);
1731
1732 // Allow group switching.
1733 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001734 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001735 policy.allowGroupSwitching = true;
1736 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1737
1738 auto layers = std::vector<
1739 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1740 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001741 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001742 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001743 .weight = 0.5f,
1744 .focused = false},
1745 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1746 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001747 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001748 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001749 .weight = 1.0f,
1750 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001751
1752 ASSERT_EQ(HWC_CONFIG_ID_50,
1753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001754 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001755
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001756 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001757 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001758 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001759
1760 ASSERT_EQ(HWC_CONFIG_ID_25,
1761 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001762 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001763}
1764
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001765TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1766 auto refreshRateConfigs =
1767 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1768 /*currentConfigId=*/HWC_CONFIG_ID_90);
1769
1770 // Allow group switching.
1771 RefreshRateConfigs::Policy policy;
1772 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1773 policy.allowGroupSwitching = true;
1774 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1775
1776 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1777 .vote = LayerVoteType::Min,
1778 .weight = 1.f,
1779 .focused = true}};
1780
1781 ASSERT_EQ(HWC_CONFIG_ID_90,
1782 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1783 .getModeId());
1784}
1785
Steven Thomasf734df42020-04-13 21:09:28 -07001786TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1787 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001788 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001789 /*currentConfigId=*/HWC_CONFIG_ID_60);
1790
1791 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1792 layers[0].name = "Test layer";
1793
Steven Thomasbb374322020-04-28 22:47:16 -07001794 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001795 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001796 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001797 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001798 layers[0].vote = voteType;
1799 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001800 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001801 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001802 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001803 };
1804
1805 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001806 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001807 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001808 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001809 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001810 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001811 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1812 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1813 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1814 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1815 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1816 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001817
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001818 // Layers not focused are not allowed to override primary config
1819 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001820 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001821 /*focused=*/false));
1822 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001823 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001824 /*focused=*/false));
1825
Steven Thomasf734df42020-04-13 21:09:28 -07001826 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001827 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001828 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1829 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001830 EXPECT_EQ(HWC_CONFIG_ID_90,
1831 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001832 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001833 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001834
1835 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001836 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001837 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001838 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1839 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1840 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1841 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1842 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1843 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001844}
1845
Steven Thomasbb374322020-04-28 22:47:16 -07001846TEST_F(RefreshRateConfigsTest, idle) {
1847 auto refreshRateConfigs =
1848 std::make_unique<RefreshRateConfigs>(m60_90Device,
1849 /*currentConfigId=*/HWC_CONFIG_ID_60);
1850
1851 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1852 layers[0].name = "Test layer";
1853
Marin Shalamanov23c44202020-12-22 19:09:20 +01001854 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001855 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001856 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001857 RefreshRateConfigs::GlobalSignals consideredSignals;
1858 const auto configId =
1859 refreshRateConfigs
1860 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1861 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001862 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001863 // Refresh rate will be chosen by either touch state or idle state
1864 EXPECT_EQ(!touchActive, consideredSignals.idle);
1865 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001866 };
1867
1868 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001869 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001870 0);
1871
1872 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001873 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1874 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1875 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1876 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1877 EXPECT_EQ(HWC_CONFIG_ID_90,
1878 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1879 EXPECT_EQ(HWC_CONFIG_ID_90,
1880 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001881
1882 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001883 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001884 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001885 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001886
1887 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001888 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001889 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1890 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1891 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1892 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1893 EXPECT_EQ(HWC_CONFIG_ID_60,
1894 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1895 EXPECT_EQ(HWC_CONFIG_ID_60,
1896 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001897
1898 // Idle should be applied rather than the current config when there are no layers.
1899 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001900 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001901 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001902}
1903
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001904TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1905 auto refreshRateConfigs =
1906 std::make_unique<RefreshRateConfigs>(m60_90Device,
1907 /*currentConfigId=*/HWC_CONFIG_ID_60);
1908
1909 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001910 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1911 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001912 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001913 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001914 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001915 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001916 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001917 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001918 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001919 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001920 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001921 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001922 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001923 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001924 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001925 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001926 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1927 }
1928}
1929
1930TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001931 auto refreshRateConfigs =
1932 std::make_unique<RefreshRateConfigs>(m60_90Device,
1933 /*currentConfigId=*/HWC_CONFIG_ID_60);
1934
1935 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001936 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001937 const RefreshRate& expected;
1938 };
1939
1940 /* clang-format off */
1941 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001942 {Fps(24.0f), mExpected60Config},
1943 {Fps(30.0f), mExpected60Config},
1944 {Fps(45.0f), mExpected90Config},
1945 {Fps(60.0f), mExpected60Config},
1946 {Fps(72.0f), mExpected90Config},
1947 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001948 };
1949 /* clang-format on */
1950
1951 // Make sure the test tests all the known frame rate
1952 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001953 const auto equal =
1954 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1955 knownFrameRatesExpectations.begin(),
1956 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001957 EXPECT_TRUE(equal);
1958
1959 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1960 auto& layer = layers[0];
1961 layer.vote = LayerVoteType::Heuristic;
1962 for (const auto& expectedRate : knownFrameRatesExpectations) {
1963 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001964 const auto& refreshRate =
1965 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001966 EXPECT_EQ(expectedRate.expected, refreshRate);
1967 }
1968}
1969
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001970TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1971 auto refreshRateConfigs =
1972 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1973 /*currentConfigId=*/HWC_CONFIG_ID_60);
1974
1975 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1976 LayerRequirement{.weight = 0.5f}};
1977 auto& explicitExactLayer = layers[0];
1978 auto& explicitExactOrMultipleLayer = layers[1];
1979
1980 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1981 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1982 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1983
1984 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1985 explicitExactLayer.name = "ExplicitExact";
1986 explicitExactLayer.desiredRefreshRate = Fps(30);
1987
1988 EXPECT_EQ(mExpected30Config,
1989 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1990 EXPECT_EQ(mExpected30Config,
1991 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1992
1993 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1994 explicitExactLayer.desiredRefreshRate = Fps(60);
1995 EXPECT_EQ(mExpected60Config,
1996 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1997
1998 explicitExactLayer.desiredRefreshRate = Fps(72);
1999 EXPECT_EQ(mExpected72Config,
2000 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2001
2002 explicitExactLayer.desiredRefreshRate = Fps(90);
2003 EXPECT_EQ(mExpected90Config,
2004 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2005
2006 explicitExactLayer.desiredRefreshRate = Fps(120);
2007 EXPECT_EQ(mExpected120Config,
2008 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2009}
2010
2011TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002012 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002013 auto refreshRateConfigs =
2014 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002015 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002016
2017 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2018 LayerRequirement{.weight = 0.5f}};
2019 auto& explicitExactLayer = layers[0];
2020 auto& explicitExactOrMultipleLayer = layers[1];
2021
2022 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2023 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2024 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2025
2026 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2027 explicitExactLayer.name = "ExplicitExact";
2028 explicitExactLayer.desiredRefreshRate = Fps(30);
2029
2030 EXPECT_EQ(mExpected60Config,
2031 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2032 EXPECT_EQ(mExpected120Config,
2033 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2034
2035 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2036 explicitExactLayer.desiredRefreshRate = Fps(60);
2037 EXPECT_EQ(mExpected120Config,
2038 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2039
2040 explicitExactLayer.desiredRefreshRate = Fps(72);
2041 EXPECT_EQ(mExpected72Config,
2042 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2043
2044 explicitExactLayer.desiredRefreshRate = Fps(90);
2045 EXPECT_EQ(mExpected90Config,
2046 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2047
2048 explicitExactLayer.desiredRefreshRate = Fps(120);
2049 EXPECT_EQ(mExpected120Config,
2050 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2051}
2052
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002053TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2054 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2055
2056 auto refreshRateConfigs =
2057 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2058 /*currentConfigId=*/HWC_CONFIG_ID_60);
2059
2060 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2061 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2062 LayerRequirement>(),
2063 .globalSignals = {.touch = true,
2064 .idle = true},
2065 .outSignalsConsidered =
2066 {.touch = true,
2067 .idle = false},
2068 .resultingBestRefreshRate =
2069 createRefreshRate(
2070 mConfig90)});
2071
2072 EXPECT_EQ(createRefreshRate(mConfig90),
2073 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2074 {.touch = true, .idle = true}));
2075
2076 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2077 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2078 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2079 LayerRequirement>(),
2080 .globalSignals = {.touch = true,
2081 .idle = true},
2082 .outSignalsConsidered =
2083 cachedSignalsConsidered,
2084 .resultingBestRefreshRate =
2085 createRefreshRate(
2086 mConfig30)});
2087
2088 GlobalSignals signalsConsidered;
2089 EXPECT_EQ(createRefreshRate(mConfig30),
2090 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2091 {.touch = true, .idle = true},
2092 &signalsConsidered));
2093
2094 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2095}
2096
2097TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2098 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2099
2100 auto refreshRateConfigs =
2101 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2102 /*currentConfigId=*/HWC_CONFIG_ID_60);
2103 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2104
2105 GlobalSignals globalSignals{.touch = true, .idle = true};
2106 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2107 LayerRequirement{.weight = 0.5f}};
2108 const auto lastResult =
2109 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2110 /* outSignalsConsidered */ nullptr);
2111
2112 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2113
2114 ASSERT_TRUE(lastInvocation.has_value());
2115 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2116 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2117 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2118
2119 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2120 // to getBestRefreshRate()
2121 GlobalSignals detaultSignals;
2122 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2123}
2124
Ady Abraham5e4e9832021-06-14 13:40:56 -07002125TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002126 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002127 auto refreshRateConfigs =
2128 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002129 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002130
2131 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2132 LayerRequirement{.weight = 0.5f}};
2133 auto& explicitExactLayer = layers[0];
2134 auto& explicitExactOrMultipleLayer = layers[1];
2135
2136 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2137 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2138 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2139
2140 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2141 explicitExactLayer.name = "ExplicitExact";
2142 explicitExactLayer.desiredRefreshRate = Fps(30);
2143
2144 EXPECT_EQ(mExpected60Config,
2145 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2146 EXPECT_EQ(mExpected120Config,
2147 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2148
2149 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2150
2151 EXPECT_EQ(mExpected60Config,
2152 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2153 EXPECT_EQ(mExpected60Config,
2154 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2155}
2156
Marin Shalamanove09237f2021-08-16 18:20:21 +02002157TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2158 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2159 auto refreshRateConfigs =
2160 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2161 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2162
2163 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2164 LayerRequirement{.weight = 0.5f}};
2165 auto& explicitDefaultLayer = layers[0];
2166 auto& explicitExactOrMultipleLayer = layers[1];
2167
2168 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2169 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2170 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2171
2172 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2173 explicitDefaultLayer.name = "ExplicitDefault";
2174 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2175
2176 EXPECT_EQ(mExpected60Config,
2177 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2178}
2179
Ana Krulecb9afd792020-06-11 13:16:15 -07002180TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2181 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2182 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2183 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2184}
2185
2186TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2187 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2188
2189 auto refreshRateConfigs =
2190 std::make_unique<RefreshRateConfigs>(m60_90Device,
2191 /*currentConfigId=*/HWC_CONFIG_ID_90);
2192 // SetPolicy(60, 90), current 90Hz => TurnOn.
2193 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2194
2195 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002196 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2197 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002198 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2199
Ady Abrahama91605e2021-06-18 11:41:47 -07002200 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002201 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2202 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002203 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002204
2205 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002206 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2207 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002208 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2209}
2210
TreeHugger Robot758ab612021-06-22 19:17:29 +00002211TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2212 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2213
2214 // Tests with 120Hz
2215 auto refreshRateConfigs =
2216 std::make_unique<RefreshRateConfigs>(m60_120Device,
2217 /*currentConfigId=*/HWC_CONFIG_ID_120);
2218 // SetPolicy(0, 60), current 60Hz => TurnOn.
2219 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2220 0);
2221 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2222
2223 // SetPolicy(60, 60), current 60Hz => TurnOff.
2224 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2225 0);
2226 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2227
2228 // SetPolicy(60, 120), current 60Hz => TurnOn.
2229 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2230 0);
2231 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2232
2233 // SetPolicy(120, 120), current 120Hz => TurnOff.
2234 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2235 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2236 0);
2237 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2238}
2239
Ady Abraham5cc2e262021-03-25 13:09:17 -07002240TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002241 auto refreshRateConfigs =
2242 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2243 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002244
2245 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002246 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2247 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002248
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002249 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002250 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2251 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002252
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002253 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002254 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2255 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002256
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002257 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002258 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2259 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002260
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002261 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002262 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2263 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002264
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002265 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002266 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2267 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Ady Abraham3819b9f2021-08-20 10:11:31 -07002268
2269 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2270 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2271 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2272 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002273}
2274
Marin Shalamanove09237f2021-08-16 18:20:21 +02002275TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2276 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2277 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2278
2279 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2280 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2281
2282 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2283 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2284
2285 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2286 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2287
2288 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2289 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2290
2291 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2292 for (auto refreshRate : refreshRates) {
2293 EXPECT_FALSE(
2294 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2295 }
2296
2297 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2298 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2299 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
2300}
2301
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002302TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002303 auto refreshRateConfigs =
2304 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2305 HWC_CONFIG_ID_120);
2306
2307 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002308 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2309 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002310}
2311
2312TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002313 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002314 auto refreshRateConfigs =
2315 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002316 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002317
2318 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2319 layers[0].name = "Test layer";
2320 layers[0].ownerUid = 1234;
2321 layers[0].desiredRefreshRate = Fps(60.0f);
2322 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002323 auto frameRateOverrides =
2324 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002325 ASSERT_EQ(1, frameRateOverrides.size());
2326 ASSERT_EQ(1, frameRateOverrides.count(1234));
2327 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2328
2329 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002330 frameRateOverrides =
2331 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002332 ASSERT_EQ(1, frameRateOverrides.size());
2333 ASSERT_EQ(1, frameRateOverrides.count(1234));
2334 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2335
2336 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002337 frameRateOverrides =
2338 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002339 ASSERT_TRUE(frameRateOverrides.empty());
2340
2341 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002342 frameRateOverrides =
2343 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002344 ASSERT_TRUE(frameRateOverrides.empty());
2345
2346 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002347 frameRateOverrides =
2348 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002349 ASSERT_TRUE(frameRateOverrides.empty());
2350
2351 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002352 frameRateOverrides =
2353 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002354 ASSERT_TRUE(frameRateOverrides.empty());
2355}
2356
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002357TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002358 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002359 auto refreshRateConfigs =
2360 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002361 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002362
2363 auto layers = std::vector<LayerRequirement>{
2364 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2365 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2366 };
2367
2368 layers[0].name = "Test layer 1234";
2369 layers[0].desiredRefreshRate = Fps(60.0f);
2370 layers[0].vote = LayerVoteType::ExplicitDefault;
2371
2372 layers[1].name = "Test layer 5678";
2373 layers[1].desiredRefreshRate = Fps(30.0f);
2374 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002375 auto frameRateOverrides =
2376 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002377
2378 ASSERT_EQ(2, frameRateOverrides.size());
2379 ASSERT_EQ(1, frameRateOverrides.count(1234));
2380 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2381 ASSERT_EQ(1, frameRateOverrides.count(5678));
2382 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2383
2384 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002385 frameRateOverrides =
2386 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002387 ASSERT_EQ(1, frameRateOverrides.size());
2388 ASSERT_EQ(1, frameRateOverrides.count(1234));
2389 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2390
2391 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002392 frameRateOverrides =
2393 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2394 ASSERT_TRUE(frameRateOverrides.empty());
2395}
2396
2397TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002398 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002399 auto refreshRateConfigs =
2400 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002401 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002402
2403 auto layers = std::vector<LayerRequirement>{
2404 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2405 };
2406
2407 layers[0].name = "Test layer";
2408 layers[0].desiredRefreshRate = Fps(60.0f);
2409 layers[0].vote = LayerVoteType::ExplicitDefault;
2410
2411 auto frameRateOverrides =
2412 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2413 ASSERT_EQ(1, frameRateOverrides.size());
2414 ASSERT_EQ(1, frameRateOverrides.count(1234));
2415 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2416
2417 frameRateOverrides =
2418 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2419 ASSERT_EQ(1, frameRateOverrides.size());
2420 ASSERT_EQ(1, frameRateOverrides.count(1234));
2421 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2422
2423 layers[0].vote = LayerVoteType::ExplicitExact;
2424 frameRateOverrides =
2425 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2426 ASSERT_EQ(1, frameRateOverrides.size());
2427 ASSERT_EQ(1, frameRateOverrides.count(1234));
2428 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2429
2430 frameRateOverrides =
2431 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2432 ASSERT_EQ(1, frameRateOverrides.size());
2433 ASSERT_EQ(1, frameRateOverrides.count(1234));
2434 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2435
2436 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2437 frameRateOverrides =
2438 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2439 ASSERT_EQ(1, frameRateOverrides.size());
2440 ASSERT_EQ(1, frameRateOverrides.count(1234));
2441 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2442
2443 frameRateOverrides =
2444 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002445 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002446}
2447
Marin Shalamanov75f37252021-02-10 21:43:57 +01002448TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
2449 auto refreshRateConfigs =
2450 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2451 /*currentConfigId=*/HWC_CONFIG_ID_30);
2452 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
2453 /* allowGroupSwitching */ false,
2454 /* range */ {Fps(30.0f), Fps(30.0f)}});
2455
2456 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
2457
2458 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
2459 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
2460 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
2461
2462 EXPECT_TRUE(
2463 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
2464 EXPECT_TRUE(
2465 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
2466}
2467
Alec Mouri0a1cc962019-03-14 12:33:02 -07002468} // namespace
2469} // namespace scheduler
2470} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002471
2472// TODO(b/129481165): remove the #pragma below and fix conversion issues
2473#pragma clang diagnostic pop // ignored "-Wextra"