blob: 98746bcd219809458d9224245d4b836dd76a9abf [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
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -070024#include <ftl/enum.h>
Alec Mouri0a1cc962019-03-14 12:33:02 -070025#include <gmock/gmock.h>
26#include <log/log.h>
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010027#include <ui/Size.h>
28
Alec Mouri0a1cc962019-03-14 12:33:02 -070029#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070030#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070032
33using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070034
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070035namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070036
Peiyong Line9d809e2020-04-14 13:10:48 -070037namespace hal = android::hardware::graphics::composer::hal;
38
Alec Mouri0a1cc962019-03-14 12:33:02 -070039using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080040using LayerVoteType = RefreshRateConfigs::LayerVoteType;
41using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070042
43class RefreshRateConfigsTest : public testing::Test {
44protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020045 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
46
Alec Mouri0a1cc962019-03-14 12:33:02 -070047 RefreshRateConfigsTest();
48 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070049
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020050 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070051 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020052 }
53
Marin Shalamanove8a663d2020-11-24 17:48:00 +010054 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070055 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
56 }
57
Marin Shalamanove8a663d2020-11-24 17:48:00 +010058 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070059 return refreshRateConfigs.mKnownFrameRates;
60 }
61
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010062 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
63 std::lock_guard lock(refreshRateConfigs.mLock);
64 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
65 }
66
67 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
68 std::lock_guard lock(refreshRateConfigs.mLock);
69 return *refreshRateConfigs.mMinSupportedRefreshRate;
70 }
71
72 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
73 std::lock_guard lock(refreshRateConfigs.mLock);
74 return *refreshRateConfigs.mMaxSupportedRefreshRate;
75 }
76
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020077 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
78 const GetBestRefreshRateInvocation& invocation) {
79 std::lock_guard lock(refreshRateConfigs.mLock);
80 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
81 GetBestRefreshRateInvocation(invocation));
82 }
83
84 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
85 const RefreshRateConfigs& refreshRateConfigs) {
86 std::lock_guard lock(refreshRateConfigs.mLock);
87 return refreshRateConfigs.lastBestRefreshRateInvocation;
88 }
89
Ady Abrahamabc27602020-04-08 17:20:29 -070090 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010091 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
92 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
93 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
94 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
95 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
96 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
97 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +020098 static inline const DisplayModeId HWC_CONFIG_ID_24 = DisplayModeId(7);
99 static inline const DisplayModeId HWC_CONFIG_ID_24_FRAC = DisplayModeId(8);
100 static inline const DisplayModeId HWC_CONFIG_ID_30_FRAC = DisplayModeId(9);
101 static inline const DisplayModeId HWC_CONFIG_ID_60_FRAC = DisplayModeId(10);
Ady Abrahamabc27602020-04-08 17:20:29 -0700102
103 // Test configs
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700104 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, (60_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200105 DisplayModePtr mConfig60Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700106 createDisplayMode(HWC_CONFIG_ID_60_FRAC, 0, (59.94_Hz).getPeriodNsecs());
107 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, (90_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100108 DisplayModePtr mConfig90DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700109 createDisplayMode(HWC_CONFIG_ID_90, 1, (90_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100110 DisplayModePtr mConfig90DifferentResolution =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700111 createDisplayMode(HWC_CONFIG_ID_90, 0, (90_Hz).getPeriodNsecs(), ui::Size(111, 222));
112 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, (72_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100113 DisplayModePtr mConfig72DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700114 createDisplayMode(HWC_CONFIG_ID_72, 1, (72_Hz).getPeriodNsecs());
115 DisplayModePtr mConfig120 = createDisplayMode(HWC_CONFIG_ID_120, 0, (120_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100116 DisplayModePtr mConfig120DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700117 createDisplayMode(HWC_CONFIG_ID_120, 1, (120_Hz).getPeriodNsecs());
118 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, (30_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100119 DisplayModePtr mConfig30DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700120 createDisplayMode(HWC_CONFIG_ID_30, 1, (30_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200121 DisplayModePtr mConfig30Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700122 createDisplayMode(HWC_CONFIG_ID_30_FRAC, 0, (29.97_Hz).getPeriodNsecs());
123 DisplayModePtr mConfig25 = createDisplayMode(HWC_CONFIG_ID_25, 0, (25_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100124 DisplayModePtr mConfig25DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700125 createDisplayMode(HWC_CONFIG_ID_25, 1, (25_Hz).getPeriodNsecs());
126 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, (50_Hz).getPeriodNsecs());
127 DisplayModePtr mConfig24 = createDisplayMode(HWC_CONFIG_ID_24, 0, (24_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200128 DisplayModePtr mConfig24Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700129 createDisplayMode(HWC_CONFIG_ID_24_FRAC, 0, (23.976_Hz).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700130
131 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200132 // The positions of the configs in the arrays below MUST match their IDs. For example,
133 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100134 DisplayModes m60OnlyConfigDevice = {mConfig60};
135 DisplayModes m60_90Device = {mConfig60, mConfig90};
136 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
137 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
138 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
139 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
140 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
141 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
142 mConfig120DifferentGroup, mConfig30};
143 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
144 mConfig30};
145 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
146 mConfig120DifferentGroup, mConfig30};
147 DisplayModes m25_30_50_60Device = {mConfig60,
148 mConfig90,
149 mConfig72DifferentGroup,
150 mConfig120DifferentGroup,
151 mConfig30DifferentGroup,
152 mConfig25DifferentGroup,
153 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700154 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700155
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200156 // This is a typical TV configuration.
157 DisplayModes m24_25_30_50_60WithFracDevice = {mConfig24, mConfig24Frac, mConfig25,
158 mConfig30, mConfig30Frac, mConfig50,
159 mConfig60, mConfig60Frac};
160
Ady Abrahamabc27602020-04-08 17:20:29 -0700161 // Expected RefreshRate objects
Ady Abraham6b7ad652021-06-23 17:34:57 -0700162 RefreshRate mExpected60Config = {mConfig60, RefreshRate::ConstructorTag(0)};
163 RefreshRate mExpectedAlmost60Config = {createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
164 RefreshRate::ConstructorTag(0)};
165 RefreshRate mExpected90Config = {mConfig90, RefreshRate::ConstructorTag(0)};
166 RefreshRate mExpected90DifferentGroupConfig = {mConfig90DifferentGroup,
167 RefreshRate::ConstructorTag(0)};
168 RefreshRate mExpected90DifferentResolutionConfig = {mConfig90DifferentResolution,
Ady Abrahamabc27602020-04-08 17:20:29 -0700169 RefreshRate::ConstructorTag(0)};
Ady Abraham6b7ad652021-06-23 17:34:57 -0700170 RefreshRate mExpected72Config = {mConfig72, RefreshRate::ConstructorTag(0)};
171 RefreshRate mExpected30Config = {mConfig30, RefreshRate::ConstructorTag(0)};
172 RefreshRate mExpected120Config = {mConfig120, RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700173
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100174 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
175 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700176};
177
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100178using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700179
Alec Mouri0a1cc962019-03-14 12:33:02 -0700180RefreshRateConfigsTest::RefreshRateConfigsTest() {
181 const ::testing::TestInfo* const test_info =
182 ::testing::UnitTest::GetInstance()->current_test_info();
183 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
184}
185
186RefreshRateConfigsTest::~RefreshRateConfigsTest() {
187 const ::testing::TestInfo* const test_info =
188 ::testing::UnitTest::GetInstance()->current_test_info();
189 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
190}
191
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100192DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
193 int64_t vsyncPeriod, ui::Size resolution) {
194 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
195 .setId(modeId)
Ady Abraham5e7ee862021-06-23 17:43:41 -0700196 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
Ady Abrahamabc27602020-04-08 17:20:29 -0700197 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100198 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100199 .setHeight(resolution.height)
200 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700201 .build();
202}
203
Alec Mouri0a1cc962019-03-14 12:33:02 -0700204namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700205
Ady Abraham2139f732019-11-13 18:56:40 -0800206TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700207 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700208 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
209 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700210}
211
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100212TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100213 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700214 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
215 /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700216 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
217 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100218}
219
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700220TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700221 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700222 std::make_unique<RefreshRateConfigs>(m60_90Device,
223 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700224
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100225 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
226 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700227
Ady Abrahamabc27602020-04-08 17:20:29 -0700228 ASSERT_EQ(mExpected60Config, minRate);
229 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800230
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100231 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800232 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800233 ASSERT_EQ(minRateByPolicy, minRate);
234 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700235}
Ady Abraham2139f732019-11-13 18:56:40 -0800236
237TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800238 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700239 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
240 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800241
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100242 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
243 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
244 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800245 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Ady Abrahamabc27602020-04-08 17:20:29 -0700247 ASSERT_EQ(mExpected60Config, minRate);
248 ASSERT_EQ(mExpected60Config, minRate60);
249 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800250
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700251 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60_Hz, 90_Hz}}), 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100252 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800253
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100254 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800255 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Ady Abrahamabc27602020-04-08 17:20:29 -0700257 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
258 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
259 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
260}
261
262TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
263 auto refreshRateConfigs =
264 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
265 /*currentConfigId=*/HWC_CONFIG_ID_60);
266
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100267 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
268 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
269 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700270 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
271
272 ASSERT_EQ(mExpected60Config, minRate);
273 ASSERT_EQ(mExpected60Config, minRate60);
274 ASSERT_EQ(mExpected60Config, performanceRate60);
275
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700276 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60_Hz, 90_Hz}}), 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100277 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700278
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100279 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700280 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
281
282 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
283 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
284 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800285}
286
287TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800288 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700289 std::make_unique<RefreshRateConfigs>(m60_90Device,
290 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800291
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100292 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
293 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800294
Ady Abrahamabc27602020-04-08 17:20:29 -0700295 ASSERT_EQ(mExpected60Config, minRate);
296 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800297
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700298 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800299
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100300 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
301 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700302 ASSERT_EQ(mExpected60Config, minRate60);
303 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800304}
305
306TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800307 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700308 std::make_unique<RefreshRateConfigs>(m60_90Device,
309 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800310 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100311 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100312 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800313 }
314
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100315 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800316 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100317 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100318 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800319 }
320
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700321 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800322 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100323 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100324 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800325 }
326}
327
Steven Thomasbb374322020-04-28 22:47:16 -0700328TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700329 auto refreshRateConfigs =
330 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
331 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800332
Steven Thomasdebafed2020-05-18 17:30:35 -0700333 // If there are no layers we select the default frame rate, which is the max of the primary
334 // range.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700335 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate({}, {}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800336
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700337 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}),
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200338 NO_ERROR);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700339 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate({}, {}));
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200340
341 // We select max even when this will cause a non-seamless switch.
342 refreshRateConfigs = std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
343 /*currentConfigId=*/HWC_CONFIG_ID_60);
344 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700345 {HWC_CONFIG_ID_90, /*allowGroupSwitching*/ true, {0_Hz, 90_Hz}}),
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200346 NO_ERROR);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700347 EXPECT_EQ(mExpected90DifferentGroupConfig, refreshRateConfigs->getBestRefreshRate({}, {}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800348}
349
Steven Thomasbb374322020-04-28 22:47:16 -0700350TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700352 std::make_unique<RefreshRateConfigs>(m60_90Device,
353 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800354
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700355 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800356 auto& lr = layers[0];
357
358 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800359 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700360 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800361
362 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800363 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700364 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700366 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800367 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800368 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700369 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700371 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800372 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700373 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700375 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800376 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700377 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800378
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700379 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800380 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700381 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800382
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700383 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800384 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700385 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700388 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800389
390 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700391 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
393 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700394 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700396 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800397 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700398 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700400 lr.desiredRefreshRate = 60_Hz;
401 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700403 lr.desiredRefreshRate = 45_Hz;
404 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700406 lr.desiredRefreshRate = 30_Hz;
407 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700409 lr.desiredRefreshRate = 24_Hz;
410 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700412 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
414 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700415 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
417 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700418 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800419
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700420 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700422 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700424 lr.desiredRefreshRate = 60_Hz;
425 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800426
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700427 lr.desiredRefreshRate = 45_Hz;
428 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700430 lr.desiredRefreshRate = 30_Hz;
431 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700433 lr.desiredRefreshRate = 24_Hz;
434 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800435
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700436 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700438 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800439
440 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700441 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700443 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800444 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700445 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700447 lr.desiredRefreshRate = 60_Hz;
448 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700450 lr.desiredRefreshRate = 45_Hz;
451 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700453 lr.desiredRefreshRate = 30_Hz;
454 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800455
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700456 lr.desiredRefreshRate = 24_Hz;
457 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800458}
459
rnlee3bd610662021-06-23 16:27:57 -0700460TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
461 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
462 auto refreshRateConfigs =
463 std::make_unique<RefreshRateConfigs>(m60_90Device,
464 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
465
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700466 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700467 auto& lr = layers[0];
468
469 lr.vote = LayerVoteType::Min;
470 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700471 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700472
473 lr.vote = LayerVoteType::Max;
474 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700475 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700476
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700477 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700478 lr.vote = LayerVoteType::Heuristic;
479 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700480 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700481
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700482 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700483 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700484 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700485
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700486 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700487 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700488 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700489
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700490 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700491 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700492 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700493
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700494 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700495 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700496 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700497}
498
Steven Thomasbb374322020-04-28 22:47:16 -0700499TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800500 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700501 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
502 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800503
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700504 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800505 auto& lr = layers[0];
506
507 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700508 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800509
510 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700511 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800512
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700513 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800514 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700515 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800516
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700517 lr.desiredRefreshRate = 60_Hz;
518 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800519
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700520 lr.desiredRefreshRate = 45_Hz;
521 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800522
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700523 lr.desiredRefreshRate = 30_Hz;
524 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800525
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700526 lr.desiredRefreshRate = 24_Hz;
527 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800528}
529
Steven Thomasbb374322020-04-28 22:47:16 -0700530TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800531 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700532 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
533 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800534
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700535 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800536 auto& lr1 = layers[0];
537 auto& lr2 = layers[1];
538
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700539 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800540 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700541 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800542 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700543 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800544
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700545 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800546 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700547 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700549 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800550
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700551 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800552 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700553 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700555 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800556}
557
Steven Thomasbb374322020-04-28 22:47:16 -0700558TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800559 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700560 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
561 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800562
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700563 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800564 auto& lr1 = layers[0];
565 auto& lr2 = layers[1];
566
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700567 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800568 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800569 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700570 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800572 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700573 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800574
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700575 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800576 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800577 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700578 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800579 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800580 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700581 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800582
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700583 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800584 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800585 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700586 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800587 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800588 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700589 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800590
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700591 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800592 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800593 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700594 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800595 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800596 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700597 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800598
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700599 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800600 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
601 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700602 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800603 lr2.vote = LayerVoteType::ExplicitDefault;
604 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700605 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800606
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700607 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800608 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800609 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700610 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800611 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700613 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800614
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700615 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800616 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800617 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700618 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800620 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700621 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800622
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700623 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800624 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800625 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700626 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700629 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800630
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700631 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800632 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800633 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700634 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800635 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800636 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700637 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800638}
639
rnlee3bd610662021-06-23 16:27:57 -0700640TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
641 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
642 auto refreshRateConfigs =
643 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
644 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
645
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700646 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700647 auto& lr1 = layers[0];
648 auto& lr2 = layers[1];
649
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700650 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700651 lr1.vote = LayerVoteType::ExplicitDefault;
652 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700653 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700654 lr2.vote = LayerVoteType::Heuristic;
655 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700656 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700657
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700658 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700659 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
660 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700661 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700662 lr2.vote = LayerVoteType::Heuristic;
663 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700664 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700665
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700666 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700667 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
668 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700669 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700670 lr2.vote = LayerVoteType::ExplicitDefault;
671 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700672 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700673
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700674 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700675 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
676 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700677 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700678 lr2.vote = LayerVoteType::Heuristic;
679 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700680 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700681
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700682 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700683 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
684 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700685 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700686 lr2.vote = LayerVoteType::ExplicitDefault;
687 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700688 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700689
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700690 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700691 lr1.vote = LayerVoteType::ExplicitDefault;
692 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700693 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700694 lr2.vote = LayerVoteType::Heuristic;
695 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700696 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700697
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700698 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700699 lr1.vote = LayerVoteType::Heuristic;
700 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700701 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700702 lr2.vote = LayerVoteType::ExplicitDefault;
703 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700704 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700705
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700706 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700707 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
708 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700709 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700710 lr2.vote = LayerVoteType::ExplicitDefault;
711 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700712 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700713
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700714 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700715 lr1.vote = LayerVoteType::ExplicitDefault;
716 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700717 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700718 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
719 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700720 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700721}
722
Steven Thomasbb374322020-04-28 22:47:16 -0700723TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800724 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700725 std::make_unique<RefreshRateConfigs>(m30_60Device,
726 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800727
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700728 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800729 auto& lr = layers[0];
730
731 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700732 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800733
734 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700735 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800736
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700737 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800738 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700739 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800740
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700741 lr.desiredRefreshRate = 60_Hz;
742 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800743
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700744 lr.desiredRefreshRate = 45_Hz;
745 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800746
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700747 lr.desiredRefreshRate = 30_Hz;
748 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800749
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700750 lr.desiredRefreshRate = 24_Hz;
751 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752}
753
Steven Thomasbb374322020-04-28 22:47:16 -0700754TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700756 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
757 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800758
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700759 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800760 auto& lr = layers[0];
761
762 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800763 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700764 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800765
766 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800767 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700768 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800769
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700770 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800772 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700773 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800774
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700775 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800776 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700777 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
778 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800779
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700780 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800781 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700782 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
783 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800784
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700785 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800786 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700787 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
788 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800789
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700790 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800791 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700792 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
793 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800794
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700795 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800796 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
797 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700798 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
799 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800800}
801
Steven Thomasbb374322020-04-28 22:47:16 -0700802TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800803 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700804 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
805 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700807 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800808 auto& lr1 = layers[0];
809 auto& lr2 = layers[1];
810
811 lr1.vote = LayerVoteType::Min;
812 lr2.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700813 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814
815 lr1.vote = LayerVoteType::Min;
816 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700817 lr2.desiredRefreshRate = 24_Hz;
818 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819
820 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800821 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700822 lr2.desiredRefreshRate = 24_Hz;
823 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
825 lr1.vote = LayerVoteType::Max;
826 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700827 lr2.desiredRefreshRate = 60_Hz;
828 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800829
830 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800831 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700832 lr2.desiredRefreshRate = 60_Hz;
833 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834
835 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700836 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800837 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700838 lr2.desiredRefreshRate = 45_Hz;
839 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840
841 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700842 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800843 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700844 lr2.desiredRefreshRate = 45_Hz;
845 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800846}
847
Steven Thomasbb374322020-04-28 22:47:16 -0700848TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800849 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700850 std::make_unique<RefreshRateConfigs>(m60_90Device,
851 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800852
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700853 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800854 auto& lr = layers[0];
855
Ady Abraham71c437d2020-01-31 15:56:57 -0800856 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800857 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700858 lr.desiredRefreshRate = Fps::fromValue(fps);
859 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
860 EXPECT_EQ(mExpected60Config, refreshRate)
861 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800862 }
863}
864
rnlee3bd610662021-06-23 16:27:57 -0700865TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
866 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
867 auto refreshRateConfigs =
868 std::make_unique<RefreshRateConfigs>(m60_120Device,
869 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
870
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700871 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700872 auto& lr = layers[0];
873
874 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
875 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700876 lr.desiredRefreshRate = Fps::fromValue(fps);
877 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
878 EXPECT_EQ(mExpected60Config, refreshRate)
879 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
rnlee3bd610662021-06-23 16:27:57 -0700880 }
881}
882
Steven Thomasbb374322020-04-28 22:47:16 -0700883TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800884 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700885 std::make_unique<RefreshRateConfigs>(m60_90Device,
886 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800887
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700888 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800889 auto& lr1 = layers[0];
890 auto& lr2 = layers[1];
891
892 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700893 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800894 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700895 lr2.desiredRefreshRate = 90_Hz;
896 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800897
898 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700899 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700901 lr2.desiredRefreshRate = 60_Hz;
902 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800903
904 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700905 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800906 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700907 lr2.desiredRefreshRate = 60_Hz;
908 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham2139f732019-11-13 18:56:40 -0800909}
910
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800911TEST_F(RefreshRateConfigsTest, testInPolicy) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700912 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004_Hz, 60.000004_Hz));
913 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59_Hz, 60.1_Hz));
914 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75_Hz, 90_Hz));
915 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011_Hz, 90_Hz));
916 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50_Hz, 59.998_Hz));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800917}
918
Steven Thomasbb374322020-04-28 22:47:16 -0700919TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800920 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700921 std::make_unique<RefreshRateConfigs>(m60_90Device,
922 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800923
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700924 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800925 auto& lr = layers[0];
926
Ady Abraham71c437d2020-01-31 15:56:57 -0800927 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800928 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700929 lr.desiredRefreshRate = Fps::fromValue(fps);
930 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
931 EXPECT_EQ(mExpected90Config, refreshRate)
932 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800933 }
934}
935
Steven Thomasbb374322020-04-28 22:47:16 -0700936TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800937 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700938 std::make_unique<RefreshRateConfigs>(m60_90Device,
939 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800940
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700941 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800942 auto& lr1 = layers[0];
943 auto& lr2 = layers[1];
944
945 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700946 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800947 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800948 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700949 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800950 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700951 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800952
953 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700954 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800955 lr1.name = "60Hz ExplicitExactOrMultiple";
956 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700957 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700959 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800960
961 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700962 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800963 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800964 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800965 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700966 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800967
968 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700969 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800970 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800971 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700972 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800973 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700974 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800975
976 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700977 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800978 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800979 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800980 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700981 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800982}
983
984TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800985 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700986 std::make_unique<RefreshRateConfigs>(m60_90Device,
987 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800988
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700989 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800990 auto& lr1 = layers[0];
991 auto& lr2 = layers[1];
992
993 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700994 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800995 lr1.name = "60Hz ExplicitExactOrMultiple";
996 lr2.vote = LayerVoteType::NoVote;
997 lr2.name = "NoVote";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700998 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800999
1000 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001001 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001002 lr1.name = "60Hz ExplicitExactOrMultiple";
1003 lr2.vote = LayerVoteType::NoVote;
1004 lr2.name = "NoVote";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001005 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001006
1007 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001008 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001009 lr1.name = "60Hz ExplicitExactOrMultiple";
1010 lr2.vote = LayerVoteType::Max;
1011 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001012 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001013
1014 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001015 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001016 lr1.name = "60Hz ExplicitExactOrMultiple";
1017 lr2.vote = LayerVoteType::Max;
1018 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001019 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001020
1021 // The other layer starts to provide buffers
1022 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001023 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001024 lr1.name = "60Hz ExplicitExactOrMultiple";
1025 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001026 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001027 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001028 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001029}
1030
1031TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001032 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001033 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001034 std::make_unique<RefreshRateConfigs>(m60_90Device,
1035 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001036
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001037 refreshRateConfigs->getBestRefreshRate({}, {}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001038 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001039
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001040 refreshRateConfigs->getBestRefreshRate({}, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001041 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001042
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001043 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001044 auto& lr1 = layers[0];
1045 auto& lr2 = layers[1];
1046
1047 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001048 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001049 lr1.name = "60Hz ExplicitExactOrMultiple";
1050 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001051 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001052 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001053 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001054 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001055
1056 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001057 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001058 lr1.name = "60Hz ExplicitExactOrMultiple";
1059 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001060 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001061 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001062 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001063 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001064
1065 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001066 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001067 lr1.name = "60Hz ExplicitExactOrMultiple";
1068 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001069 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001070 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001071 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001072 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001073
1074 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001075 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001076 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001077 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001078 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001079 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001081 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001082}
1083
Steven Thomasbb374322020-04-28 22:47:16 -07001084TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001085 auto refreshRateConfigs =
1086 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1087 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001088
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001089 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001090 auto& lr = layers[0];
1091
1092 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001093 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1094 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001095
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001096 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001097
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001098 {80_Hz, 72_Hz}, {73_Hz, 72_Hz}, {72_Hz, 72_Hz}, {71_Hz, 72_Hz}, {70_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001099
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001100 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001101
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001102 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001103
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001104 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001105
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001106 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001107
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001108 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001109 };
1110
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001111 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001112 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001113 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001114
1115 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001116 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001117 lr.name = ss.str();
1118
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001119 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
1120 EXPECT_EQ(refreshRate.getFps(), expected);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001121 }
1122}
1123
1124TEST_F(RefreshRateConfigsTest,
1125 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001126 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001127 auto& lr = layers[0];
1128
1129 // Test that 23.976 will choose 24 if 23.976 is not supported
1130 {
1131 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1132 mConfig30Frac, mConfig60, mConfig60Frac};
1133 auto refreshRateConfigs =
1134 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1135
1136 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001137 lr.desiredRefreshRate = 23.976_Hz;
1138 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
1139 EXPECT_EQ(HWC_CONFIG_ID_24, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001140 }
1141
1142 // Test that 24 will choose 23.976 if 24 is not supported
1143 {
1144 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1145 mConfig30Frac, mConfig60, mConfig60Frac};
1146 auto refreshRateConfigs =
1147 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001148 lr.desiredRefreshRate = 24_Hz;
1149 lr.name = "ExplicitExactOrMultiple 24 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001150 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001151 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001152 }
1153
1154 // Test that 29.97 will prefer 59.94 over 60 and 30
1155 {
1156 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1157 mConfig30, mConfig60, mConfig60Frac};
1158 auto refreshRateConfigs =
1159 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001160 lr.desiredRefreshRate = 29.97_Hz;
1161 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001162 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001163 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001164 }
1165}
1166
1167TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001168 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001169 auto& lr = layers[0];
1170
1171 // Test that voting for supported refresh rate will select this refresh rate
1172 {
1173 auto refreshRateConfigs =
1174 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1175 /*currentConfigId=*/HWC_CONFIG_ID_60);
1176
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001177 for (auto desired : {23.976_Hz, 24_Hz, 25_Hz, 29.97_Hz, 30_Hz, 50_Hz, 59.94_Hz, 60_Hz}) {
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001178 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001179 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001180 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001181 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001182 lr.name = ss.str();
1183
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001184 auto selectedRefreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
1185 EXPECT_EQ(selectedRefreshRate.getFps(), lr.desiredRefreshRate);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001186 }
1187 }
1188
1189 // Test that 23.976 will choose 24 if 23.976 is not supported
1190 {
1191 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1192 mConfig30Frac, mConfig60, mConfig60Frac};
1193 auto refreshRateConfigs =
1194 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1195 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001196 lr.desiredRefreshRate = 23.976_Hz;
1197 lr.name = "ExplicitExact 23.976 Hz";
1198 EXPECT_EQ(HWC_CONFIG_ID_24, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001199 }
1200
1201 // Test that 24 will choose 23.976 if 24 is not supported
1202 {
1203 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1204 mConfig30Frac, mConfig60, mConfig60Frac};
1205 auto refreshRateConfigs =
1206 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001207 lr.desiredRefreshRate = 24_Hz;
1208 lr.name = "ExplicitExact 24 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001209 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001210 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001211 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001212}
1213
Alec Mouri11232a22020-05-14 18:06:25 -07001214TEST_F(RefreshRateConfigsTest,
1215 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1216 auto refreshRateConfigs =
1217 std::make_unique<RefreshRateConfigs>(m60_90Device,
1218 /*currentConfigId=*/HWC_CONFIG_ID_90);
1219
1220 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001221 {HWC_CONFIG_ID_90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001222 0);
1223
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001224 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001225 auto& lr = layers[0];
1226
Ady Abrahamdfd62162020-06-10 16:11:56 -07001227 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001228 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001229 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001230 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001231 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001232 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001233 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1234 &consideredSignals));
1235 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001236}
1237
1238TEST_F(RefreshRateConfigsTest,
1239 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1240 auto refreshRateConfigs =
1241 std::make_unique<RefreshRateConfigs>(m60_90Device,
1242 /*currentConfigId=*/HWC_CONFIG_ID_60);
1243
1244 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001245 {HWC_CONFIG_ID_60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001246 0);
1247
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001248 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001249 auto& lr = layers[0];
1250
Alec Mouri11232a22020-05-14 18:06:25 -07001251 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001252 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001253 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001254 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001255 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001256}
1257
1258TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001259 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001260 auto refreshRateConfigs =
1261 std::make_unique<RefreshRateConfigs>(m60_90Device,
1262 /*currentConfigId=*/HWC_CONFIG_ID_90);
1263
1264 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001265 {HWC_CONFIG_ID_90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001266 0);
1267
Ady Abrahamdfd62162020-06-10 16:11:56 -07001268 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001269 EXPECT_EQ(mExpected90Config,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001270 refreshRateConfigs->getBestRefreshRate({}, {}, &consideredSignals));
Ady Abrahamdfd62162020-06-10 16:11:56 -07001271 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001272
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001273 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001274 auto& lr = layers[0];
1275
1276 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001277 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001278 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001279 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001280 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001281
1282 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001283 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001284
1285 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001286 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001287 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001288 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001289 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001290
1291 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001292 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001293
1294 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001295 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001296 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001297 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001298 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001299
1300 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001301 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001302
1303 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001304 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001305 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001306 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001307 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001308
1309 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001310 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001311
1312 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001313 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001314 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001315 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001316 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001317
1318 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001319 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001320}
1321
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001322TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001323 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001324 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1325 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001326
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001327 // The default policy doesn't allow group switching. Verify that no
1328 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001329 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001330 auto& layer = layers[0];
1331 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001332 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001333 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001334 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001335 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001336
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001337 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001338}
Steven Thomasd4071902020-03-24 16:02:53 -07001339
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001340TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1341 auto refreshRateConfigs =
1342 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1343 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001344 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001345 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001346 policy.allowGroupSwitching = true;
1347 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001348
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001349 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001350 auto& layer = layers[0];
1351 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001352 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001353 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1354 layer.name = "90Hz ExplicitDefault";
1355 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001356 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001357}
1358
1359TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1360 auto refreshRateConfigs =
1361 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1362 /*currentConfigId=*/HWC_CONFIG_ID_60);
1363 RefreshRateConfigs::Policy policy;
1364 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1365 policy.allowGroupSwitching = true;
1366 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001367
1368 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001369 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001370 auto& layer = layers[0];
1371 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001372 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001373 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001374 layer.name = "90Hz ExplicitDefault";
1375 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001376 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001377}
1378
1379TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1380 auto refreshRateConfigs =
1381 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1382 /*currentConfigId=*/HWC_CONFIG_ID_60);
1383 RefreshRateConfigs::Policy policy;
1384 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1385 policy.allowGroupSwitching = true;
1386 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1387
1388 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001389
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001390 // Verify that we won't do a seamless switch if we request the same mode as the default
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001391 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001392 auto& layer = layers[0];
1393 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001394 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001395 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001396 layer.name = "60Hz ExplicitDefault";
1397 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001398 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001399}
1400
1401TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1402 auto refreshRateConfigs =
1403 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1404 /*currentConfigId=*/HWC_CONFIG_ID_60);
1405 RefreshRateConfigs::Policy policy;
1406 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1407 policy.allowGroupSwitching = true;
1408 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1409
1410 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001411
1412 // Verify that if the current config is in another group and there are no layers with
1413 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001414
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001415 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001416 auto& layer = layers[0];
1417 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001418 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001419 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001420 layer.name = "60Hz ExplicitDefault";
1421 layer.focused = true;
1422
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001423 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001424}
1425
1426TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1427 auto refreshRateConfigs =
1428 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1429 /*currentConfigId=*/HWC_CONFIG_ID_60);
1430 RefreshRateConfigs::Policy policy;
1431 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1432 policy.allowGroupSwitching = true;
1433 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1434
1435 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001436
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001437 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001438 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001439 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001440 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001441 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001442 layers[0].seamlessness = Seamlessness::OnlySeamless;
1443 layers[0].name = "60Hz ExplicitDefault";
1444 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001445
1446 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001447 layers[1].vote = LayerVoteType::ExplicitDefault;
1448 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001449 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001450 layers[1].name = "90Hz ExplicitDefault";
1451 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001452
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001453 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001454}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001455
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001456TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001457 auto refreshRateConfigs =
1458 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1459 /*currentConfigId=*/HWC_CONFIG_ID_60);
1460 RefreshRateConfigs::Policy policy;
1461 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1462 policy.allowGroupSwitching = true;
1463 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1464
1465 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001466
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001467 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1468 // seamlessness=Default can't change the mode group back to the group of the default
1469 // mode.
1470 // For example, this may happen when a video playback requests and gets a seamed switch,
1471 // but another layer (with default seamlessness) starts animating. The animating layer
1472 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001473 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001474 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001475 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001476 layers[0].focused = true;
1477 layers[0].vote = LayerVoteType::ExplicitDefault;
1478 layers[0].name = "60Hz ExplicitDefault";
1479
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001480 layers.push_back(LayerRequirement{.weight = 0.1f});
1481 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001482 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001483 layers[1].focused = true;
1484 layers[1].vote = LayerVoteType::ExplicitDefault;
1485 layers[1].name = "90Hz ExplicitDefault";
1486
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001487 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001488}
1489
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001490TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1491 auto refreshRateConfigs =
1492 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1493 /*currentConfigId=*/HWC_CONFIG_ID_60);
1494 RefreshRateConfigs::Policy policy;
1495 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1496 policy.allowGroupSwitching = true;
1497 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1498
1499 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1500
1501 // Layer with seamlessness=Default can change the mode group if there's a not
1502 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1503 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001504 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001505 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001506 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001507 layers[0].focused = true;
1508 layers[0].vote = LayerVoteType::ExplicitDefault;
1509 layers[0].name = "60Hz ExplicitDefault";
1510
1511 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001512 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001513 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001514 layers[1].focused = false;
1515 layers[1].vote = LayerVoteType::ExplicitDefault;
1516 layers[1].name = "90Hz ExplicitDefault";
1517
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001518 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001519}
1520
1521TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1522 auto refreshRateConfigs =
1523 std::make_unique<RefreshRateConfigs>(m30_60Device,
1524 /*currentConfigId=*/HWC_CONFIG_ID_60);
1525
1526 // Allow group switching.
1527 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001528 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001529 policy.allowGroupSwitching = true;
1530 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1531
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001532 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001533 auto& layer = layers[0];
1534 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001535 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001536 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001537 layer.name = "60Hz ExplicitExactOrMultiple";
1538 layer.focused = true;
1539
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001540 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001541
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001542 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001543 ASSERT_EQ(HWC_CONFIG_ID_120, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001544}
1545
1546TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1547 auto refreshRateConfigs =
1548 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1549 /*currentConfigId=*/HWC_CONFIG_ID_60);
1550
1551 // Allow group switching.
1552 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001553 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001554 policy.allowGroupSwitching = true;
1555 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1556
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001557 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1558 .vote = LayerVoteType::ExplicitDefault,
1559 .desiredRefreshRate = 60_Hz,
1560 .seamlessness = Seamlessness::SeamedAndSeamless,
1561 .weight = 0.5f,
1562 .focused = false},
1563 {.name = "25Hz ExplicitExactOrMultiple",
1564 .vote = LayerVoteType::ExplicitExactOrMultiple,
1565 .desiredRefreshRate = 25_Hz,
1566 .seamlessness = Seamlessness::OnlySeamless,
1567 .weight = 1.f,
1568 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001569
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001570 ASSERT_EQ(HWC_CONFIG_ID_50, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001571
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001572 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001573 seamedLayer.desiredRefreshRate = 30_Hz;
1574 seamedLayer.name = "30Hz ExplicitDefault";
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001575 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001576
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001577 ASSERT_EQ(HWC_CONFIG_ID_25, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001578}
1579
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001580TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1581 auto refreshRateConfigs =
1582 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1583 /*currentConfigId=*/HWC_CONFIG_ID_90);
1584
1585 // Allow group switching.
1586 RefreshRateConfigs::Policy policy;
1587 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1588 policy.allowGroupSwitching = true;
1589 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1590
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001591 std::vector<LayerRequirement> layers = {
1592 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001593
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001594 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001595}
1596
Steven Thomasf734df42020-04-13 21:09:28 -07001597TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1598 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001599 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001600 /*currentConfigId=*/HWC_CONFIG_ID_60);
1601
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001602 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001603 layers[0].name = "Test layer";
1604
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001605 struct Args {
1606 bool touch = false;
1607 bool focused = true;
1608 };
1609
Steven Thomasbb374322020-04-28 22:47:16 -07001610 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001611 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001612 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001613 layers[0].vote = voteType;
1614 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001615 layers[0].focused = args.focused;
1616 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = args.touch}).getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001617 };
1618
1619 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001620 {HWC_CONFIG_ID_60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001621 0);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001622 EXPECT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate({}, {}).getModeId());
1623 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1624 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90_Hz));
1625 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz));
1626 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1627 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1628 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001629
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001630 // Unfocused layers are not allowed to override primary config.
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001631 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001632 getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001633 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001634 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001635
Steven Thomasf734df42020-04-13 21:09:28 -07001636 // Touch boost should be restricted to the primary range.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001637 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001638 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1639 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001640 EXPECT_EQ(HWC_CONFIG_ID_90,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001641 getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
Ady Abraham20c029c2020-07-06 12:58:05 -07001642 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001643 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001644
1645 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001646 {HWC_CONFIG_ID_60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001647 0);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001648 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1649 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90_Hz));
1650 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz));
1651 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1652 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1653 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001654}
1655
Steven Thomasbb374322020-04-28 22:47:16 -07001656TEST_F(RefreshRateConfigsTest, idle) {
1657 auto refreshRateConfigs =
1658 std::make_unique<RefreshRateConfigs>(m60_90Device,
1659 /*currentConfigId=*/HWC_CONFIG_ID_60);
1660
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001661 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001662 layers[0].name = "Test layer";
1663
Marin Shalamanov23c44202020-12-22 19:09:20 +01001664 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001665 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001666 layers[0].desiredRefreshRate = 90_Hz;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001667 RefreshRateConfigs::GlobalSignals consideredSignals;
1668 const auto configId =
1669 refreshRateConfigs
1670 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1671 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001672 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001673 // Refresh rate will be chosen by either touch state or idle state
1674 EXPECT_EQ(!touchActive, consideredSignals.idle);
1675 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001676 };
1677
1678 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001679 {HWC_CONFIG_ID_60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001680 0);
1681
1682 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001683 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1684 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1685 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1686 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1687 EXPECT_EQ(HWC_CONFIG_ID_90,
1688 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1689 EXPECT_EQ(HWC_CONFIG_ID_90,
1690 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001691
1692 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001693 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001694 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001695 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001696
1697 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001698 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001699 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1700 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1701 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1702 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1703 EXPECT_EQ(HWC_CONFIG_ID_60,
1704 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1705 EXPECT_EQ(HWC_CONFIG_ID_60,
1706 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001707
1708 // Idle should be applied rather than the current config when there are no layers.
1709 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001710 refreshRateConfigs->getBestRefreshRate({}, {.idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001711}
1712
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001713TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1714 auto refreshRateConfigs =
1715 std::make_unique<RefreshRateConfigs>(m60_90Device,
1716 /*currentConfigId=*/HWC_CONFIG_ID_60);
1717
1718 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001719 const auto knownFrameRate =
1720 findClosestKnownFrameRate(*refreshRateConfigs, Fps::fromValue(fps));
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001721 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001722 if (fps < 26.91f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001723 expectedFrameRate = 24_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001724 } else if (fps < 37.51f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001725 expectedFrameRate = 30_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001726 } else if (fps < 52.51f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001727 expectedFrameRate = 45_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001728 } else if (fps < 66.01f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001729 expectedFrameRate = 60_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001730 } else if (fps < 81.01f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001731 expectedFrameRate = 72_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001732 } else {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001733 expectedFrameRate = 90_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001734 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001735 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001736 }
1737}
1738
1739TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001740 auto refreshRateConfigs =
1741 std::make_unique<RefreshRateConfigs>(m60_90Device,
1742 /*currentConfigId=*/HWC_CONFIG_ID_60);
1743
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001744 struct Expectation {
1745 Fps fps;
1746 const RefreshRate& refreshRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001747 };
1748
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001749 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
1750 {24_Hz, mExpected60Config}, {30_Hz, mExpected60Config}, {45_Hz, mExpected90Config},
1751 {60_Hz, mExpected60Config}, {72_Hz, mExpected90Config}, {90_Hz, mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001752 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001753
1754 // Make sure the test tests all the known frame rate
1755 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001756 const bool equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1757 knownFrameRatesExpectations.begin(),
1758 [](Fps fps, const Expectation& expected) {
1759 return isApproxEqual(fps, expected.fps);
1760 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001761 EXPECT_TRUE(equal);
1762
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001763 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001764 auto& layer = layers[0];
1765 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001766
1767 for (const auto& [fps, refreshRate] : knownFrameRatesExpectations) {
1768 layer.desiredRefreshRate = fps;
1769 EXPECT_EQ(refreshRate, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001770 }
1771}
1772
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001773TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1774 auto refreshRateConfigs =
1775 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1776 /*currentConfigId=*/HWC_CONFIG_ID_60);
1777
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001778 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001779 auto& explicitExactLayer = layers[0];
1780 auto& explicitExactOrMultipleLayer = layers[1];
1781
1782 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1783 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001784 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001785
1786 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1787 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001788 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001789
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001790 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1791 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001792
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001793 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1794 explicitExactLayer.desiredRefreshRate = 60_Hz;
1795 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001796
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001797 explicitExactLayer.desiredRefreshRate = 72_Hz;
1798 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001799
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001800 explicitExactLayer.desiredRefreshRate = 90_Hz;
1801 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001802
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001803 explicitExactLayer.desiredRefreshRate = 120_Hz;
1804 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001805}
1806
1807TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07001808 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001809 auto refreshRateConfigs =
1810 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001811 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001812
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001813 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001814 auto& explicitExactLayer = layers[0];
1815 auto& explicitExactOrMultipleLayer = layers[1];
1816
1817 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1818 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001819 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001820
1821 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1822 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001823 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001824
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001825 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1826 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001827
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001828 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1829 explicitExactLayer.desiredRefreshRate = 60_Hz;
1830 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001831
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001832 explicitExactLayer.desiredRefreshRate = 72_Hz;
1833 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001834
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001835 explicitExactLayer.desiredRefreshRate = 90_Hz;
1836 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001837
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001838 explicitExactLayer.desiredRefreshRate = 120_Hz;
1839 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001840}
1841
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001842TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1843 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1844
1845 auto refreshRateConfigs =
1846 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1847 /*currentConfigId=*/HWC_CONFIG_ID_60);
1848
1849 setLastBestRefreshRateInvocation(*refreshRateConfigs,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001850 GetBestRefreshRateInvocation{.globalSignals = {.touch = true,
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001851 .idle = true},
1852 .outSignalsConsidered =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001853 {.touch = true},
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001854 .resultingBestRefreshRate =
1855 createRefreshRate(
1856 mConfig90)});
1857
1858 EXPECT_EQ(createRefreshRate(mConfig90),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001859 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true}));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001860
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001861 const GlobalSignals cachedSignalsConsidered{.touch = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001862 setLastBestRefreshRateInvocation(*refreshRateConfigs,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001863 GetBestRefreshRateInvocation{.globalSignals = {.touch = true,
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001864 .idle = true},
1865 .outSignalsConsidered =
1866 cachedSignalsConsidered,
1867 .resultingBestRefreshRate =
1868 createRefreshRate(
1869 mConfig30)});
1870
1871 GlobalSignals signalsConsidered;
1872 EXPECT_EQ(createRefreshRate(mConfig30),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001873 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true},
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001874 &signalsConsidered));
1875
1876 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1877}
1878
1879TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1880 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1881
1882 auto refreshRateConfigs =
1883 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1884 /*currentConfigId=*/HWC_CONFIG_ID_60);
1885 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1886
1887 GlobalSignals globalSignals{.touch = true, .idle = true};
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001888 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001889 const auto lastResult =
1890 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1891 /* outSignalsConsidered */ nullptr);
1892
1893 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1894
1895 ASSERT_TRUE(lastInvocation.has_value());
1896 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1897 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1898 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1899
1900 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1901 // to getBestRefreshRate()
1902 GlobalSignals detaultSignals;
1903 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1904}
1905
Ady Abraham5e4e9832021-06-14 13:40:56 -07001906TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07001907 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001908 auto refreshRateConfigs =
1909 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001910 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07001911
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001912 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001913 auto& explicitExactLayer = layers[0];
1914 auto& explicitExactOrMultipleLayer = layers[1];
1915
1916 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1917 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001918 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001919
1920 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1921 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001922 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001923
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001924 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1925 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001926
1927 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1928
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001929 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1930 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001931}
1932
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001933TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
1934 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
1935 auto refreshRateConfigs =
1936 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1937 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
1938
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001939 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001940 auto& explicitDefaultLayer = layers[0];
1941 auto& explicitExactOrMultipleLayer = layers[1];
1942
1943 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1944 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001945 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001946
1947 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1948 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001949 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001950
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001951 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001952}
1953
Ady Abraham05243be2021-09-16 15:58:52 -07001954// b/190578904
1955TEST_F(RefreshRateConfigsTest, getBestRefreshRate_deviceWithCloseRefreshRates) {
1956 constexpr int kMinRefreshRate = 10;
1957 constexpr int kMaxRefreshRate = 240;
1958
1959 DisplayModes displayModes;
1960 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
1961 constexpr int32_t kGroup = 0;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001962 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001963 displayModes.push_back(
1964 createDisplayMode(DisplayModeId(fps), kGroup, refreshRate.getPeriodNsecs()));
1965 }
1966
Ady Abraham05243be2021-09-16 15:58:52 -07001967 auto refreshRateConfigs =
1968 std::make_unique<RefreshRateConfigs>(displayModes,
1969 /*currentConfigId=*/displayModes[0]->getId());
1970
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001971 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001972 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1973 layers[0].desiredRefreshRate = fps;
1974 layers[0].vote = vote;
1975 EXPECT_EQ(fps.getIntValue(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001976 refreshRateConfigs->getBestRefreshRate(layers, {}).getFps().getIntValue())
Dominik Laskowskif5d0ea52021-09-26 17:27:01 -07001977 << "Failed for " << ftl::enum_string(vote);
Ady Abraham05243be2021-09-16 15:58:52 -07001978 };
1979
1980 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001981 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001982 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1983 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1984 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1985 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1986 }
1987}
1988
Ana Krulecb9afd792020-06-11 13:16:15 -07001989TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1990 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1991 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1992 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1993}
1994
1995TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1996 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1997
1998 auto refreshRateConfigs =
1999 std::make_unique<RefreshRateConfigs>(m60_90Device,
2000 /*currentConfigId=*/HWC_CONFIG_ID_90);
2001 // SetPolicy(60, 90), current 90Hz => TurnOn.
2002 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2003
2004 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002005 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 90_Hz}}), 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002006 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2007
Ady Abrahama91605e2021-06-18 11:41:47 -07002008 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002009 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002010 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002011
2012 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002013 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002014 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2015}
2016
TreeHugger Robot758ab612021-06-22 19:17:29 +00002017TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2018 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2019
2020 // Tests with 120Hz
2021 auto refreshRateConfigs =
2022 std::make_unique<RefreshRateConfigs>(m60_120Device,
2023 /*currentConfigId=*/HWC_CONFIG_ID_120);
2024 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002025 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0_Hz, 60_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002026 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2027
2028 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002029 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002030 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2031
2032 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002033 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 120_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002034 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2035
2036 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002037 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_120, {120_Hz, 120_Hz}}),
TreeHugger Robot758ab612021-06-22 19:17:29 +00002038 0);
2039 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2040}
2041
Ady Abraham5cc2e262021-03-25 13:09:17 -07002042TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002043 auto refreshRateConfigs =
2044 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2045 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002046
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002047 const auto frameRate = 30_Hz;
Ady Abraham5cc2e262021-03-25 13:09:17 -07002048 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2049 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002050
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002051 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002052 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2053 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002054
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002055 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002056 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2057 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002058
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002059 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002060 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2061 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002062
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002063 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002064 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2065 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002066
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002067 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002068 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002069 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002070
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002071 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 25_Hz));
2072 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 23.976_Hz));
2073 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(30_Hz, 29.97_Hz));
2074 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002075}
2076
2077TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002078 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2079 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002080
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002081 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2082 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002083
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002084 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2085 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002086
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002087 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2088 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002090 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2091 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002092
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002093 const auto refreshRates = {23.976_Hz, 24_Hz, 25_Hz, 29.97_Hz, 30_Hz, 50_Hz, 59.94_Hz, 60_Hz};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002094 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002095 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002096 }
2097
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002098 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2099 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2100 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002101}
2102
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002103TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002104 auto refreshRateConfigs =
2105 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2106 HWC_CONFIG_ID_120);
2107
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002108 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002109}
2110
2111TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002112 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002113 auto refreshRateConfigs =
2114 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002115 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002116
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002117 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002118 layers[0].name = "Test layer";
2119 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002120 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002121 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002122 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002123 ASSERT_EQ(1, frameRateOverrides.size());
2124 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002125 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002126
2127 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002128 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002129 ASSERT_EQ(1, frameRateOverrides.size());
2130 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002131 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002132
2133 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002134 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002135 ASSERT_TRUE(frameRateOverrides.empty());
2136
2137 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002138 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002139 ASSERT_TRUE(frameRateOverrides.empty());
2140
2141 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002142 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002143 ASSERT_TRUE(frameRateOverrides.empty());
2144
2145 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002146 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002147 ASSERT_TRUE(frameRateOverrides.empty());
2148}
2149
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002150TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002151 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002152 auto refreshRateConfigs =
2153 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002154 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002155
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002156 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2157 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002158
2159 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002160 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002161 layers[0].vote = LayerVoteType::ExplicitDefault;
2162
2163 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002164 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002165 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002166 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002167
2168 ASSERT_EQ(2, frameRateOverrides.size());
2169 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002170 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002171 ASSERT_EQ(1, frameRateOverrides.count(5678));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002172 ASSERT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002173
2174 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002175 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002176 ASSERT_EQ(1, frameRateOverrides.size());
2177 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002178 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002179
2180 layers[1].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002181 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002182 ASSERT_TRUE(frameRateOverrides.empty());
2183}
2184
2185TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002186 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002187 auto refreshRateConfigs =
2188 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002189 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002190
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002191 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002192 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002193 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002194 layers[0].vote = LayerVoteType::ExplicitDefault;
2195
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002196 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002197 ASSERT_EQ(1, frameRateOverrides.size());
2198 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002199 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002200
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002201 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002202 ASSERT_EQ(1, frameRateOverrides.size());
2203 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002204 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002205
2206 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002207 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002208 ASSERT_EQ(1, frameRateOverrides.size());
2209 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002210 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002211
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002212 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002213 ASSERT_EQ(1, frameRateOverrides.size());
2214 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002215 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002216
2217 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002218 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002219 ASSERT_EQ(1, frameRateOverrides.size());
2220 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002221 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002222
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002223 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002224 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002225}
2226
Alec Mouri0a1cc962019-03-14 12:33:02 -07002227} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002228} // namespace android::scheduler
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002229
2230// TODO(b/129481165): remove the #pragma below and fix conversion issues
2231#pragma clang diagnostic pop // ignored "-Wextra"