blob: 112fabdefece413086b575c8c27a4a36992e70ed [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
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100186 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
187 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700188};
189
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100190using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700191
Alec Mouri0a1cc962019-03-14 12:33:02 -0700192RefreshRateConfigsTest::RefreshRateConfigsTest() {
193 const ::testing::TestInfo* const test_info =
194 ::testing::UnitTest::GetInstance()->current_test_info();
195 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
196}
197
198RefreshRateConfigsTest::~RefreshRateConfigsTest() {
199 const ::testing::TestInfo* const test_info =
200 ::testing::UnitTest::GetInstance()->current_test_info();
201 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
202}
203
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100204DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
205 int64_t vsyncPeriod, ui::Size resolution) {
206 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
207 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700208 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100209 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100210 .setHeight(resolution.height)
211 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700212 .build();
213}
214
Alec Mouri0a1cc962019-03-14 12:33:02 -0700215namespace {
216/* ------------------------------------------------------------------------
217 * Test cases
218 */
Ady Abraham2139f732019-11-13 18:56:40 -0800219TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700220 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700221 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
222 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700223}
224
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100225TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100226 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700227 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
228 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100229 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100230 0);
231 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
232 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100233}
234
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700235TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700236 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700237 std::make_unique<RefreshRateConfigs>(m60_90Device,
238 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700239
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100240 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
241 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700242
Ady Abrahamabc27602020-04-08 17:20:29 -0700243 ASSERT_EQ(mExpected60Config, minRate);
244 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800245
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100246 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800247 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800248 ASSERT_EQ(minRateByPolicy, minRate);
249 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700250}
Ady Abraham2139f732019-11-13 18:56:40 -0800251
252TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800253 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700254 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
255 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100257 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
258 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
259 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800260 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800261
Ady Abrahamabc27602020-04-08 17:20:29 -0700262 ASSERT_EQ(mExpected60Config, minRate);
263 ASSERT_EQ(mExpected60Config, minRate60);
264 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800265
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100266 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
267 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100268 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800269
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100270 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800271 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800272
Ady Abrahamabc27602020-04-08 17:20:29 -0700273 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
274 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
275 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
276}
277
278TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
279 auto refreshRateConfigs =
280 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
281 /*currentConfigId=*/HWC_CONFIG_ID_60);
282
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100283 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
284 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
285 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700286 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
287
288 ASSERT_EQ(mExpected60Config, minRate);
289 ASSERT_EQ(mExpected60Config, minRate60);
290 ASSERT_EQ(mExpected60Config, performanceRate60);
291
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100292 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
293 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100294 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700295
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100296 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700297 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
298
299 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
300 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
301 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800302}
303
304TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800305 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700306 std::make_unique<RefreshRateConfigs>(m60_90Device,
307 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800308
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100309 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
310 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800311
Ady Abrahamabc27602020-04-08 17:20:29 -0700312 ASSERT_EQ(mExpected60Config, minRate);
313 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800314
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100315 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
316 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800317
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100318 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
319 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700320 ASSERT_EQ(mExpected60Config, minRate60);
321 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800322}
323
324TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800325 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700326 std::make_unique<RefreshRateConfigs>(m60_90Device,
327 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800328 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100329 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100330 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800331 }
332
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100333 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800334 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100335 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100336 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800337 }
338
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100339 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
340 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800341 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100342 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100343 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800344 }
345}
346
Steven Thomasbb374322020-04-28 22:47:16 -0700347TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700348 auto refreshRateConfigs =
349 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
350 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800351
Steven Thomasdebafed2020-05-18 17:30:35 -0700352 // If there are no layers we select the default frame rate, which is the max of the primary
353 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800354 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700355 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700356 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800357
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100358 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
359 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700360 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700361 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800362}
363
Steven Thomasbb374322020-04-28 22:47:16 -0700364TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700366 std::make_unique<RefreshRateConfigs>(m60_90Device,
367 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368
369 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
370 auto& lr = layers[0];
371
372 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800373 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700374 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700375 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376
377 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800378 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700379 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700380 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100382 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800384 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700385 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700386 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100388 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800389 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700390 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700391 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100393 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800394 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700395 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700396 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100398 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800399 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700400 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700401 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100403 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800404 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700405 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700406 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800408 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100409 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
410 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
412 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700413 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700414 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
416 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700417 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700418 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800419
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100420 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700422 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700423 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100425 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700426 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700427 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100429 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700430 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700431 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100433 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700434 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700435 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100437 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700438 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700439 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800440
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100441 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
442 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
443 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800444
445 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700446 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700447 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448
449 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700450 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700451 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100453 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700455 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700456 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100458 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700459 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700460 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100462 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700463 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700464 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800465
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100466 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700467 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700468 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100470 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100474 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
475 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
476 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700478 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700479 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
481 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700482 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700483 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100485 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800486 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700488 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100490 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700491 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700492 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800493
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100494 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700495 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800497
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100498 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700499 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700500 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100502 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700503 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700504 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800505}
506
rnlee3bd610662021-06-23 16:27:57 -0700507TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
508 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
509 auto refreshRateConfigs =
510 std::make_unique<RefreshRateConfigs>(m60_90Device,
511 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
512
513 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
514 auto& lr = layers[0];
515
516 lr.vote = LayerVoteType::Min;
517 lr.name = "Min";
518 EXPECT_EQ(mExpected60Config,
519 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
520
521 lr.vote = LayerVoteType::Max;
522 lr.name = "Max";
523 EXPECT_EQ(mExpected90Config,
524 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
525
526 lr.desiredRefreshRate = Fps(90.0f);
527 lr.vote = LayerVoteType::Heuristic;
528 lr.name = "90Hz Heuristic";
529 EXPECT_EQ(mExpected90Config,
530 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
531
532 lr.desiredRefreshRate = Fps(60.0f);
533 lr.name = "60Hz Heuristic";
534 EXPECT_EQ(mExpected60Config,
535 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
536
537 lr.desiredRefreshRate = Fps(45.0f);
538 lr.name = "45Hz Heuristic";
539 EXPECT_EQ(mExpected90Config,
540 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
541
542 lr.desiredRefreshRate = Fps(30.0f);
543 lr.name = "30Hz Heuristic";
544 EXPECT_EQ(mExpected60Config,
545 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
546
547 lr.desiredRefreshRate = Fps(24.0f);
548 lr.name = "24Hz Heuristic";
549 EXPECT_EQ(mExpected60Config,
550 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
551}
552
Steven Thomasbb374322020-04-28 22:47:16 -0700553TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
556 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557
558 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
559 auto& lr = layers[0];
560
561 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700562 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700563 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800564
565 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700566 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700567 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800568
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100569 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800570 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700571 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700572 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800573
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100574 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700575 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700576 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800577
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100578 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700579 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700580 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800581
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100582 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700583 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700584 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800585
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100586 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700587 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700588 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800589}
590
Steven Thomasbb374322020-04-28 22:47:16 -0700591TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800592 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700593 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
594 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595
596 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
597 LayerRequirement{.weight = 1.0f}};
598 auto& lr1 = layers[0];
599 auto& lr2 = layers[1];
600
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100601 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800602 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100603 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800604 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700605 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700606 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800607
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100608 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800609 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100610 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800611 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700612 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700613 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800614
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100615 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800616 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100617 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800618 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700619 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700620 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800621}
622
Steven Thomasbb374322020-04-28 22:47:16 -0700623TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800624 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700625 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
626 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800627
628 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
629 LayerRequirement{.weight = 1.0f}};
630 auto& lr1 = layers[0];
631 auto& lr2 = layers[1];
632
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100633 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800634 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800635 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100636 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700639 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700640 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800641
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100642 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800643 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800644 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100645 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700648 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700649 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800650
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100651 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800652 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800653 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100654 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800655 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800656 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700657 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700658 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800659
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100660 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800661 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800662 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100663 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800664 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800665 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700666 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700667 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800668
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100669 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800670 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
671 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100672 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800673 lr2.vote = LayerVoteType::ExplicitDefault;
674 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700675 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700676 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800677
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100678 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800679 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800680 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100681 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800682 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800683 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700684 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700685 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800686
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100687 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800688 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800689 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100690 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800691 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800692 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700693 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700694 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800695
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100696 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800697 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800698 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100699 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800700 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800701 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700702 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700703 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800704
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100705 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800706 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800707 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100708 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800709 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800710 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700711 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700712 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800713}
714
rnlee3bd610662021-06-23 16:27:57 -0700715TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
716 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
717 auto refreshRateConfigs =
718 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
719 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
720
721 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
722 LayerRequirement{.weight = 1.0f}};
723 auto& lr1 = layers[0];
724 auto& lr2 = layers[1];
725
726 lr1.desiredRefreshRate = Fps(24.0f);
727 lr1.vote = LayerVoteType::ExplicitDefault;
728 lr1.name = "24Hz ExplicitDefault";
729 lr2.desiredRefreshRate = Fps(60.0f);
730 lr2.vote = LayerVoteType::Heuristic;
731 lr2.name = "60Hz Heuristic";
732 EXPECT_EQ(mExpected120Config,
733 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
734
735 lr1.desiredRefreshRate = Fps(24.0f);
736 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
737 lr1.name = "24Hz ExplicitExactOrMultiple";
738 lr2.desiredRefreshRate = Fps(60.0f);
739 lr2.vote = LayerVoteType::Heuristic;
740 lr2.name = "60Hz Heuristic";
741 EXPECT_EQ(mExpected60Config,
742 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
743
744 lr1.desiredRefreshRate = Fps(24.0f);
745 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
746 lr1.name = "24Hz ExplicitExactOrMultiple";
747 lr2.desiredRefreshRate = Fps(60.0f);
748 lr2.vote = LayerVoteType::ExplicitDefault;
749 lr2.name = "60Hz ExplicitDefault";
750 EXPECT_EQ(mExpected72Config,
751 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
752
753 lr1.desiredRefreshRate = Fps(24.0f);
754 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
755 lr1.name = "24Hz ExplicitExactOrMultiple";
756 lr2.desiredRefreshRate = Fps(90.0f);
757 lr2.vote = LayerVoteType::Heuristic;
758 lr2.name = "90Hz Heuristic";
759 EXPECT_EQ(mExpected90Config,
760 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
761
762 lr1.desiredRefreshRate = Fps(24.0f);
763 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
764 lr1.name = "24Hz ExplicitExactOrMultiple";
765 lr2.desiredRefreshRate = Fps(90.0f);
766 lr2.vote = LayerVoteType::ExplicitDefault;
767 lr2.name = "90Hz Heuristic";
768 EXPECT_EQ(mExpected72Config,
769 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
770
771 lr1.desiredRefreshRate = Fps(24.0f);
772 lr1.vote = LayerVoteType::ExplicitDefault;
773 lr1.name = "24Hz ExplicitDefault";
774 lr2.desiredRefreshRate = Fps(90.0f);
775 lr2.vote = LayerVoteType::Heuristic;
776 lr2.name = "90Hz Heuristic";
777 EXPECT_EQ(mExpected90Config,
778 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
779
780 lr1.desiredRefreshRate = Fps(24.0f);
781 lr1.vote = LayerVoteType::Heuristic;
782 lr1.name = "24Hz Heuristic";
783 lr2.desiredRefreshRate = Fps(90.0f);
784 lr2.vote = LayerVoteType::ExplicitDefault;
785 lr2.name = "90Hz ExplicitDefault";
786 EXPECT_EQ(mExpected72Config,
787 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
788
789 lr1.desiredRefreshRate = Fps(24.0f);
790 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
791 lr1.name = "24Hz ExplicitExactOrMultiple";
792 lr2.desiredRefreshRate = Fps(90.0f);
793 lr2.vote = LayerVoteType::ExplicitDefault;
794 lr2.name = "90Hz ExplicitDefault";
795 EXPECT_EQ(mExpected72Config,
796 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
797
798 lr1.desiredRefreshRate = Fps(24.0f);
799 lr1.vote = LayerVoteType::ExplicitDefault;
800 lr1.name = "24Hz ExplicitDefault";
801 lr2.desiredRefreshRate = Fps(90.0f);
802 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
803 lr2.name = "90Hz ExplicitExactOrMultiple";
804 EXPECT_EQ(mExpected90Config,
805 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
806}
807
Steven Thomasbb374322020-04-28 22:47:16 -0700808TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 std::make_unique<RefreshRateConfigs>(m30_60Device,
811 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812
813 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
814 auto& lr = layers[0];
815
816 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700817 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700818 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
820 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700821 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700822 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800823
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100824 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800825 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700826 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700827 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800828
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100829 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700830 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700831 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800832
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100833 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700834 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700835 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800836
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100837 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700838 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700839 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100841 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700842 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700843 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800844}
845
Steven Thomasbb374322020-04-28 22:47:16 -0700846TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700848 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
849 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800850
851 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
852 auto& lr = layers[0];
853
854 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800855 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700856 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700857 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858
859 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800860 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700861 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700862 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800863
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100864 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800865 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800866 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700867 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700868 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800869
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100870 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800871 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700872 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700874 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700875 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800876
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100877 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800878 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700879 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700880 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700881 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700882 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800883
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100884 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800885 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700886 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700887 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700888 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700889 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800890
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100891 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800892 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700893 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700894 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700895 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700896 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800897
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100898 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800899 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
900 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700901 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700902 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700903 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700904 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800905}
906
Steven Thomasbb374322020-04-28 22:47:16 -0700907TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800908 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700909 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
910 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800911
912 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
913 LayerRequirement{.weight = 1.0f}};
914 auto& lr1 = layers[0];
915 auto& lr2 = layers[1];
916
917 lr1.vote = LayerVoteType::Min;
918 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700919 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700920 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800921
922 lr1.vote = LayerVoteType::Min;
923 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100924 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700925 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700926 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800927
928 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800929 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100930 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700931 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700932 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800933
934 lr1.vote = LayerVoteType::Max;
935 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100936 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700937 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700938 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800939
940 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800941 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100942 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700943 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700944 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800945
946 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100947 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800948 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100949 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700950 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700951 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800952
953 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100954 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800955 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100956 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700957 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700958 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800959}
960
Steven Thomasbb374322020-04-28 22:47:16 -0700961TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800962 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700963 std::make_unique<RefreshRateConfigs>(m60_90Device,
964 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800965
966 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
967 auto& lr = layers[0];
968
Ady Abraham71c437d2020-01-31 15:56:57 -0800969 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800970 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100971 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800972 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700973 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700974 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800975 }
976}
977
rnlee3bd610662021-06-23 16:27:57 -0700978TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
979 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
980 auto refreshRateConfigs =
981 std::make_unique<RefreshRateConfigs>(m60_120Device,
982 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
983
984 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
985 auto& lr = layers[0];
986
987 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
988 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
989 lr.desiredRefreshRate = Fps(fps);
990 const auto& refreshRate =
991 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
992 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
993 }
994}
995
Steven Thomasbb374322020-04-28 22:47:16 -0700996TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800997 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700998 std::make_unique<RefreshRateConfigs>(m60_90Device,
999 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -08001000
1001 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1002 LayerRequirement{.weight = 1.0f}};
1003 auto& lr1 = layers[0];
1004 auto& lr2 = layers[1];
1005
1006 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001007 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001008 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001009 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001010 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001011 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001012
1013 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001014 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001015 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001016 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001017 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001018 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001019
1020 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001021 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001022 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001023 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001024 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001025 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001026}
1027
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001028TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001029 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1030 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1031 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1032 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1033 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001034}
1035
Steven Thomasbb374322020-04-28 22:47:16 -07001036TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001037 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001038 std::make_unique<RefreshRateConfigs>(m60_90Device,
1039 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001040
1041 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1042 auto& lr = layers[0];
1043
Ady Abraham71c437d2020-01-31 15:56:57 -08001044 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001045 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001046 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001047 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001048 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001049 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001050 }
1051}
1052
Steven Thomasbb374322020-04-28 22:47:16 -07001053TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001054 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001055 std::make_unique<RefreshRateConfigs>(m60_90Device,
1056 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001057
1058 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1059 LayerRequirement{.weight = 1.0f}};
1060 auto& lr1 = layers[0];
1061 auto& lr2 = layers[1];
1062
1063 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001064 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001065 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001066 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001067 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001068 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001069 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001070 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001071
1072 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001073 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001074 lr1.name = "60Hz ExplicitExactOrMultiple";
1075 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001076 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001077 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001078 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001079 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001080
1081 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001082 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001083 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001084 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001085 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001086 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001087 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001088
1089 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001090 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001091 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001092 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001093 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001094 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001095 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001096 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001097
1098 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001099 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001100 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001101 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001102 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001103 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001104 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001105}
1106
1107TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001108 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001109 std::make_unique<RefreshRateConfigs>(m60_90Device,
1110 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001111
1112 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1113 LayerRequirement{.weight = 1.0f}};
1114 auto& lr1 = layers[0];
1115 auto& lr2 = layers[1];
1116
1117 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001118 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001119 lr1.name = "60Hz ExplicitExactOrMultiple";
1120 lr2.vote = LayerVoteType::NoVote;
1121 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001122 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001123 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001124
1125 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001126 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001127 lr1.name = "60Hz ExplicitExactOrMultiple";
1128 lr2.vote = LayerVoteType::NoVote;
1129 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001130 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001131 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001132
1133 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001134 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001135 lr1.name = "60Hz ExplicitExactOrMultiple";
1136 lr2.vote = LayerVoteType::Max;
1137 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001138 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001139 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001140
1141 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001142 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001143 lr1.name = "60Hz ExplicitExactOrMultiple";
1144 lr2.vote = LayerVoteType::Max;
1145 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001146 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001147 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001148
1149 // The other layer starts to provide buffers
1150 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001151 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001152 lr1.name = "60Hz ExplicitExactOrMultiple";
1153 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001154 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001155 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001156 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001157 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001158}
1159
1160TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001161 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001162 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001163 std::make_unique<RefreshRateConfigs>(m60_90Device,
1164 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001165
Ady Abrahamdfd62162020-06-10 16:11:56 -07001166 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1167 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001168
Ady Abrahamdfd62162020-06-10 16:11:56 -07001169 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1170 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001171
1172 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1173 LayerRequirement{.weight = 1.0f}};
1174 auto& lr1 = layers[0];
1175 auto& lr2 = layers[1];
1176
1177 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001178 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001179 lr1.name = "60Hz ExplicitExactOrMultiple";
1180 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001181 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001182 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001183 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1184 &consideredSignals);
1185 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001186
1187 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001188 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001189 lr1.name = "60Hz ExplicitExactOrMultiple";
1190 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001191 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001192 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001193 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1194 &consideredSignals);
1195 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001196
1197 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001198 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001199 lr1.name = "60Hz ExplicitExactOrMultiple";
1200 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001201 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001202 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001203 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1204 &consideredSignals);
1205 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001206
1207 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001208 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001209 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001210 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001211 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001212 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001213 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1214 &consideredSignals);
1215 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001216}
1217
Steven Thomasbb374322020-04-28 22:47:16 -07001218TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001219 auto refreshRateConfigs =
1220 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1221 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001222
1223 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1224 auto& lr = layers[0];
1225
1226 // Prepare a table with the vote and the expected refresh rate
1227 const std::vector<std::pair<float, float>> testCases = {
1228 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1229
1230 {100, 90}, {90, 90}, {89, 90},
1231
1232 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1233
1234 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1235
1236 {55, 90}, {50, 90}, {45, 90},
1237
1238 {42, 120}, {40, 120}, {39, 120},
1239
1240 {37, 72}, {36, 72}, {35, 72},
1241
1242 {30, 60},
1243 };
1244
1245 for (const auto& test : testCases) {
1246 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001247 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001248
1249 std::stringstream ss;
1250 ss << "ExplicitDefault " << test.first << " fps";
1251 lr.name = ss.str();
1252
1253 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001254 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001255 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Marin Shalamanove09237f2021-08-16 18:20:21 +02001256 << "Expecting " << test.first << "fps => " << test.second << "Hz"
1257 << " but it was " << refreshRate.getFps();
1258 }
1259}
1260
1261TEST_F(RefreshRateConfigsTest,
1262 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
1263 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1264 auto& lr = layers[0];
1265
1266 // Test that 23.976 will choose 24 if 23.976 is not supported
1267 {
1268 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1269 mConfig30Frac, mConfig60, mConfig60Frac};
1270 auto refreshRateConfigs =
1271 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1272
1273 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
1274 lr.desiredRefreshRate = Fps(23.976f);
1275 lr.name = "ExplicitExactOrMultiple 23.976 fps";
1276 EXPECT_EQ(HWC_CONFIG_ID_24,
1277 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1278 .getModeId());
1279 }
1280
1281 // Test that 24 will choose 23.976 if 24 is not supported
1282 {
1283 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1284 mConfig30Frac, mConfig60, mConfig60Frac};
1285 auto refreshRateConfigs =
1286 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1287 lr.desiredRefreshRate = Fps(24.f);
1288 lr.name = "ExplicitExactOrMultiple 24 fps";
1289 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1290 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1291 .getModeId());
1292 }
1293
1294 // Test that 29.97 will prefer 59.94 over 60 and 30
1295 {
1296 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1297 mConfig30, mConfig60, mConfig60Frac};
1298 auto refreshRateConfigs =
1299 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1300 lr.desiredRefreshRate = Fps(29.97f);
1301 lr.name = "ExplicitExactOrMultiple 29.97f fps";
1302 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
1303 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1304 .getModeId());
1305 }
1306}
1307
1308TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
1309 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1310 auto& lr = layers[0];
1311
1312 // Test that voting for supported refresh rate will select this refresh rate
1313 {
1314 auto refreshRateConfigs =
1315 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1316 /*currentConfigId=*/HWC_CONFIG_ID_60);
1317
1318 for (auto desiredRefreshRate : {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f}) {
1319 lr.vote = LayerVoteType::ExplicitExact;
1320 lr.desiredRefreshRate = Fps(desiredRefreshRate);
1321 std::stringstream ss;
1322 ss << "ExplicitExact " << desiredRefreshRate << " fps";
1323 lr.name = ss.str();
1324
1325 auto selecteRefreshRate =
1326 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
1327
1328 EXPECT_TRUE(selecteRefreshRate.getFps().equalsWithMargin(lr.desiredRefreshRate))
1329 << "Expecting " << lr.desiredRefreshRate << " but it was "
1330 << selecteRefreshRate.getFps();
1331 }
1332 }
1333
1334 // Test that 23.976 will choose 24 if 23.976 is not supported
1335 {
1336 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1337 mConfig30Frac, mConfig60, mConfig60Frac};
1338 auto refreshRateConfigs =
1339 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1340 lr.vote = LayerVoteType::ExplicitExact;
1341 lr.desiredRefreshRate = Fps(23.976f);
1342 lr.name = "ExplicitExact 23.976 fps";
1343 EXPECT_EQ(HWC_CONFIG_ID_24,
1344 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1345 .getModeId());
1346 }
1347
1348 // Test that 24 will choose 23.976 if 24 is not supported
1349 {
1350 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1351 mConfig30Frac, mConfig60, mConfig60Frac};
1352 auto refreshRateConfigs =
1353 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1354 lr.desiredRefreshRate = Fps(24.f);
1355 lr.name = "ExplicitExact 24 fps";
1356 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
1357 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1358 .getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001359 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001360}
1361
Alec Mouri11232a22020-05-14 18:06:25 -07001362TEST_F(RefreshRateConfigsTest,
1363 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1364 auto refreshRateConfigs =
1365 std::make_unique<RefreshRateConfigs>(m60_90Device,
1366 /*currentConfigId=*/HWC_CONFIG_ID_90);
1367
1368 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001369 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001370 0);
1371
1372 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1373 auto& lr = layers[0];
1374
Ady Abrahamdfd62162020-06-10 16:11:56 -07001375 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001376 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001377 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001378 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001379 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001380 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001381 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1382 &consideredSignals));
1383 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001384}
1385
1386TEST_F(RefreshRateConfigsTest,
1387 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1388 auto refreshRateConfigs =
1389 std::make_unique<RefreshRateConfigs>(m60_90Device,
1390 /*currentConfigId=*/HWC_CONFIG_ID_60);
1391
1392 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001393 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001394 0);
1395
1396 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1397 auto& lr = layers[0];
1398
Alec Mouri11232a22020-05-14 18:06:25 -07001399 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001400 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001401 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001402 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001403 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001404 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001405}
1406
1407TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001408 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001409 auto refreshRateConfigs =
1410 std::make_unique<RefreshRateConfigs>(m60_90Device,
1411 /*currentConfigId=*/HWC_CONFIG_ID_90);
1412
1413 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001414 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001415 0);
1416
Ady Abrahamdfd62162020-06-10 16:11:56 -07001417 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001418 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001419 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1420 &consideredSignals));
1421 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001422
1423 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1424 auto& lr = layers[0];
1425
1426 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001427 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001428 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001429 lr.focused = false;
1430 EXPECT_EQ(mExpected90Config,
1431 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1432
1433 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001434 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001435 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001436
1437 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001438 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001439 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001440 lr.focused = false;
1441 EXPECT_EQ(mExpected90Config,
1442 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1443
1444 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001445 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001446 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001447
1448 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001449 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001450 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001451 lr.focused = false;
1452 EXPECT_EQ(mExpected90Config,
1453 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1454
1455 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001456 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001457 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001458
1459 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001460 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001461 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001462 lr.focused = false;
1463 EXPECT_EQ(mExpected90Config,
1464 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1465
1466 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001467 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001468 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001469
1470 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001471 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001472 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001473 lr.focused = false;
1474 EXPECT_EQ(mExpected90Config,
1475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1476
1477 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001478 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001479 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001480}
1481
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001482TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001483 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001484 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1485 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001486
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001487 // The default policy doesn't allow group switching. Verify that no
1488 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001489 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1490 auto& layer = layers[0];
1491 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001492 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001493 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001494 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001495 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001496
Steven Thomasd4071902020-03-24 16:02:53 -07001497 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001498 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001499 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001500}
Steven Thomasd4071902020-03-24 16:02:53 -07001501
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001502TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1503 auto refreshRateConfigs =
1504 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1505 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001506 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001507 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001508 policy.allowGroupSwitching = true;
1509 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001510
1511 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1512 auto& layer = layers[0];
1513 layer.vote = LayerVoteType::ExplicitDefault;
1514 layer.desiredRefreshRate = Fps(90.0f);
1515 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1516 layer.name = "90Hz ExplicitDefault";
1517 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001518 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001519 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001520 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001521}
1522
1523TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1524 auto refreshRateConfigs =
1525 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1526 /*currentConfigId=*/HWC_CONFIG_ID_60);
1527 RefreshRateConfigs::Policy policy;
1528 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1529 policy.allowGroupSwitching = true;
1530 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001531
1532 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001533 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1534 auto& layer = layers[0];
1535 layer.vote = LayerVoteType::ExplicitDefault;
1536 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001537 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001538 layer.name = "90Hz ExplicitDefault";
1539 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001540 ASSERT_EQ(HWC_CONFIG_ID_60,
1541 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001542 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001543}
1544
1545TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1546 auto refreshRateConfigs =
1547 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1548 /*currentConfigId=*/HWC_CONFIG_ID_60);
1549 RefreshRateConfigs::Policy policy;
1550 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1551 policy.allowGroupSwitching = true;
1552 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1553
1554 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001555
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001556 // 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 +01001557 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1558 auto& layer = layers[0];
1559 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001560 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001561 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001562 layer.name = "60Hz ExplicitDefault";
1563 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001564 ASSERT_EQ(HWC_CONFIG_ID_90,
1565 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001566 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001567}
1568
1569TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1570 auto refreshRateConfigs =
1571 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1572 /*currentConfigId=*/HWC_CONFIG_ID_60);
1573 RefreshRateConfigs::Policy policy;
1574 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1575 policy.allowGroupSwitching = true;
1576 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1577
1578 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001579
1580 // Verify that if the current config is in another group and there are no layers with
1581 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001582
1583 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1584 auto& layer = layers[0];
1585 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001586 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001587 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001588 layer.name = "60Hz ExplicitDefault";
1589 layer.focused = true;
1590
Marin Shalamanov46084422020-10-13 12:33:42 +02001591 ASSERT_EQ(HWC_CONFIG_ID_60,
1592 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001593 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001594}
1595
1596TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1597 auto refreshRateConfigs =
1598 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1599 /*currentConfigId=*/HWC_CONFIG_ID_60);
1600 RefreshRateConfigs::Policy policy;
1601 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1602 policy.allowGroupSwitching = true;
1603 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1604
1605 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001606
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001607 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001608 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001609 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1610 layers[0].vote = LayerVoteType::ExplicitDefault;
1611 layers[0].desiredRefreshRate = Fps(60.0f);
1612 layers[0].seamlessness = Seamlessness::OnlySeamless;
1613 layers[0].name = "60Hz ExplicitDefault";
1614 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001615
1616 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001617 layers[1].vote = LayerVoteType::ExplicitDefault;
1618 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1619 layers[1].desiredRefreshRate = Fps(90.0f);
1620 layers[1].name = "90Hz ExplicitDefault";
1621 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001622
1623 ASSERT_EQ(HWC_CONFIG_ID_90,
1624 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001625 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001626}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001627
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001628TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001629 auto refreshRateConfigs =
1630 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1631 /*currentConfigId=*/HWC_CONFIG_ID_60);
1632 RefreshRateConfigs::Policy policy;
1633 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1634 policy.allowGroupSwitching = true;
1635 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1636
1637 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001638
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001639 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1640 // seamlessness=Default can't change the mode group back to the group of the default
1641 // mode.
1642 // For example, this may happen when a video playback requests and gets a seamed switch,
1643 // but another layer (with default seamlessness) starts animating. The animating layer
1644 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001645 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001646 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001647 layers[0].desiredRefreshRate = Fps(60.0f);
1648 layers[0].focused = true;
1649 layers[0].vote = LayerVoteType::ExplicitDefault;
1650 layers[0].name = "60Hz ExplicitDefault";
1651
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001652 layers.push_back(LayerRequirement{.weight = 0.1f});
1653 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1654 layers[1].desiredRefreshRate = Fps(90.0f);
1655 layers[1].focused = true;
1656 layers[1].vote = LayerVoteType::ExplicitDefault;
1657 layers[1].name = "90Hz ExplicitDefault";
1658
Marin Shalamanov46084422020-10-13 12:33:42 +02001659 ASSERT_EQ(HWC_CONFIG_ID_90,
1660 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001661 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001662}
1663
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001664TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1665 auto refreshRateConfigs =
1666 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1667 /*currentConfigId=*/HWC_CONFIG_ID_60);
1668 RefreshRateConfigs::Policy policy;
1669 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1670 policy.allowGroupSwitching = true;
1671 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1672
1673 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1674
1675 // Layer with seamlessness=Default can change the mode group if there's a not
1676 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1677 // when in split screen mode the user switches between the two visible applications.
1678 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1679 layers[0].seamlessness = Seamlessness::Default;
1680 layers[0].desiredRefreshRate = Fps(60.0f);
1681 layers[0].focused = true;
1682 layers[0].vote = LayerVoteType::ExplicitDefault;
1683 layers[0].name = "60Hz ExplicitDefault";
1684
1685 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001686 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1687 layers[1].desiredRefreshRate = Fps(90.0f);
1688 layers[1].focused = false;
1689 layers[1].vote = LayerVoteType::ExplicitDefault;
1690 layers[1].name = "90Hz ExplicitDefault";
1691
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001692 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001693 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1694 .getModeId());
1695}
1696
1697TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1698 auto refreshRateConfigs =
1699 std::make_unique<RefreshRateConfigs>(m30_60Device,
1700 /*currentConfigId=*/HWC_CONFIG_ID_60);
1701
1702 // Allow group switching.
1703 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001704 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001705 policy.allowGroupSwitching = true;
1706 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1707
1708 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1709 auto& layer = layers[0];
1710 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001711 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001712 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001713 layer.name = "60Hz ExplicitExactOrMultiple";
1714 layer.focused = true;
1715
1716 ASSERT_EQ(HWC_CONFIG_ID_60,
1717 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001718 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001719
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001720 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001721 ASSERT_EQ(HWC_CONFIG_ID_120,
1722 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001723 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001724}
1725
1726TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1727 auto refreshRateConfigs =
1728 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1729 /*currentConfigId=*/HWC_CONFIG_ID_60);
1730
1731 // Allow group switching.
1732 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001733 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001734 policy.allowGroupSwitching = true;
1735 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1736
1737 auto layers = std::vector<
1738 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1739 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001740 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001741 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001742 .weight = 0.5f,
1743 .focused = false},
1744 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1745 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001746 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001747 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001748 .weight = 1.0f,
1749 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001750
1751 ASSERT_EQ(HWC_CONFIG_ID_50,
1752 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001753 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001754
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001755 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001756 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001757 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001758
1759 ASSERT_EQ(HWC_CONFIG_ID_25,
1760 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001761 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001762}
1763
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001764TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1765 auto refreshRateConfigs =
1766 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1767 /*currentConfigId=*/HWC_CONFIG_ID_90);
1768
1769 // Allow group switching.
1770 RefreshRateConfigs::Policy policy;
1771 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1772 policy.allowGroupSwitching = true;
1773 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1774
1775 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1776 .vote = LayerVoteType::Min,
1777 .weight = 1.f,
1778 .focused = true}};
1779
1780 ASSERT_EQ(HWC_CONFIG_ID_90,
1781 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1782 .getModeId());
1783}
1784
Steven Thomasf734df42020-04-13 21:09:28 -07001785TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1786 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001787 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001788 /*currentConfigId=*/HWC_CONFIG_ID_60);
1789
1790 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1791 layers[0].name = "Test layer";
1792
Steven Thomasbb374322020-04-28 22:47:16 -07001793 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001794 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001795 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001796 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001797 layers[0].vote = voteType;
1798 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001799 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001800 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001801 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001802 };
1803
1804 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001805 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001806 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001807 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001808 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001809 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001810 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1811 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1812 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1813 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1814 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1815 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001816
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001817 // Layers not focused are not allowed to override primary config
1818 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001819 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001820 /*focused=*/false));
1821 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001822 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001823 /*focused=*/false));
1824
Steven Thomasf734df42020-04-13 21:09:28 -07001825 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001826 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001827 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1828 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001829 EXPECT_EQ(HWC_CONFIG_ID_90,
1830 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001831 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001832 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001833
1834 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001835 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001836 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001837 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1838 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1839 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1840 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1841 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1842 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001843}
1844
Steven Thomasbb374322020-04-28 22:47:16 -07001845TEST_F(RefreshRateConfigsTest, idle) {
1846 auto refreshRateConfigs =
1847 std::make_unique<RefreshRateConfigs>(m60_90Device,
1848 /*currentConfigId=*/HWC_CONFIG_ID_60);
1849
1850 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1851 layers[0].name = "Test layer";
1852
Marin Shalamanov23c44202020-12-22 19:09:20 +01001853 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001854 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001855 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001856 RefreshRateConfigs::GlobalSignals consideredSignals;
1857 const auto configId =
1858 refreshRateConfigs
1859 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1860 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001861 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001862 // Refresh rate will be chosen by either touch state or idle state
1863 EXPECT_EQ(!touchActive, consideredSignals.idle);
1864 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001865 };
1866
1867 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001868 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001869 0);
1870
1871 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001872 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1873 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1874 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1875 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1876 EXPECT_EQ(HWC_CONFIG_ID_90,
1877 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1878 EXPECT_EQ(HWC_CONFIG_ID_90,
1879 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001880
1881 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001882 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001883 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001884 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001885
1886 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001887 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001888 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1889 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1890 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1891 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1892 EXPECT_EQ(HWC_CONFIG_ID_60,
1893 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1894 EXPECT_EQ(HWC_CONFIG_ID_60,
1895 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001896
1897 // Idle should be applied rather than the current config when there are no layers.
1898 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001899 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001900 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001901}
1902
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001903TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1904 auto refreshRateConfigs =
1905 std::make_unique<RefreshRateConfigs>(m60_90Device,
1906 /*currentConfigId=*/HWC_CONFIG_ID_60);
1907
1908 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001909 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1910 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001911 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001912 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001913 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001914 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001915 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001916 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001917 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001918 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001919 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001920 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001921 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001922 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001923 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001924 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001925 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1926 }
1927}
1928
1929TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001930 auto refreshRateConfigs =
1931 std::make_unique<RefreshRateConfigs>(m60_90Device,
1932 /*currentConfigId=*/HWC_CONFIG_ID_60);
1933
1934 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001935 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001936 const RefreshRate& expected;
1937 };
1938
1939 /* clang-format off */
1940 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001941 {Fps(24.0f), mExpected60Config},
1942 {Fps(30.0f), mExpected60Config},
1943 {Fps(45.0f), mExpected90Config},
1944 {Fps(60.0f), mExpected60Config},
1945 {Fps(72.0f), mExpected90Config},
1946 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001947 };
1948 /* clang-format on */
1949
1950 // Make sure the test tests all the known frame rate
1951 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001952 const auto equal =
1953 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1954 knownFrameRatesExpectations.begin(),
1955 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001956 EXPECT_TRUE(equal);
1957
1958 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1959 auto& layer = layers[0];
1960 layer.vote = LayerVoteType::Heuristic;
1961 for (const auto& expectedRate : knownFrameRatesExpectations) {
1962 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001963 const auto& refreshRate =
1964 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001965 EXPECT_EQ(expectedRate.expected, refreshRate);
1966 }
1967}
1968
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001969TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1970 auto refreshRateConfigs =
1971 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1972 /*currentConfigId=*/HWC_CONFIG_ID_60);
1973
1974 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1975 LayerRequirement{.weight = 0.5f}};
1976 auto& explicitExactLayer = layers[0];
1977 auto& explicitExactOrMultipleLayer = layers[1];
1978
1979 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1980 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1981 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1982
1983 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1984 explicitExactLayer.name = "ExplicitExact";
1985 explicitExactLayer.desiredRefreshRate = Fps(30);
1986
1987 EXPECT_EQ(mExpected30Config,
1988 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1989 EXPECT_EQ(mExpected30Config,
1990 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1991
1992 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1993 explicitExactLayer.desiredRefreshRate = Fps(60);
1994 EXPECT_EQ(mExpected60Config,
1995 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1996
1997 explicitExactLayer.desiredRefreshRate = Fps(72);
1998 EXPECT_EQ(mExpected72Config,
1999 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2000
2001 explicitExactLayer.desiredRefreshRate = Fps(90);
2002 EXPECT_EQ(mExpected90Config,
2003 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2004
2005 explicitExactLayer.desiredRefreshRate = Fps(120);
2006 EXPECT_EQ(mExpected120Config,
2007 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2008}
2009
2010TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07002011 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002012 auto refreshRateConfigs =
2013 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002014 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002015
2016 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2017 LayerRequirement{.weight = 0.5f}};
2018 auto& explicitExactLayer = layers[0];
2019 auto& explicitExactOrMultipleLayer = layers[1];
2020
2021 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2022 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2023 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2024
2025 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2026 explicitExactLayer.name = "ExplicitExact";
2027 explicitExactLayer.desiredRefreshRate = Fps(30);
2028
2029 EXPECT_EQ(mExpected60Config,
2030 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2031 EXPECT_EQ(mExpected120Config,
2032 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2033
2034 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
2035 explicitExactLayer.desiredRefreshRate = Fps(60);
2036 EXPECT_EQ(mExpected120Config,
2037 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2038
2039 explicitExactLayer.desiredRefreshRate = Fps(72);
2040 EXPECT_EQ(mExpected72Config,
2041 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2042
2043 explicitExactLayer.desiredRefreshRate = Fps(90);
2044 EXPECT_EQ(mExpected90Config,
2045 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2046
2047 explicitExactLayer.desiredRefreshRate = Fps(120);
2048 EXPECT_EQ(mExpected120Config,
2049 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2050}
2051
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02002052TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
2053 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2054
2055 auto refreshRateConfigs =
2056 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2057 /*currentConfigId=*/HWC_CONFIG_ID_60);
2058
2059 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2060 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2061 LayerRequirement>(),
2062 .globalSignals = {.touch = true,
2063 .idle = true},
2064 .outSignalsConsidered =
2065 {.touch = true,
2066 .idle = false},
2067 .resultingBestRefreshRate =
2068 createRefreshRate(
2069 mConfig90)});
2070
2071 EXPECT_EQ(createRefreshRate(mConfig90),
2072 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2073 {.touch = true, .idle = true}));
2074
2075 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
2076 setLastBestRefreshRateInvocation(*refreshRateConfigs,
2077 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
2078 LayerRequirement>(),
2079 .globalSignals = {.touch = true,
2080 .idle = true},
2081 .outSignalsConsidered =
2082 cachedSignalsConsidered,
2083 .resultingBestRefreshRate =
2084 createRefreshRate(
2085 mConfig30)});
2086
2087 GlobalSignals signalsConsidered;
2088 EXPECT_EQ(createRefreshRate(mConfig30),
2089 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
2090 {.touch = true, .idle = true},
2091 &signalsConsidered));
2092
2093 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
2094}
2095
2096TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
2097 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
2098
2099 auto refreshRateConfigs =
2100 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2101 /*currentConfigId=*/HWC_CONFIG_ID_60);
2102 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
2103
2104 GlobalSignals globalSignals{.touch = true, .idle = true};
2105 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2106 LayerRequirement{.weight = 0.5f}};
2107 const auto lastResult =
2108 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
2109 /* outSignalsConsidered */ nullptr);
2110
2111 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
2112
2113 ASSERT_TRUE(lastInvocation.has_value());
2114 ASSERT_EQ(layers, lastInvocation->layerRequirements);
2115 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
2116 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
2117
2118 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2119 // to getBestRefreshRate()
2120 GlobalSignals detaultSignals;
2121 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2122}
2123
Ady Abraham5e4e9832021-06-14 13:40:56 -07002124TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002125 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002126 auto refreshRateConfigs =
2127 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002128 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002129
2130 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2131 LayerRequirement{.weight = 0.5f}};
2132 auto& explicitExactLayer = layers[0];
2133 auto& explicitExactOrMultipleLayer = layers[1];
2134
2135 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2136 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2137 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2138
2139 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2140 explicitExactLayer.name = "ExplicitExact";
2141 explicitExactLayer.desiredRefreshRate = Fps(30);
2142
2143 EXPECT_EQ(mExpected60Config,
2144 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2145 EXPECT_EQ(mExpected120Config,
2146 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2147
2148 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2149
2150 EXPECT_EQ(mExpected60Config,
2151 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2152 EXPECT_EQ(mExpected60Config,
2153 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2154}
2155
Marin Shalamanove09237f2021-08-16 18:20:21 +02002156TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
2157 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
2158 auto refreshRateConfigs =
2159 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
2160 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
2161
2162 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 0.5f},
2163 LayerRequirement{.weight = 0.5f}};
2164 auto& explicitDefaultLayer = layers[0];
2165 auto& explicitExactOrMultipleLayer = layers[1];
2166
2167 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2168 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2169 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2170
2171 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
2172 explicitDefaultLayer.name = "ExplicitDefault";
2173 explicitDefaultLayer.desiredRefreshRate = Fps(59.94f);
2174
2175 EXPECT_EQ(mExpected60Config,
2176 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2177}
2178
Ady Abraham03c02082021-09-16 15:58:52 -07002179// b/190578904
2180TEST_F(RefreshRateConfigsTest, getBestRefreshRate_deviceWithCloseRefreshRates) {
2181 constexpr int kMinRefreshRate = 10;
2182 constexpr int kMaxRefreshRate = 240;
2183
2184 DisplayModes displayModes;
2185 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2186 constexpr int32_t kGroup = 0;
2187 const auto refreshRate = Fps(static_cast<float>(fps));
2188 displayModes.push_back(
2189 createDisplayMode(DisplayModeId(fps), kGroup, refreshRate.getPeriodNsecs()));
2190 }
2191
2192 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
2193 auto refreshRateConfigs =
2194 std::make_unique<RefreshRateConfigs>(displayModes,
2195 /*currentConfigId=*/displayModes[0]->getId());
2196
2197 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2198 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
2199 layers[0].desiredRefreshRate = fps;
2200 layers[0].vote = vote;
2201 EXPECT_EQ(fps.getIntValue(),
2202 refreshRateConfigs->getBestRefreshRate(layers, globalSignals)
2203 .getFps()
2204 .getIntValue())
2205 << "Failed for " << RefreshRateConfigs::layerVoteTypeString(vote);
2206 };
2207
2208 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
2209 const auto refreshRate = Fps(static_cast<float>(fps));
2210 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
2211 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
2212 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
2213 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
2214 }
2215}
2216
Ady Abraham76ec9fa2022-01-13 21:58:32 -08002217// b/190578904
2218TEST_F(RefreshRateConfigsTest, getBestRefreshRate_conflictingVotes) {
2219 const DisplayModes displayModes = {
2220 createDisplayMode(DisplayModeId(0), 0, Fps(43.0f).getPeriodNsecs()),
2221 createDisplayMode(DisplayModeId(1), 0, Fps(53.0f).getPeriodNsecs()),
2222 createDisplayMode(DisplayModeId(2), 0, Fps(55.0f).getPeriodNsecs()),
2223 createDisplayMode(DisplayModeId(3), 0, Fps(60.0f).getPeriodNsecs()),
2224 };
2225
2226 const RefreshRateConfigs::GlobalSignals globalSignals = {.touch = false, .idle = false};
2227 auto refreshRateConfigs =
2228 std::make_unique<RefreshRateConfigs>(displayModes,
2229 /*currentConfigId=*/displayModes[0]->getId());
2230
2231 const auto layers = std::vector<LayerRequirement>{
2232 LayerRequirement{
2233 .vote = LayerVoteType::ExplicitDefault,
2234 .desiredRefreshRate = Fps(43.0f),
2235 .seamlessness = Seamlessness::SeamedAndSeamless,
2236 .weight = 0.41f,
2237 },
2238 LayerRequirement{
2239 .vote = LayerVoteType::ExplicitExactOrMultiple,
2240 .desiredRefreshRate = Fps(53.0f),
2241 .seamlessness = Seamlessness::SeamedAndSeamless,
2242 .weight = 0.41f,
2243 },
2244 };
2245
2246 EXPECT_EQ(53,
2247 refreshRateConfigs->getBestRefreshRate(layers, globalSignals).getFps().getIntValue());
2248}
2249
Ana Krulecb9afd792020-06-11 13:16:15 -07002250TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2251 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2252 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2253 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2254}
2255
2256TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2257 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2258
2259 auto refreshRateConfigs =
2260 std::make_unique<RefreshRateConfigs>(m60_90Device,
2261 /*currentConfigId=*/HWC_CONFIG_ID_90);
2262 // SetPolicy(60, 90), current 90Hz => TurnOn.
2263 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2264
2265 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002266 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2267 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002268 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2269
Ady Abrahama91605e2021-06-18 11:41:47 -07002270 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002271 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2272 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002273 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002274
2275 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002276 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2277 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002278 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2279}
2280
TreeHugger Robot758ab612021-06-22 19:17:29 +00002281TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2282 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2283
2284 // Tests with 120Hz
2285 auto refreshRateConfigs =
2286 std::make_unique<RefreshRateConfigs>(m60_120Device,
2287 /*currentConfigId=*/HWC_CONFIG_ID_120);
2288 // SetPolicy(0, 60), current 60Hz => TurnOn.
2289 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2290 0);
2291 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2292
2293 // SetPolicy(60, 60), current 60Hz => TurnOff.
2294 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2295 0);
2296 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2297
2298 // SetPolicy(60, 120), current 60Hz => TurnOn.
2299 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2300 0);
2301 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2302
2303 // SetPolicy(120, 120), current 120Hz => TurnOff.
2304 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2305 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2306 0);
2307 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2308}
2309
Ady Abraham5cc2e262021-03-25 13:09:17 -07002310TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002311 auto refreshRateConfigs =
2312 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2313 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002314
2315 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002316 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2317 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002318
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002319 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002320 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2321 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002322
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002323 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002324 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2325 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002326
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002327 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002328 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2329 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002330
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002331 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002332 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2333 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002334
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002335 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002336 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2337 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
Ady Abraham3819b9f2021-08-20 10:11:31 -07002338
2339 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(25.f)));
2340 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(24.f), Fps(23.976f)));
2341 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(30.f), Fps(29.97f)));
2342 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(Fps(60.f), Fps(59.94f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002343}
2344
Marin Shalamanove09237f2021-08-16 18:20:21 +02002345TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
2346 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.976f), Fps(24.f)));
2347 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(23.976f)));
2348
2349 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(30.f)));
2350 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(29.97f)));
2351
2352 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(60.f)));
2353 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(59.94f)));
2354
2355 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(60.f)));
2356 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(60.f), Fps(29.97f)));
2357
2358 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(59.94f), Fps(30.f)));
2359 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(30.f), Fps(59.94f)));
2360
2361 const std::vector<float> refreshRates = {23.976f, 24.f, 25.f, 29.97f, 30.f, 50.f, 59.94f, 60.f};
2362 for (auto refreshRate : refreshRates) {
2363 EXPECT_FALSE(
2364 RefreshRateConfigs::isFractionalPairOrMultiple(Fps(refreshRate), Fps(refreshRate)));
2365 }
2366
2367 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(24.f), Fps(25.f)));
2368 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(23.978f), Fps(25.f)));
2369 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(Fps(29.97f), Fps(59.94f)));
2370}
2371
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002372TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002373 auto refreshRateConfigs =
2374 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2375 HWC_CONFIG_ID_120);
2376
2377 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002378 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2379 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002380}
2381
2382TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002383 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002384 auto refreshRateConfigs =
2385 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002386 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002387
2388 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2389 layers[0].name = "Test layer";
2390 layers[0].ownerUid = 1234;
2391 layers[0].desiredRefreshRate = Fps(60.0f);
2392 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002393 auto frameRateOverrides =
2394 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002395 ASSERT_EQ(1, frameRateOverrides.size());
2396 ASSERT_EQ(1, frameRateOverrides.count(1234));
2397 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2398
2399 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002400 frameRateOverrides =
2401 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002402 ASSERT_EQ(1, frameRateOverrides.size());
2403 ASSERT_EQ(1, frameRateOverrides.count(1234));
2404 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2405
2406 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002407 frameRateOverrides =
2408 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002409 ASSERT_TRUE(frameRateOverrides.empty());
2410
2411 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002412 frameRateOverrides =
2413 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002414 ASSERT_TRUE(frameRateOverrides.empty());
2415
2416 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002417 frameRateOverrides =
2418 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002419 ASSERT_TRUE(frameRateOverrides.empty());
2420
2421 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002422 frameRateOverrides =
2423 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002424 ASSERT_TRUE(frameRateOverrides.empty());
2425}
2426
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002427TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002428 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002429 auto refreshRateConfigs =
2430 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002431 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002432
2433 auto layers = std::vector<LayerRequirement>{
2434 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2435 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2436 };
2437
2438 layers[0].name = "Test layer 1234";
2439 layers[0].desiredRefreshRate = Fps(60.0f);
2440 layers[0].vote = LayerVoteType::ExplicitDefault;
2441
2442 layers[1].name = "Test layer 5678";
2443 layers[1].desiredRefreshRate = Fps(30.0f);
2444 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002445 auto frameRateOverrides =
2446 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002447
2448 ASSERT_EQ(2, frameRateOverrides.size());
2449 ASSERT_EQ(1, frameRateOverrides.count(1234));
2450 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2451 ASSERT_EQ(1, frameRateOverrides.count(5678));
2452 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2453
2454 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002455 frameRateOverrides =
2456 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002457 ASSERT_EQ(1, frameRateOverrides.size());
2458 ASSERT_EQ(1, frameRateOverrides.count(1234));
2459 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2460
2461 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002462 frameRateOverrides =
2463 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2464 ASSERT_TRUE(frameRateOverrides.empty());
2465}
2466
2467TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002468 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002469 auto refreshRateConfigs =
2470 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002471 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002472
2473 auto layers = std::vector<LayerRequirement>{
2474 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2475 };
2476
2477 layers[0].name = "Test layer";
2478 layers[0].desiredRefreshRate = Fps(60.0f);
2479 layers[0].vote = LayerVoteType::ExplicitDefault;
2480
2481 auto frameRateOverrides =
2482 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2483 ASSERT_EQ(1, frameRateOverrides.size());
2484 ASSERT_EQ(1, frameRateOverrides.count(1234));
2485 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2486
2487 frameRateOverrides =
2488 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2489 ASSERT_EQ(1, frameRateOverrides.size());
2490 ASSERT_EQ(1, frameRateOverrides.count(1234));
2491 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2492
2493 layers[0].vote = LayerVoteType::ExplicitExact;
2494 frameRateOverrides =
2495 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2496 ASSERT_EQ(1, frameRateOverrides.size());
2497 ASSERT_EQ(1, frameRateOverrides.count(1234));
2498 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2499
2500 frameRateOverrides =
2501 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2502 ASSERT_EQ(1, frameRateOverrides.size());
2503 ASSERT_EQ(1, frameRateOverrides.count(1234));
2504 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2505
2506 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2507 frameRateOverrides =
2508 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2509 ASSERT_EQ(1, frameRateOverrides.size());
2510 ASSERT_EQ(1, frameRateOverrides.count(1234));
2511 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2512
2513 frameRateOverrides =
2514 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002515 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002516}
2517
Marin Shalamanov75f37252021-02-10 21:43:57 +01002518TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
2519 auto refreshRateConfigs =
2520 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2521 /*currentConfigId=*/HWC_CONFIG_ID_30);
2522 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
2523 /* allowGroupSwitching */ false,
2524 /* range */ {Fps(30.0f), Fps(30.0f)}});
2525
2526 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
2527
2528 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
2529 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
2530 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
2531
2532 EXPECT_TRUE(
2533 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
2534 EXPECT_TRUE(
2535 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
2536}
2537
Alec Mouri0a1cc962019-03-14 12:33:02 -07002538} // namespace
2539} // namespace scheduler
2540} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002541
2542// TODO(b/129481165): remove the #pragma below and fix conversion issues
2543#pragma clang diagnostic pop // ignored "-Wextra"