blob: fc84d48b46146455a8ee88a00a00fc24b33952ae [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Alec Mouri0a1cc962019-03-14 12:33:02 -070030#include "DisplayHardware/HWC2.h"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070031#include "FpsOps.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070032#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070036namespace android::scheduler {
Alec Mouri0a1cc962019-03-14 12:33:02 -070037
Peiyong Line9d809e2020-04-14 13:10:48 -070038namespace hal = android::hardware::graphics::composer::hal;
39
Alec Mouri0a1cc962019-03-14 12:33:02 -070040using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080041using LayerVoteType = RefreshRateConfigs::LayerVoteType;
42using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070043
44class RefreshRateConfigsTest : public testing::Test {
45protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020046 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
47
Alec Mouri0a1cc962019-03-14 12:33:02 -070048 RefreshRateConfigsTest();
49 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070050
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020051 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070052 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020053 }
54
Marin Shalamanove8a663d2020-11-24 17:48:00 +010055 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070056 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
57 }
58
Marin Shalamanove8a663d2020-11-24 17:48:00 +010059 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070060 return refreshRateConfigs.mKnownFrameRates;
61 }
62
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010063 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
64 std::lock_guard lock(refreshRateConfigs.mLock);
65 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
66 }
67
68 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
69 std::lock_guard lock(refreshRateConfigs.mLock);
70 return *refreshRateConfigs.mMinSupportedRefreshRate;
71 }
72
73 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
74 std::lock_guard lock(refreshRateConfigs.mLock);
75 return *refreshRateConfigs.mMaxSupportedRefreshRate;
76 }
77
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020078 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
79 const GetBestRefreshRateInvocation& invocation) {
80 std::lock_guard lock(refreshRateConfigs.mLock);
81 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
82 GetBestRefreshRateInvocation(invocation));
83 }
84
85 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
86 const RefreshRateConfigs& refreshRateConfigs) {
87 std::lock_guard lock(refreshRateConfigs.mLock);
88 return refreshRateConfigs.lastBestRefreshRateInvocation;
89 }
90
Ady Abrahamabc27602020-04-08 17:20:29 -070091 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010092 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
93 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
94 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
95 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
96 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
97 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
98 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +020099 static inline const DisplayModeId HWC_CONFIG_ID_24 = DisplayModeId(7);
100 static inline const DisplayModeId HWC_CONFIG_ID_24_FRAC = DisplayModeId(8);
101 static inline const DisplayModeId HWC_CONFIG_ID_30_FRAC = DisplayModeId(9);
102 static inline const DisplayModeId HWC_CONFIG_ID_60_FRAC = DisplayModeId(10);
Ady Abrahamabc27602020-04-08 17:20:29 -0700103
104 // Test configs
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700105 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, (60_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200106 DisplayModePtr mConfig60Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700107 createDisplayMode(HWC_CONFIG_ID_60_FRAC, 0, (59.94_Hz).getPeriodNsecs());
108 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, (90_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100109 DisplayModePtr mConfig90DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700110 createDisplayMode(HWC_CONFIG_ID_90, 1, (90_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100111 DisplayModePtr mConfig90DifferentResolution =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700112 createDisplayMode(HWC_CONFIG_ID_90, 0, (90_Hz).getPeriodNsecs(), ui::Size(111, 222));
113 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, (72_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100114 DisplayModePtr mConfig72DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700115 createDisplayMode(HWC_CONFIG_ID_72, 1, (72_Hz).getPeriodNsecs());
116 DisplayModePtr mConfig120 = createDisplayMode(HWC_CONFIG_ID_120, 0, (120_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100117 DisplayModePtr mConfig120DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700118 createDisplayMode(HWC_CONFIG_ID_120, 1, (120_Hz).getPeriodNsecs());
119 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, (30_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100120 DisplayModePtr mConfig30DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700121 createDisplayMode(HWC_CONFIG_ID_30, 1, (30_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200122 DisplayModePtr mConfig30Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700123 createDisplayMode(HWC_CONFIG_ID_30_FRAC, 0, (29.97_Hz).getPeriodNsecs());
124 DisplayModePtr mConfig25 = createDisplayMode(HWC_CONFIG_ID_25, 0, (25_Hz).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100125 DisplayModePtr mConfig25DifferentGroup =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700126 createDisplayMode(HWC_CONFIG_ID_25, 1, (25_Hz).getPeriodNsecs());
127 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, (50_Hz).getPeriodNsecs());
128 DisplayModePtr mConfig24 = createDisplayMode(HWC_CONFIG_ID_24, 0, (24_Hz).getPeriodNsecs());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200129 DisplayModePtr mConfig24Frac =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700130 createDisplayMode(HWC_CONFIG_ID_24_FRAC, 0, (23.976_Hz).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700131
132 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200133 // The positions of the configs in the arrays below MUST match their IDs. For example,
134 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100135 DisplayModes m60OnlyConfigDevice = {mConfig60};
136 DisplayModes m60_90Device = {mConfig60, mConfig90};
137 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
138 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
139 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
140 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
141 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
142 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
143 mConfig120DifferentGroup, mConfig30};
144 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
145 mConfig30};
146 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
147 mConfig120DifferentGroup, mConfig30};
148 DisplayModes m25_30_50_60Device = {mConfig60,
149 mConfig90,
150 mConfig72DifferentGroup,
151 mConfig120DifferentGroup,
152 mConfig30DifferentGroup,
153 mConfig25DifferentGroup,
154 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700155 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700156
Marin Shalamanov15a0fc62021-08-16 18:20:21 +0200157 // This is a typical TV configuration.
158 DisplayModes m24_25_30_50_60WithFracDevice = {mConfig24, mConfig24Frac, mConfig25,
159 mConfig30, mConfig30Frac, mConfig50,
160 mConfig60, mConfig60Frac};
161
Ady Abrahamabc27602020-04-08 17:20:29 -0700162 // Expected RefreshRate objects
Ady Abraham6b7ad652021-06-23 17:34:57 -0700163 RefreshRate mExpected60Config = {mConfig60, RefreshRate::ConstructorTag(0)};
164 RefreshRate mExpectedAlmost60Config = {createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
165 RefreshRate::ConstructorTag(0)};
166 RefreshRate mExpected90Config = {mConfig90, RefreshRate::ConstructorTag(0)};
167 RefreshRate mExpected90DifferentGroupConfig = {mConfig90DifferentGroup,
168 RefreshRate::ConstructorTag(0)};
169 RefreshRate mExpected90DifferentResolutionConfig = {mConfig90DifferentResolution,
Ady Abrahamabc27602020-04-08 17:20:29 -0700170 RefreshRate::ConstructorTag(0)};
Ady Abraham6b7ad652021-06-23 17:34:57 -0700171 RefreshRate mExpected72Config = {mConfig72, RefreshRate::ConstructorTag(0)};
172 RefreshRate mExpected30Config = {mConfig30, RefreshRate::ConstructorTag(0)};
173 RefreshRate mExpected120Config = {mConfig120, RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700174
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100175 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
176 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700177};
178
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100179using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700180
Alec Mouri0a1cc962019-03-14 12:33:02 -0700181RefreshRateConfigsTest::RefreshRateConfigsTest() {
182 const ::testing::TestInfo* const test_info =
183 ::testing::UnitTest::GetInstance()->current_test_info();
184 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
185}
186
187RefreshRateConfigsTest::~RefreshRateConfigsTest() {
188 const ::testing::TestInfo* const test_info =
189 ::testing::UnitTest::GetInstance()->current_test_info();
190 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
191}
192
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100193DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
194 int64_t vsyncPeriod, ui::Size resolution) {
195 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
196 .setId(modeId)
Ady Abraham5e7ee862021-06-23 17:43:41 -0700197 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
Ady Abrahamabc27602020-04-08 17:20:29 -0700198 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100199 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100200 .setHeight(resolution.height)
201 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700202 .build();
203}
204
Alec Mouri0a1cc962019-03-14 12:33:02 -0700205namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700206
Ady Abraham2139f732019-11-13 18:56:40 -0800207TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700208 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700209 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
210 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700211}
212
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100213TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100214 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700215 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
216 /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700217 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {60_Hz, 60_Hz}}), 0);
218 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {20_Hz, 40_Hz}}), 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100219}
220
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700221TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700222 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700223 std::make_unique<RefreshRateConfigs>(m60_90Device,
224 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700225
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100226 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
227 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700228
Ady Abrahamabc27602020-04-08 17:20:29 -0700229 ASSERT_EQ(mExpected60Config, minRate);
230 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800231
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100232 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800233 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800234 ASSERT_EQ(minRateByPolicy, minRate);
235 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700236}
Ady Abraham2139f732019-11-13 18:56:40 -0800237
238TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800239 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700240 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
241 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800242
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100243 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
244 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
245 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800246 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800247
Ady Abrahamabc27602020-04-08 17:20:29 -0700248 ASSERT_EQ(mExpected60Config, minRate);
249 ASSERT_EQ(mExpected60Config, minRate60);
250 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800251
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700252 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60_Hz, 90_Hz}}), 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100253 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800254
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100255 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800256 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800257
Ady Abrahamabc27602020-04-08 17:20:29 -0700258 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
259 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
260 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
261}
262
263TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
264 auto refreshRateConfigs =
265 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
266 /*currentConfigId=*/HWC_CONFIG_ID_60);
267
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100268 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
269 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
270 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700271 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
272
273 ASSERT_EQ(mExpected60Config, minRate);
274 ASSERT_EQ(mExpected60Config, minRate60);
275 ASSERT_EQ(mExpected60Config, performanceRate60);
276
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700277 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {60_Hz, 90_Hz}}), 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100278 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700279
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100280 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700281 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
282
283 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
284 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
285 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800286}
287
288TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800289 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700290 std::make_unique<RefreshRateConfigs>(m60_90Device,
291 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800292
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100293 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
294 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800295
Ady Abrahamabc27602020-04-08 17:20:29 -0700296 ASSERT_EQ(mExpected60Config, minRate);
297 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800298
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700299 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800300
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100301 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
302 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700303 ASSERT_EQ(mExpected60Config, minRate60);
304 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800305}
306
307TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800308 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700309 std::make_unique<RefreshRateConfigs>(m60_90Device,
310 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800311 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100312 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100313 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800314 }
315
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100316 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800317 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100318 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100319 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800320 }
321
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700322 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800323 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100324 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100325 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800326 }
327}
328
Steven Thomasbb374322020-04-28 22:47:16 -0700329TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700330 auto refreshRateConfigs =
331 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
332 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800333
Steven Thomasdebafed2020-05-18 17:30:35 -0700334 // If there are no layers we select the default frame rate, which is the max of the primary
335 // range.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700336 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate({}, {}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800337
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700338 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}),
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200339 NO_ERROR);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700340 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate({}, {}));
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200341
342 // We select max even when this will cause a non-seamless switch.
343 refreshRateConfigs = std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
344 /*currentConfigId=*/HWC_CONFIG_ID_60);
345 ASSERT_EQ(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700346 {HWC_CONFIG_ID_90, /*allowGroupSwitching*/ true, {0_Hz, 90_Hz}}),
Marin Shalamanov8cd8a992021-09-14 23:22:49 +0200347 NO_ERROR);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700348 EXPECT_EQ(mExpected90DifferentGroupConfig, refreshRateConfigs->getBestRefreshRate({}, {}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800349}
350
Steven Thomasbb374322020-04-28 22:47:16 -0700351TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800352 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700353 std::make_unique<RefreshRateConfigs>(m60_90Device,
354 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800355
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700356 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800357 auto& lr = layers[0];
358
359 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800360 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700361 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800362
363 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800364 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700365 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700367 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800368 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800369 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700370 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700372 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800373 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700374 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800375
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700376 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800377 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700378 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700380 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700382 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800383
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700384 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800385 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700386 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800387
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800388 lr.name = "";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700389 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
391 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700392 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800393
394 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700395 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800396
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700397 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700399 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800400
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700401 lr.desiredRefreshRate = 60_Hz;
402 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700404 lr.desiredRefreshRate = 45_Hz;
405 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800406
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700407 lr.desiredRefreshRate = 30_Hz;
408 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800409
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700410 lr.desiredRefreshRate = 24_Hz;
411 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700413 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800414
415 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700416 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800417
418 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700419 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700421 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800422 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700423 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700425 lr.desiredRefreshRate = 60_Hz;
426 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700428 lr.desiredRefreshRate = 45_Hz;
429 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800430
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700431 lr.desiredRefreshRate = 30_Hz;
432 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800433
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700434 lr.desiredRefreshRate = 24_Hz;
435 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700437 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0_Hz, 120_Hz}}), 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700439 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800440
441 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700442 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800443
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700444 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800445 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700446 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800447
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700448 lr.desiredRefreshRate = 60_Hz;
449 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700451 lr.desiredRefreshRate = 45_Hz;
452 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700454 lr.desiredRefreshRate = 30_Hz;
455 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700457 lr.desiredRefreshRate = 24_Hz;
458 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800459}
460
rnlee3bd610662021-06-23 16:27:57 -0700461TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
462 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
463 auto refreshRateConfigs =
464 std::make_unique<RefreshRateConfigs>(m60_90Device,
465 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
466
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700467 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700468 auto& lr = layers[0];
469
470 lr.vote = LayerVoteType::Min;
471 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700472 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700473
474 lr.vote = LayerVoteType::Max;
475 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700476 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700477
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700478 lr.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700479 lr.vote = LayerVoteType::Heuristic;
480 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700481 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700482
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700483 lr.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700484 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700485 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700486
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700487 lr.desiredRefreshRate = 45_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700488 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700489 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700490
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700491 lr.desiredRefreshRate = 30_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700492 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700493 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700494
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700495 lr.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700496 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700497 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700498}
499
Steven Thomasbb374322020-04-28 22:47:16 -0700500TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700502 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
503 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800504
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700505 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800506 auto& lr = layers[0];
507
508 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700509 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800510
511 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700512 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800513
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700514 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800515 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700516 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800517
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700518 lr.desiredRefreshRate = 60_Hz;
519 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800520
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700521 lr.desiredRefreshRate = 45_Hz;
522 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800523
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700524 lr.desiredRefreshRate = 30_Hz;
525 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800526
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700527 lr.desiredRefreshRate = 24_Hz;
528 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529}
530
Steven Thomasbb374322020-04-28 22:47:16 -0700531TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700533 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
534 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800535
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700536 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800537 auto& lr1 = layers[0];
538 auto& lr2 = layers[1];
539
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700540 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700542 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800543 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700544 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700546 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700548 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800549 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700550 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800551
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700552 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700554 lr2.desiredRefreshRate = 48_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700556 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557}
558
Steven Thomasbb374322020-04-28 22:47:16 -0700559TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800560 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700561 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
562 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800563
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700564 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham71c437d2020-01-31 15:56:57 -0800565 auto& lr1 = layers[0];
566 auto& lr2 = layers[1];
567
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700568 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800569 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800570 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700571 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800572 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800573 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700574 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800575
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700576 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800577 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800578 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700579 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800580 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800581 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700582 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800583
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700584 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800585 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800586 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700587 lr2.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800588 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800589 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700590 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800591
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700592 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800593 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800594 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700595 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800596 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800597 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700598 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700600 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800601 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
602 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700603 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800604 lr2.vote = LayerVoteType::ExplicitDefault;
605 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700606 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800607
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700608 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800609 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800610 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700611 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800612 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800613 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700614 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800615
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700616 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800617 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800618 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700619 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800620 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800621 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700622 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800623
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700624 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800625 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800626 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700627 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800628 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700630 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800631
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700632 lr1.desiredRefreshRate = 24_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800633 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800634 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700635 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800637 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700638 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800639}
640
rnlee3bd610662021-06-23 16:27:57 -0700641TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
642 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
643 auto refreshRateConfigs =
644 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
645 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
646
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700647 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700648 auto& lr1 = layers[0];
649 auto& lr2 = layers[1];
650
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700651 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700652 lr1.vote = LayerVoteType::ExplicitDefault;
653 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700654 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700655 lr2.vote = LayerVoteType::Heuristic;
656 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700657 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700658
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700659 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700660 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
661 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700662 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700663 lr2.vote = LayerVoteType::Heuristic;
664 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700665 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700666
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700667 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700668 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
669 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700670 lr2.desiredRefreshRate = 60_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700671 lr2.vote = LayerVoteType::ExplicitDefault;
672 lr2.name = "60Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700673 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700674
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700675 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700676 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
677 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700678 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700679 lr2.vote = LayerVoteType::Heuristic;
680 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700681 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700682
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700683 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700684 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
685 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700686 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700687 lr2.vote = LayerVoteType::ExplicitDefault;
688 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700689 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700690
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700691 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700692 lr1.vote = LayerVoteType::ExplicitDefault;
693 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700694 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700695 lr2.vote = LayerVoteType::Heuristic;
696 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700697 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700698
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700699 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700700 lr1.vote = LayerVoteType::Heuristic;
701 lr1.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700702 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700703 lr2.vote = LayerVoteType::ExplicitDefault;
704 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700705 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700706
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700707 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700708 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
709 lr1.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700710 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700711 lr2.vote = LayerVoteType::ExplicitDefault;
712 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700713 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700714
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700715 lr1.desiredRefreshRate = 24_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700716 lr1.vote = LayerVoteType::ExplicitDefault;
717 lr1.name = "24Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700718 lr2.desiredRefreshRate = 90_Hz;
rnlee3bd610662021-06-23 16:27:57 -0700719 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
720 lr2.name = "90Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700721 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
rnlee3bd610662021-06-23 16:27:57 -0700722}
723
Steven Thomasbb374322020-04-28 22:47:16 -0700724TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800725 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700726 std::make_unique<RefreshRateConfigs>(m30_60Device,
727 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800728
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700729 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800730 auto& lr = layers[0];
731
732 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700733 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
735 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700736 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800737
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700738 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800739 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700740 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800741
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700742 lr.desiredRefreshRate = 60_Hz;
743 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800744
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700745 lr.desiredRefreshRate = 45_Hz;
746 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800747
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700748 lr.desiredRefreshRate = 30_Hz;
749 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800750
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700751 lr.desiredRefreshRate = 24_Hz;
752 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800753}
754
Steven Thomasbb374322020-04-28 22:47:16 -0700755TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800756 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700757 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
758 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800759
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700760 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800761 auto& lr = layers[0];
762
763 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800764 lr.name = "Min";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700765 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800766
767 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800768 lr.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700769 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800770
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700771 lr.desiredRefreshRate = 90_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800772 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800773 lr.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700774 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800775
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700776 lr.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800777 lr.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700778 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
779 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800780
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700781 lr.desiredRefreshRate = 45_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800782 lr.name = "45Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700783 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
784 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800785
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700786 lr.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800787 lr.name = "30Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700788 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
789 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800790
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700791 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800792 lr.name = "24Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700793 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
794 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800795
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700796 lr.desiredRefreshRate = 24_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800797 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
798 lr.name = "24Hz ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700799 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
800 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800801}
802
Steven Thomasbb374322020-04-28 22:47:16 -0700803TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800804 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700805 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
806 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800807
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700808 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809 auto& lr1 = layers[0];
810 auto& lr2 = layers[1];
811
812 lr1.vote = LayerVoteType::Min;
813 lr2.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700814 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800815
816 lr1.vote = LayerVoteType::Min;
817 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700818 lr2.desiredRefreshRate = 24_Hz;
819 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800820
821 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800822 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700823 lr2.desiredRefreshRate = 24_Hz;
824 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800825
826 lr1.vote = LayerVoteType::Max;
827 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700828 lr2.desiredRefreshRate = 60_Hz;
829 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800830
831 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800832 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700833 lr2.desiredRefreshRate = 60_Hz;
834 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
836 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700837 lr1.desiredRefreshRate = 15_Hz;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800838 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700839 lr2.desiredRefreshRate = 45_Hz;
840 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800841
842 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700843 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800844 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700845 lr2.desiredRefreshRate = 45_Hz;
846 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847}
848
Steven Thomasbb374322020-04-28 22:47:16 -0700849TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800850 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700851 std::make_unique<RefreshRateConfigs>(m60_90Device,
852 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700854 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800855 auto& lr = layers[0];
856
Ady Abraham71c437d2020-01-31 15:56:57 -0800857 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800858 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700859 lr.desiredRefreshRate = Fps::fromValue(fps);
860 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
861 EXPECT_EQ(mExpected60Config, refreshRate)
862 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800863 }
864}
865
rnlee3bd610662021-06-23 16:27:57 -0700866TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
867 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
868 auto refreshRateConfigs =
869 std::make_unique<RefreshRateConfigs>(m60_120Device,
870 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
871
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700872 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
rnlee3bd610662021-06-23 16:27:57 -0700873 auto& lr = layers[0];
874
875 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
876 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700877 lr.desiredRefreshRate = Fps::fromValue(fps);
878 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
879 EXPECT_EQ(mExpected60Config, refreshRate)
880 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
rnlee3bd610662021-06-23 16:27:57 -0700881 }
882}
883
Steven Thomasbb374322020-04-28 22:47:16 -0700884TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800885 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700886 std::make_unique<RefreshRateConfigs>(m60_90Device,
887 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800888
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700889 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham8a82ba62020-01-17 12:43:17 -0800890 auto& lr1 = layers[0];
891 auto& lr2 = layers[1];
892
893 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700894 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800895 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700896 lr2.desiredRefreshRate = 90_Hz;
897 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800898
899 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700900 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800901 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700902 lr2.desiredRefreshRate = 60_Hz;
903 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800904
905 lr1.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700906 lr1.desiredRefreshRate = 90_Hz;
Ady Abraham71c437d2020-01-31 15:56:57 -0800907 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700908 lr2.desiredRefreshRate = 60_Hz;
909 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham2139f732019-11-13 18:56:40 -0800910}
911
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800912TEST_F(RefreshRateConfigsTest, testInPolicy) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700913 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(60.000004_Hz, 60.000004_Hz));
914 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(59_Hz, 60.1_Hz));
915 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(75_Hz, 90_Hz));
916 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(60.0011_Hz, 90_Hz));
917 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(50_Hz, 59.998_Hz));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800918}
919
Steven Thomasbb374322020-04-28 22:47:16 -0700920TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800921 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700922 std::make_unique<RefreshRateConfigs>(m60_90Device,
923 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800924
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700925 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamf6b77072020-01-30 14:22:54 -0800926 auto& lr = layers[0];
927
Ady Abraham71c437d2020-01-31 15:56:57 -0800928 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800929 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700930 lr.desiredRefreshRate = Fps::fromValue(fps);
931 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
932 EXPECT_EQ(mExpected90Config, refreshRate)
933 << lr.desiredRefreshRate << " chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800934 }
935}
936
Steven Thomasbb374322020-04-28 22:47:16 -0700937TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800938 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700939 std::make_unique<RefreshRateConfigs>(m60_90Device,
940 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800941
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700942 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham34702102020-02-10 14:12:05 -0800943 auto& lr1 = layers[0];
944 auto& lr2 = layers[1];
945
946 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700947 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800948 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800949 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700950 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800951 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700952 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800953
954 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700955 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800956 lr1.name = "60Hz ExplicitExactOrMultiple";
957 lr2.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700958 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800959 lr2.name = "90Hz ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700960 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800961
962 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700963 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800964 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800965 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800966 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700967 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800968
969 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700970 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800971 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800972 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700973 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800974 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700975 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham34702102020-02-10 14:12:05 -0800976
977 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700978 lr1.desiredRefreshRate = 30_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800979 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800980 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800981 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700982 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800983}
984
985TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800986 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700987 std::make_unique<RefreshRateConfigs>(m60_90Device,
988 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800989
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700990 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800991 auto& lr1 = layers[0];
992 auto& lr2 = layers[1];
993
994 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700995 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800996 lr1.name = "60Hz ExplicitExactOrMultiple";
997 lr2.vote = LayerVoteType::NoVote;
998 lr2.name = "NoVote";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700999 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001000
1001 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001002 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001003 lr1.name = "60Hz ExplicitExactOrMultiple";
1004 lr2.vote = LayerVoteType::NoVote;
1005 lr2.name = "NoVote";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001006 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001007
1008 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001009 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001010 lr1.name = "60Hz ExplicitExactOrMultiple";
1011 lr2.vote = LayerVoteType::Max;
1012 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001013 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001014
1015 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001016 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001017 lr1.name = "60Hz ExplicitExactOrMultiple";
1018 lr2.vote = LayerVoteType::Max;
1019 lr2.name = "Max";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001020 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001021
1022 // The other layer starts to provide buffers
1023 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001024 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001025 lr1.name = "60Hz ExplicitExactOrMultiple";
1026 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001027 lr2.desiredRefreshRate = 90_Hz;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001028 lr2.name = "90Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001029 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001030}
1031
1032TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001033 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001034 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001035 std::make_unique<RefreshRateConfigs>(m60_90Device,
1036 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001037
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001038 refreshRateConfigs->getBestRefreshRate({}, {}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001039 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001040
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001041 refreshRateConfigs->getBestRefreshRate({}, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001042 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001043
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001044 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 1.f}};
Ady Abraham6fb599b2020-03-05 13:48:22 -08001045 auto& lr1 = layers[0];
1046 auto& lr2 = layers[1];
1047
1048 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001049 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001050 lr1.name = "60Hz ExplicitExactOrMultiple";
1051 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001052 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001053 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001054 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001055 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001056
1057 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001058 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001059 lr1.name = "60Hz ExplicitExactOrMultiple";
1060 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001061 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001062 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001063 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001064 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001065
1066 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001067 lr1.desiredRefreshRate = 60_Hz;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001068 lr1.name = "60Hz ExplicitExactOrMultiple";
1069 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001070 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001071 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001072 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001073 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001074
1075 lr1.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001076 lr1.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001077 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001078 lr2.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001079 lr2.desiredRefreshRate = 60_Hz;
Steven Thomasf734df42020-04-13 21:09:28 -07001080 lr2.name = "60Hz Heuristic";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001081 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}, &consideredSignals);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001082 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001083}
1084
Steven Thomasbb374322020-04-28 22:47:16 -07001085TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001086 auto refreshRateConfigs =
1087 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1088 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001089
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001090 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001091 auto& lr = layers[0];
1092
1093 // Prepare a table with the vote and the expected refresh rate
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001094 const std::initializer_list<std::pair<Fps, Fps>> testCases = {
1095 {130_Hz, 120_Hz}, {120_Hz, 120_Hz}, {119_Hz, 120_Hz}, {110_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001096
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001097 {100_Hz, 90_Hz}, {90_Hz, 90_Hz}, {89_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001098
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001099 {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 -08001100
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001101 {65_Hz, 60_Hz}, {60_Hz, 60_Hz}, {59_Hz, 60_Hz}, {58_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001102
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001103 {55_Hz, 90_Hz}, {50_Hz, 90_Hz}, {45_Hz, 90_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001104
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001105 {42_Hz, 120_Hz}, {40_Hz, 120_Hz}, {39_Hz, 120_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001106
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001107 {37_Hz, 72_Hz}, {36_Hz, 72_Hz}, {35_Hz, 72_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001108
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001109 {30_Hz, 60_Hz},
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001110 };
1111
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001112 for (auto [desired, expected] : testCases) {
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001113 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001114 lr.desiredRefreshRate = desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001115
1116 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001117 ss << "ExplicitDefault " << desired;
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001118 lr.name = ss.str();
1119
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001120 const auto refreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
1121 EXPECT_EQ(refreshRate.getFps(), expected);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001122 }
1123}
1124
1125TEST_F(RefreshRateConfigsTest,
1126 getBestRefreshRate_ExplicitExactOrMultiple_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001127 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001128 auto& lr = layers[0];
1129
1130 // Test that 23.976 will choose 24 if 23.976 is not supported
1131 {
1132 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1133 mConfig30Frac, mConfig60, mConfig60Frac};
1134 auto refreshRateConfigs =
1135 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1136
1137 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001138 lr.desiredRefreshRate = 23.976_Hz;
1139 lr.name = "ExplicitExactOrMultiple 23.976 Hz";
1140 EXPECT_EQ(HWC_CONFIG_ID_24, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001141 }
1142
1143 // Test that 24 will choose 23.976 if 24 is not supported
1144 {
1145 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1146 mConfig30Frac, mConfig60, mConfig60Frac};
1147 auto refreshRateConfigs =
1148 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001149 lr.desiredRefreshRate = 24_Hz;
1150 lr.name = "ExplicitExactOrMultiple 24 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001151 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001152 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001153 }
1154
1155 // Test that 29.97 will prefer 59.94 over 60 and 30
1156 {
1157 android::DisplayModes modes = {mConfig24, mConfig24Frac, mConfig25,
1158 mConfig30, mConfig60, mConfig60Frac};
1159 auto refreshRateConfigs =
1160 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001161 lr.desiredRefreshRate = 29.97_Hz;
1162 lr.name = "ExplicitExactOrMultiple 29.97 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001163 EXPECT_EQ(HWC_CONFIG_ID_60_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001164 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001165 }
1166}
1167
1168TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact_WithFractionalRefreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001169 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001170 auto& lr = layers[0];
1171
1172 // Test that voting for supported refresh rate will select this refresh rate
1173 {
1174 auto refreshRateConfigs =
1175 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1176 /*currentConfigId=*/HWC_CONFIG_ID_60);
1177
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001178 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 +02001179 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001180 lr.desiredRefreshRate = desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001181 std::stringstream ss;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001182 ss << "ExplicitExact " << desired;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001183 lr.name = ss.str();
1184
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001185 auto selectedRefreshRate = refreshRateConfigs->getBestRefreshRate(layers, {});
1186 EXPECT_EQ(selectedRefreshRate.getFps(), lr.desiredRefreshRate);
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001187 }
1188 }
1189
1190 // Test that 23.976 will choose 24 if 23.976 is not supported
1191 {
1192 android::DisplayModes modes = {mConfig24, mConfig25, mConfig30,
1193 mConfig30Frac, mConfig60, mConfig60Frac};
1194 auto refreshRateConfigs =
1195 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
1196 lr.vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001197 lr.desiredRefreshRate = 23.976_Hz;
1198 lr.name = "ExplicitExact 23.976 Hz";
1199 EXPECT_EQ(HWC_CONFIG_ID_24, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001200 }
1201
1202 // Test that 24 will choose 23.976 if 24 is not supported
1203 {
1204 android::DisplayModes modes = {mConfig24Frac, mConfig25, mConfig30,
1205 mConfig30Frac, mConfig60, mConfig60Frac};
1206 auto refreshRateConfigs =
1207 std::make_unique<RefreshRateConfigs>(modes, /*currentConfigId=*/HWC_CONFIG_ID_60);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001208 lr.desiredRefreshRate = 24_Hz;
1209 lr.name = "ExplicitExact 24 Hz";
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001210 EXPECT_EQ(HWC_CONFIG_ID_24_FRAC,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001211 refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001212 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001213}
1214
Alec Mouri11232a22020-05-14 18:06:25 -07001215TEST_F(RefreshRateConfigsTest,
1216 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1217 auto refreshRateConfigs =
1218 std::make_unique<RefreshRateConfigs>(m60_90Device,
1219 /*currentConfigId=*/HWC_CONFIG_ID_90);
1220
1221 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001222 {HWC_CONFIG_ID_90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001223 0);
1224
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001225 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001226 auto& lr = layers[0];
1227
Ady Abrahamdfd62162020-06-10 16:11:56 -07001228 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001229 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001230 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001231 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001232 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001233 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001234 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1235 &consideredSignals));
1236 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001237}
1238
1239TEST_F(RefreshRateConfigsTest,
1240 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1241 auto refreshRateConfigs =
1242 std::make_unique<RefreshRateConfigs>(m60_90Device,
1243 /*currentConfigId=*/HWC_CONFIG_ID_60);
1244
1245 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001246 {HWC_CONFIG_ID_60, {60_Hz, 60_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001247 0);
1248
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001249 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001250 auto& lr = layers[0];
1251
Alec Mouri11232a22020-05-14 18:06:25 -07001252 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001253 lr.desiredRefreshRate = 90_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001254 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001255 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001256 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {.idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001257}
1258
1259TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001260 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001261 auto refreshRateConfigs =
1262 std::make_unique<RefreshRateConfigs>(m60_90Device,
1263 /*currentConfigId=*/HWC_CONFIG_ID_90);
1264
1265 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001266 {HWC_CONFIG_ID_90, {90_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001267 0);
1268
Ady Abrahamdfd62162020-06-10 16:11:56 -07001269 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001270 EXPECT_EQ(mExpected90Config,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001271 refreshRateConfigs->getBestRefreshRate({}, {}, &consideredSignals));
Ady Abrahamdfd62162020-06-10 16:11:56 -07001272 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001273
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001274 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Alec Mouri11232a22020-05-14 18:06:25 -07001275 auto& lr = layers[0];
1276
1277 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001278 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001279 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001280 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001281 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001282
1283 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001284 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001285
1286 lr.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001287 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001288 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001289 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001290 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001291
1292 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001293 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001294
1295 lr.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001296 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001297 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001298 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001299 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001300
1301 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001302 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001303
1304 lr.vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001305 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001306 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001307 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001308 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001309
1310 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001311 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001312
1313 lr.vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001314 lr.desiredRefreshRate = 60_Hz;
Alec Mouri11232a22020-05-14 18:06:25 -07001315 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001316 lr.focused = false;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001317 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001318
1319 lr.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001320 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Alec Mouri11232a22020-05-14 18:06:25 -07001321}
1322
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001323TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001324 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001325 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1326 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001327
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001328 // The default policy doesn't allow group switching. Verify that no
1329 // group switches are performed.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001330 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasd4071902020-03-24 16:02:53 -07001331 auto& layer = layers[0];
1332 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001333 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001334 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001335 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001336 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001337
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001338 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001339}
Steven Thomasd4071902020-03-24 16:02:53 -07001340
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001341TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1342 auto refreshRateConfigs =
1343 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1344 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001345 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001346 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001347 policy.allowGroupSwitching = true;
1348 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001349
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001350 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001351 auto& layer = layers[0];
1352 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001353 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001354 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1355 layer.name = "90Hz ExplicitDefault";
1356 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001357 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001358}
1359
1360TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1361 auto refreshRateConfigs =
1362 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1363 /*currentConfigId=*/HWC_CONFIG_ID_60);
1364 RefreshRateConfigs::Policy policy;
1365 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1366 policy.allowGroupSwitching = true;
1367 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001368
1369 // Verify that we won't change the group if seamless switch is required.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001370 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001371 auto& layer = layers[0];
1372 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001373 layer.desiredRefreshRate = 90_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001374 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001375 layer.name = "90Hz ExplicitDefault";
1376 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001377 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001378}
1379
1380TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1381 auto refreshRateConfigs =
1382 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1383 /*currentConfigId=*/HWC_CONFIG_ID_60);
1384 RefreshRateConfigs::Policy policy;
1385 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1386 policy.allowGroupSwitching = true;
1387 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1388
1389 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001390
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001391 // 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 -07001392 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001393 auto& layer = layers[0];
1394 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001395 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001396 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001397 layer.name = "60Hz ExplicitDefault";
1398 layer.focused = true;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001399 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001400}
1401
1402TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1403 auto refreshRateConfigs =
1404 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1405 /*currentConfigId=*/HWC_CONFIG_ID_60);
1406 RefreshRateConfigs::Policy policy;
1407 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1408 policy.allowGroupSwitching = true;
1409 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1410
1411 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001412
1413 // Verify that if the current config is in another group and there are no layers with
1414 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001415
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001416 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001417 auto& layer = layers[0];
1418 layer.vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001419 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001420 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001421 layer.name = "60Hz ExplicitDefault";
1422 layer.focused = true;
1423
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001424 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001425}
1426
1427TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1428 auto refreshRateConfigs =
1429 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1430 /*currentConfigId=*/HWC_CONFIG_ID_60);
1431 RefreshRateConfigs::Policy policy;
1432 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1433 policy.allowGroupSwitching = true;
1434 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1435
1436 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001437
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001438 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001439 // seamlessness=OnlySeamless can't change the mode group.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001440 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001441 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001442 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001443 layers[0].seamlessness = Seamlessness::OnlySeamless;
1444 layers[0].name = "60Hz ExplicitDefault";
1445 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001446
1447 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001448 layers[1].vote = LayerVoteType::ExplicitDefault;
1449 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001450 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001451 layers[1].name = "90Hz ExplicitDefault";
1452 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001453
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001454 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001455}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001456
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001457TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001458 auto refreshRateConfigs =
1459 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1460 /*currentConfigId=*/HWC_CONFIG_ID_60);
1461 RefreshRateConfigs::Policy policy;
1462 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1463 policy.allowGroupSwitching = true;
1464 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1465
1466 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001467
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001468 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1469 // seamlessness=Default can't change the mode group back to the group of the default
1470 // mode.
1471 // For example, this may happen when a video playback requests and gets a seamed switch,
1472 // but another layer (with default seamlessness) starts animating. The animating layer
1473 // should not cause a seamed switch.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001474 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001475 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001476 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001477 layers[0].focused = true;
1478 layers[0].vote = LayerVoteType::ExplicitDefault;
1479 layers[0].name = "60Hz ExplicitDefault";
1480
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001481 layers.push_back(LayerRequirement{.weight = 0.1f});
1482 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001483 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001484 layers[1].focused = true;
1485 layers[1].vote = LayerVoteType::ExplicitDefault;
1486 layers[1].name = "90Hz ExplicitDefault";
1487
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001488 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001489}
1490
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001491TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1492 auto refreshRateConfigs =
1493 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1494 /*currentConfigId=*/HWC_CONFIG_ID_60);
1495 RefreshRateConfigs::Policy policy;
1496 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1497 policy.allowGroupSwitching = true;
1498 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1499
1500 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1501
1502 // Layer with seamlessness=Default can change the mode group if there's a not
1503 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1504 // when in split screen mode the user switches between the two visible applications.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001505 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001506 layers[0].seamlessness = Seamlessness::Default;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001507 layers[0].desiredRefreshRate = 60_Hz;
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001508 layers[0].focused = true;
1509 layers[0].vote = LayerVoteType::ExplicitDefault;
1510 layers[0].name = "60Hz ExplicitDefault";
1511
1512 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001513 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001514 layers[1].desiredRefreshRate = 90_Hz;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001515 layers[1].focused = false;
1516 layers[1].vote = LayerVoteType::ExplicitDefault;
1517 layers[1].name = "90Hz ExplicitDefault";
1518
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001519 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001520}
1521
1522TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1523 auto refreshRateConfigs =
1524 std::make_unique<RefreshRateConfigs>(m30_60Device,
1525 /*currentConfigId=*/HWC_CONFIG_ID_60);
1526
1527 // Allow group switching.
1528 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001529 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001530 policy.allowGroupSwitching = true;
1531 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1532
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001533 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001534 auto& layer = layers[0];
1535 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001536 layer.desiredRefreshRate = 60_Hz;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001537 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001538 layer.name = "60Hz ExplicitExactOrMultiple";
1539 layer.focused = true;
1540
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001541 ASSERT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001542
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001543 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001544 ASSERT_EQ(HWC_CONFIG_ID_120, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001545}
1546
1547TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1548 auto refreshRateConfigs =
1549 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1550 /*currentConfigId=*/HWC_CONFIG_ID_60);
1551
1552 // Allow group switching.
1553 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001554 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001555 policy.allowGroupSwitching = true;
1556 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1557
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001558 std::vector<LayerRequirement> layers = {{.name = "60Hz ExplicitDefault",
1559 .vote = LayerVoteType::ExplicitDefault,
1560 .desiredRefreshRate = 60_Hz,
1561 .seamlessness = Seamlessness::SeamedAndSeamless,
1562 .weight = 0.5f,
1563 .focused = false},
1564 {.name = "25Hz ExplicitExactOrMultiple",
1565 .vote = LayerVoteType::ExplicitExactOrMultiple,
1566 .desiredRefreshRate = 25_Hz,
1567 .seamlessness = Seamlessness::OnlySeamless,
1568 .weight = 1.f,
1569 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001570
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001571 ASSERT_EQ(HWC_CONFIG_ID_50, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001572
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001573 auto& seamedLayer = layers[0];
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001574 seamedLayer.desiredRefreshRate = 30_Hz;
1575 seamedLayer.name = "30Hz ExplicitDefault";
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001576 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001577
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001578 ASSERT_EQ(HWC_CONFIG_ID_25, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001579}
1580
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001581TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1582 auto refreshRateConfigs =
1583 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1584 /*currentConfigId=*/HWC_CONFIG_ID_90);
1585
1586 // Allow group switching.
1587 RefreshRateConfigs::Policy policy;
1588 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1589 policy.allowGroupSwitching = true;
1590 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1591
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001592 std::vector<LayerRequirement> layers = {
1593 {.name = "Min", .vote = LayerVoteType::Min, .weight = 1.f, .focused = true}};
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001594
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001595 ASSERT_EQ(HWC_CONFIG_ID_90, refreshRateConfigs->getBestRefreshRate(layers, {}).getModeId());
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001596}
1597
Steven Thomasf734df42020-04-13 21:09:28 -07001598TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1599 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001600 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001601 /*currentConfigId=*/HWC_CONFIG_ID_60);
1602
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001603 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasf734df42020-04-13 21:09:28 -07001604 layers[0].name = "Test layer";
1605
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001606 struct Args {
1607 bool touch = false;
1608 bool focused = true;
1609 };
1610
Steven Thomasbb374322020-04-28 22:47:16 -07001611 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001612 // given voteType and fps.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001613 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, Args args = {}) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001614 layers[0].vote = voteType;
1615 layers[0].desiredRefreshRate = fps;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001616 layers[0].focused = args.focused;
1617 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = args.touch}).getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001618 };
1619
1620 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001621 {HWC_CONFIG_ID_60, {30_Hz, 60_Hz}, {30_Hz, 90_Hz}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001622 0);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001623 EXPECT_EQ(HWC_CONFIG_ID_60, refreshRateConfigs->getBestRefreshRate({}, {}).getModeId());
1624 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1625 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, 90_Hz));
1626 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz));
1627 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1628 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1629 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001630
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001631 // Unfocused layers are not allowed to override primary config.
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001632 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001633 getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001634 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001635 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.focused = false}));
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001636
Steven Thomasf734df42020-04-13 21:09:28 -07001637 // Touch boost should be restricted to the primary range.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001638 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001639 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1640 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001641 EXPECT_EQ(HWC_CONFIG_ID_90,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001642 getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz, {.touch = true}));
Ady Abraham20c029c2020-07-06 12:58:05 -07001643 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001644 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz, {.touch = true}));
Steven Thomasf734df42020-04-13 21:09:28 -07001645
1646 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001647 {HWC_CONFIG_ID_60, {60_Hz, 60_Hz}, {60_Hz, 60_Hz}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001648 0);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001649 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, 90_Hz));
1650 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, 90_Hz));
1651 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, 90_Hz));
1652 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, 90_Hz));
1653 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, 90_Hz));
1654 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, 90_Hz));
Steven Thomasf734df42020-04-13 21:09:28 -07001655}
1656
Steven Thomasbb374322020-04-28 22:47:16 -07001657TEST_F(RefreshRateConfigsTest, idle) {
1658 auto refreshRateConfigs =
1659 std::make_unique<RefreshRateConfigs>(m60_90Device,
1660 /*currentConfigId=*/HWC_CONFIG_ID_60);
1661
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001662 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Steven Thomasbb374322020-04-28 22:47:16 -07001663 layers[0].name = "Test layer";
1664
Marin Shalamanov23c44202020-12-22 19:09:20 +01001665 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001666 layers[0].vote = voteType;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001667 layers[0].desiredRefreshRate = 90_Hz;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001668 RefreshRateConfigs::GlobalSignals consideredSignals;
1669 const auto configId =
1670 refreshRateConfigs
1671 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1672 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001673 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001674 // Refresh rate will be chosen by either touch state or idle state
1675 EXPECT_EQ(!touchActive, consideredSignals.idle);
1676 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001677 };
1678
1679 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001680 {HWC_CONFIG_ID_60, {60_Hz, 90_Hz}, {60_Hz, 90_Hz}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001681 0);
1682
1683 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001684 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1685 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1686 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1687 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1688 EXPECT_EQ(HWC_CONFIG_ID_90,
1689 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1690 EXPECT_EQ(HWC_CONFIG_ID_90,
1691 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001692
1693 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001694 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001695 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001696 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001697
1698 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001699 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001700 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1701 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1702 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1703 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1704 EXPECT_EQ(HWC_CONFIG_ID_60,
1705 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1706 EXPECT_EQ(HWC_CONFIG_ID_60,
1707 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001708
1709 // Idle should be applied rather than the current config when there are no layers.
1710 EXPECT_EQ(HWC_CONFIG_ID_60,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001711 refreshRateConfigs->getBestRefreshRate({}, {.idle = true}).getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001712}
1713
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001714TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1715 auto refreshRateConfigs =
1716 std::make_unique<RefreshRateConfigs>(m60_90Device,
1717 /*currentConfigId=*/HWC_CONFIG_ID_60);
1718
1719 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001720 const auto knownFrameRate =
1721 findClosestKnownFrameRate(*refreshRateConfigs, Fps::fromValue(fps));
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001722 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001723 if (fps < 26.91f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001724 expectedFrameRate = 24_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001725 } else if (fps < 37.51f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001726 expectedFrameRate = 30_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001727 } else if (fps < 52.51f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001728 expectedFrameRate = 45_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001729 } else if (fps < 66.01f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001730 expectedFrameRate = 60_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001731 } else if (fps < 81.01f) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001732 expectedFrameRate = 72_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001733 } else {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001734 expectedFrameRate = 90_Hz;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001735 }
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001736 EXPECT_EQ(expectedFrameRate, knownFrameRate);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001737 }
1738}
1739
1740TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001741 auto refreshRateConfigs =
1742 std::make_unique<RefreshRateConfigs>(m60_90Device,
1743 /*currentConfigId=*/HWC_CONFIG_ID_60);
1744
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001745 struct Expectation {
1746 Fps fps;
1747 const RefreshRate& refreshRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001748 };
1749
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001750 const std::initializer_list<Expectation> knownFrameRatesExpectations = {
1751 {24_Hz, mExpected60Config}, {30_Hz, mExpected60Config}, {45_Hz, mExpected90Config},
1752 {60_Hz, mExpected60Config}, {72_Hz, mExpected90Config}, {90_Hz, mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001753 };
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001754
1755 // Make sure the test tests all the known frame rate
1756 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001757 const bool equal = std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1758 knownFrameRatesExpectations.begin(),
1759 [](Fps fps, const Expectation& expected) {
1760 return isApproxEqual(fps, expected.fps);
1761 });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001762 EXPECT_TRUE(equal);
1763
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001764 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001765 auto& layer = layers[0];
1766 layer.vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001767
1768 for (const auto& [fps, refreshRate] : knownFrameRatesExpectations) {
1769 layer.desiredRefreshRate = fps;
1770 EXPECT_EQ(refreshRate, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001771 }
1772}
1773
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001774TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1775 auto refreshRateConfigs =
1776 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1777 /*currentConfigId=*/HWC_CONFIG_ID_60);
1778
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001779 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001780 auto& explicitExactLayer = layers[0];
1781 auto& explicitExactOrMultipleLayer = layers[1];
1782
1783 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1784 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001785 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001786
1787 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1788 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001789 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001790
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001791 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1792 EXPECT_EQ(mExpected30Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001793
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001794 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1795 explicitExactLayer.desiredRefreshRate = 60_Hz;
1796 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001797
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001798 explicitExactLayer.desiredRefreshRate = 72_Hz;
1799 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001800
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001801 explicitExactLayer.desiredRefreshRate = 90_Hz;
1802 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001803
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001804 explicitExactLayer.desiredRefreshRate = 120_Hz;
1805 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001806}
1807
1808TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07001809 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001810 auto refreshRateConfigs =
1811 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001812 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001813
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001814 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001815 auto& explicitExactLayer = layers[0];
1816 auto& explicitExactOrMultipleLayer = layers[1];
1817
1818 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1819 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001820 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001821
1822 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1823 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001824 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001825
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001826 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1827 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001828
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001829 explicitExactOrMultipleLayer.desiredRefreshRate = 120_Hz;
1830 explicitExactLayer.desiredRefreshRate = 60_Hz;
1831 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001832
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001833 explicitExactLayer.desiredRefreshRate = 72_Hz;
1834 EXPECT_EQ(mExpected72Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001835
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001836 explicitExactLayer.desiredRefreshRate = 90_Hz;
1837 EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001838
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001839 explicitExactLayer.desiredRefreshRate = 120_Hz;
1840 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001841}
1842
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001843TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1844 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1845
1846 auto refreshRateConfigs =
1847 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1848 /*currentConfigId=*/HWC_CONFIG_ID_60);
1849
1850 setLastBestRefreshRateInvocation(*refreshRateConfigs,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001851 GetBestRefreshRateInvocation{.globalSignals = {.touch = true,
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001852 .idle = true},
1853 .outSignalsConsidered =
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001854 {.touch = true},
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001855 .resultingBestRefreshRate =
1856 createRefreshRate(
1857 mConfig90)});
1858
1859 EXPECT_EQ(createRefreshRate(mConfig90),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001860 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true}));
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001861
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001862 const GlobalSignals cachedSignalsConsidered{.touch = true};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001863 setLastBestRefreshRateInvocation(*refreshRateConfigs,
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001864 GetBestRefreshRateInvocation{.globalSignals = {.touch = true,
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001865 .idle = true},
1866 .outSignalsConsidered =
1867 cachedSignalsConsidered,
1868 .resultingBestRefreshRate =
1869 createRefreshRate(
1870 mConfig30)});
1871
1872 GlobalSignals signalsConsidered;
1873 EXPECT_EQ(createRefreshRate(mConfig30),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001874 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true},
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001875 &signalsConsidered));
1876
1877 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1878}
1879
1880TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1881 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1882
1883 auto refreshRateConfigs =
1884 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1885 /*currentConfigId=*/HWC_CONFIG_ID_60);
1886 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1887
1888 GlobalSignals globalSignals{.touch = true, .idle = true};
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001889 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001890 const auto lastResult =
1891 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1892 /* outSignalsConsidered */ nullptr);
1893
1894 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1895
1896 ASSERT_TRUE(lastInvocation.has_value());
1897 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1898 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1899 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1900
1901 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1902 // to getBestRefreshRate()
1903 GlobalSignals detaultSignals;
1904 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1905}
1906
Ady Abraham5e4e9832021-06-14 13:40:56 -07001907TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07001908 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001909 auto refreshRateConfigs =
1910 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001911 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07001912
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001913 std::vector<LayerRequirement> layers = {{.weight = 1.f}, {.weight = 0.5f}};
Ady Abraham5e4e9832021-06-14 13:40:56 -07001914 auto& explicitExactLayer = layers[0];
1915 auto& explicitExactOrMultipleLayer = layers[1];
1916
1917 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1918 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001919 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001920
1921 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1922 explicitExactLayer.name = "ExplicitExact";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001923 explicitExactLayer.desiredRefreshRate = 30_Hz;
Ady Abraham5e4e9832021-06-14 13:40:56 -07001924
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001925 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1926 EXPECT_EQ(mExpected120Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001927
1928 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1929
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001930 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
1931 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {.touch = true}));
Ady Abraham5e4e9832021-06-14 13:40:56 -07001932}
1933
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001934TEST_F(RefreshRateConfigsTest, getBestRefreshRate_FractionalRefreshRates_ExactAndDefault) {
1935 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
1936 auto refreshRateConfigs =
1937 std::make_unique<RefreshRateConfigs>(m24_25_30_50_60WithFracDevice,
1938 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
1939
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001940 std::vector<LayerRequirement> layers = {{.weight = 0.5f}, {.weight = 0.5f}};
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001941 auto& explicitDefaultLayer = layers[0];
1942 auto& explicitExactOrMultipleLayer = layers[1];
1943
1944 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1945 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001946 explicitExactOrMultipleLayer.desiredRefreshRate = 60_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001947
1948 explicitDefaultLayer.vote = LayerVoteType::ExplicitDefault;
1949 explicitDefaultLayer.name = "ExplicitDefault";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001950 explicitDefaultLayer.desiredRefreshRate = 59.94_Hz;
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001951
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001952 EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, {}));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02001953}
1954
Ady Abraham05243be2021-09-16 15:58:52 -07001955// b/190578904
1956TEST_F(RefreshRateConfigsTest, getBestRefreshRate_deviceWithCloseRefreshRates) {
1957 constexpr int kMinRefreshRate = 10;
1958 constexpr int kMaxRefreshRate = 240;
1959
1960 DisplayModes displayModes;
1961 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
1962 constexpr int32_t kGroup = 0;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001963 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001964 displayModes.push_back(
1965 createDisplayMode(DisplayModeId(fps), kGroup, refreshRate.getPeriodNsecs()));
1966 }
1967
Ady Abraham05243be2021-09-16 15:58:52 -07001968 auto refreshRateConfigs =
1969 std::make_unique<RefreshRateConfigs>(displayModes,
1970 /*currentConfigId=*/displayModes[0]->getId());
1971
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001972 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham05243be2021-09-16 15:58:52 -07001973 const auto testRefreshRate = [&](Fps fps, LayerVoteType vote) {
1974 layers[0].desiredRefreshRate = fps;
1975 layers[0].vote = vote;
1976 EXPECT_EQ(fps.getIntValue(),
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001977 refreshRateConfigs->getBestRefreshRate(layers, {}).getFps().getIntValue())
Ady Abraham05243be2021-09-16 15:58:52 -07001978 << "Failed for " << RefreshRateConfigs::layerVoteTypeString(vote);
1979 };
1980
1981 for (int fps = kMinRefreshRate; fps < kMaxRefreshRate; fps++) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07001982 const auto refreshRate = Fps::fromValue(static_cast<float>(fps));
Ady Abraham05243be2021-09-16 15:58:52 -07001983 testRefreshRate(refreshRate, LayerVoteType::Heuristic);
1984 testRefreshRate(refreshRate, LayerVoteType::ExplicitDefault);
1985 testRefreshRate(refreshRate, LayerVoteType::ExplicitExactOrMultiple);
1986 testRefreshRate(refreshRate, LayerVoteType::ExplicitExact);
1987 }
1988}
1989
Ana Krulecb9afd792020-06-11 13:16:15 -07001990TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1991 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1992 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1993 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1994}
1995
1996TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1997 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1998
1999 auto refreshRateConfigs =
2000 std::make_unique<RefreshRateConfigs>(m60_90Device,
2001 /*currentConfigId=*/HWC_CONFIG_ID_90);
2002 // SetPolicy(60, 90), current 90Hz => TurnOn.
2003 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2004
2005 // SetPolicy(60, 90), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002006 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 90_Hz}}), 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002007 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2008
Ady Abrahama91605e2021-06-18 11:41:47 -07002009 // SetPolicy(60, 60), current 60Hz => TurnOff
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002010 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002011 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002012
2013 // SetPolicy(90, 90), current 90Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002014 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {90_Hz, 90_Hz}}), 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002015 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2016}
2017
TreeHugger Robot758ab612021-06-22 19:17:29 +00002018TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2019 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2020
2021 // Tests with 120Hz
2022 auto refreshRateConfigs =
2023 std::make_unique<RefreshRateConfigs>(m60_120Device,
2024 /*currentConfigId=*/HWC_CONFIG_ID_120);
2025 // SetPolicy(0, 60), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002026 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {0_Hz, 60_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002027 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2028
2029 // SetPolicy(60, 60), current 60Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002030 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 60_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002031 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2032
2033 // SetPolicy(60, 120), current 60Hz => TurnOn.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002034 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60_Hz, 120_Hz}}), 0);
TreeHugger Robot758ab612021-06-22 19:17:29 +00002035 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2036
2037 // SetPolicy(120, 120), current 120Hz => TurnOff.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002038 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_120, {120_Hz, 120_Hz}}),
TreeHugger Robot758ab612021-06-22 19:17:29 +00002039 0);
2040 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2041}
2042
Ady Abraham5cc2e262021-03-25 13:09:17 -07002043TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002044 auto refreshRateConfigs =
2045 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2046 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002047
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002048 const auto frameRate = 30_Hz;
Ady Abraham5cc2e262021-03-25 13:09:17 -07002049 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2050 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002051
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002052 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002053 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2054 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002055
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002056 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002057 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2058 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002059
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002060 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002061 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2062 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002063
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002064 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002065 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2066 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002067
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002068 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002069 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002070 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, 22.5_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002071
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002072 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 25_Hz));
2073 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(24_Hz, 23.976_Hz));
2074 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(30_Hz, 29.97_Hz));
2075 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002076}
2077
2078TEST_F(RefreshRateConfigsTest, isFractionalPairOrMultiple) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002079 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(23.976_Hz, 24_Hz));
2080 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 23.976_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002081
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002082 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 30_Hz));
2083 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002084
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002085 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 60_Hz));
2086 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002087
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002088 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 60_Hz));
2089 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(60_Hz, 29.97_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002090
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002091 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(59.94_Hz, 30_Hz));
2092 EXPECT_TRUE(RefreshRateConfigs::isFractionalPairOrMultiple(30_Hz, 59.94_Hz));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002093
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002094 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 +02002095 for (auto refreshRate : refreshRates) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002096 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(refreshRate, refreshRate));
Marin Shalamanov15a0fc62021-08-16 18:20:21 +02002097 }
2098
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002099 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(24_Hz, 25_Hz));
2100 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(23.978_Hz, 25_Hz));
2101 EXPECT_FALSE(RefreshRateConfigs::isFractionalPairOrMultiple(29.97_Hz, 59.94_Hz));
Ady Abraham62a0be22020-12-08 16:54:10 -08002102}
2103
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002104TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002105 auto refreshRateConfigs =
2106 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2107 HWC_CONFIG_ID_120);
2108
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002109 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides({}, 120_Hz, {}).empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002110}
2111
2112TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002113 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002114 auto refreshRateConfigs =
2115 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002116 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002117
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002118 std::vector<LayerRequirement> layers = {{.weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002119 layers[0].name = "Test layer";
2120 layers[0].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002121 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002122 layers[0].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002123 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002124 ASSERT_EQ(1, frameRateOverrides.size());
2125 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002126 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002127
2128 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002129 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002130 ASSERT_EQ(1, frameRateOverrides.size());
2131 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002132 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002133
2134 layers[0].vote = LayerVoteType::NoVote;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002135 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002136 ASSERT_TRUE(frameRateOverrides.empty());
2137
2138 layers[0].vote = LayerVoteType::Min;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002139 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002140 ASSERT_TRUE(frameRateOverrides.empty());
2141
2142 layers[0].vote = LayerVoteType::Max;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002143 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002144 ASSERT_TRUE(frameRateOverrides.empty());
2145
2146 layers[0].vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002147 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002148 ASSERT_TRUE(frameRateOverrides.empty());
2149}
2150
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002151TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002152 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002153 auto refreshRateConfigs =
2154 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002155 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002156
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002157 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f},
2158 {.ownerUid = 5678, .weight = 1.f}};
Ady Abraham62a0be22020-12-08 16:54:10 -08002159
2160 layers[0].name = "Test layer 1234";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002161 layers[0].desiredRefreshRate = 60_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002162 layers[0].vote = LayerVoteType::ExplicitDefault;
2163
2164 layers[1].name = "Test layer 5678";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002165 layers[1].desiredRefreshRate = 30_Hz;
Ady Abraham62a0be22020-12-08 16:54:10 -08002166 layers[1].vote = LayerVoteType::ExplicitDefault;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002167 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002168
2169 ASSERT_EQ(2, frameRateOverrides.size());
2170 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002171 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002172 ASSERT_EQ(1, frameRateOverrides.count(5678));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002173 ASSERT_EQ(30_Hz, frameRateOverrides.at(5678));
Ady Abraham62a0be22020-12-08 16:54:10 -08002174
2175 layers[1].vote = LayerVoteType::Heuristic;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002176 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abraham62a0be22020-12-08 16:54:10 -08002177 ASSERT_EQ(1, frameRateOverrides.size());
2178 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002179 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abraham62a0be22020-12-08 16:54:10 -08002180
2181 layers[1].ownerUid = 1234;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002182 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002183 ASSERT_TRUE(frameRateOverrides.empty());
2184}
2185
2186TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002187 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002188 auto refreshRateConfigs =
2189 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002190 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002191
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002192 std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002193 layers[0].name = "Test layer";
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002194 layers[0].desiredRefreshRate = 60_Hz;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002195 layers[0].vote = LayerVoteType::ExplicitDefault;
2196
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002197 auto frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002198 ASSERT_EQ(1, frameRateOverrides.size());
2199 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002200 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002201
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002202 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002203 ASSERT_EQ(1, frameRateOverrides.size());
2204 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002205 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002206
2207 layers[0].vote = LayerVoteType::ExplicitExact;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002208 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002209 ASSERT_EQ(1, frameRateOverrides.size());
2210 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002211 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002212
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002213 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002214 ASSERT_EQ(1, frameRateOverrides.size());
2215 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002216 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002217
2218 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002219 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {});
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002220 ASSERT_EQ(1, frameRateOverrides.size());
2221 ASSERT_EQ(1, frameRateOverrides.count(1234));
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002222 ASSERT_EQ(60_Hz, frameRateOverrides.at(1234));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002223
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002224 frameRateOverrides = refreshRateConfigs->getFrameRateOverrides(layers, 120_Hz, {.touch = true});
Ady Abraham62a0be22020-12-08 16:54:10 -08002225 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002226}
2227
Alec Mouri0a1cc962019-03-14 12:33:02 -07002228} // namespace
Dominik Laskowski6eab42d2021-09-13 14:34:13 -07002229} // namespace android::scheduler
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002230
2231// TODO(b/129481165): remove the #pragma below and fix conversion issues
2232#pragma clang diagnostic pop // ignored "-Wextra"