blob: 9bb5ca15b1d9539e699c961ea974799401f08803 [file] [log] [blame]
Alec Mouri0a1cc962019-03-14 12:33:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wextra"
20
Alec Mouri0a1cc962019-03-14 12:33:02 -070021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
Marin Shalamanov3ea1d602020-12-16 19:59:39 +010028#include <ui/Size.h>
29
Ady Abraham6fb599b2020-03-05 13:48:22 -080030#include "../../Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070031#include "DisplayHardware/HWC2.h"
32#include "Scheduler/RefreshRateConfigs.h"
Alec Mouri0a1cc962019-03-14 12:33:02 -070033
34using namespace std::chrono_literals;
Alec Mouri0a1cc962019-03-14 12:33:02 -070035
36namespace android {
Marin Shalamanove8a663d2020-11-24 17:48:00 +010037
Alec Mouri0a1cc962019-03-14 12:33:02 -070038namespace scheduler {
39
Peiyong Line9d809e2020-04-14 13:10:48 -070040namespace hal = android::hardware::graphics::composer::hal;
41
Alec Mouri0a1cc962019-03-14 12:33:02 -070042using RefreshRate = RefreshRateConfigs::RefreshRate;
Ady Abraham8a82ba62020-01-17 12:43:17 -080043using LayerVoteType = RefreshRateConfigs::LayerVoteType;
44using LayerRequirement = RefreshRateConfigs::LayerRequirement;
Alec Mouri0a1cc962019-03-14 12:33:02 -070045
46class RefreshRateConfigsTest : public testing::Test {
47protected:
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020048 using GetBestRefreshRateInvocation = RefreshRateConfigs::GetBestRefreshRateInvocation;
49
Alec Mouri0a1cc962019-03-14 12:33:02 -070050 RefreshRateConfigsTest();
51 ~RefreshRateConfigsTest();
Ady Abrahamabc27602020-04-08 17:20:29 -070052
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020053 RefreshRate createRefreshRate(DisplayModePtr displayMode) {
54 return {displayMode->getId(), displayMode, displayMode->getFps(),
55 RefreshRate::ConstructorTag(0)};
56 }
57
Marin Shalamanove8a663d2020-11-24 17:48:00 +010058 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070059 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
60 }
61
Marin Shalamanove8a663d2020-11-24 17:48:00 +010062 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070063 return refreshRateConfigs.mKnownFrameRates;
64 }
65
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010066 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
67 std::lock_guard lock(refreshRateConfigs.mLock);
68 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
69 }
70
71 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
72 std::lock_guard lock(refreshRateConfigs.mLock);
73 return *refreshRateConfigs.mMinSupportedRefreshRate;
74 }
75
76 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
77 std::lock_guard lock(refreshRateConfigs.mLock);
78 return *refreshRateConfigs.mMaxSupportedRefreshRate;
79 }
80
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020081 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
82 const GetBestRefreshRateInvocation& invocation) {
83 std::lock_guard lock(refreshRateConfigs.mLock);
84 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
85 GetBestRefreshRateInvocation(invocation));
86 }
87
88 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
89 const RefreshRateConfigs& refreshRateConfigs) {
90 std::lock_guard lock(refreshRateConfigs.mLock);
91 return refreshRateConfigs.lastBestRefreshRateInvocation;
92 }
93
Ady Abrahamabc27602020-04-08 17:20:29 -070094 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010095 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
96 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
97 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
98 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
99 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
100 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
101 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Ady Abrahamabc27602020-04-08 17:20:29 -0700102
103 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100104 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
105 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100106 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100107 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100108 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100109 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
110 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100111 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100112 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
113 DisplayModePtr mConfig120 =
114 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100115 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100116 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
117 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100118 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100119 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100120 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100121 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
122 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700123
124 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200125 // The positions of the configs in the arrays below MUST match their IDs. For example,
126 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100127 DisplayModes m60OnlyConfigDevice = {mConfig60};
128 DisplayModes m60_90Device = {mConfig60, mConfig90};
129 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
130 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
131 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
132 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
133 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
134 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
135 mConfig120DifferentGroup, mConfig30};
136 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
137 mConfig30};
138 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
139 mConfig120DifferentGroup, mConfig30};
140 DisplayModes m25_30_50_60Device = {mConfig60,
141 mConfig90,
142 mConfig72DifferentGroup,
143 mConfig120DifferentGroup,
144 mConfig30DifferentGroup,
145 mConfig25DifferentGroup,
146 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700147 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700148
149 // Expected RefreshRate objects
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100150 RefreshRate mExpected60Config = {HWC_CONFIG_ID_60, mConfig60, Fps(60),
Ady Abrahamabc27602020-04-08 17:20:29 -0700151 RefreshRate::ConstructorTag(0)};
152 RefreshRate mExpectedAlmost60Config = {HWC_CONFIG_ID_60,
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100153 createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
154 Fps(60), RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100155 RefreshRate mExpected90Config = {HWC_CONFIG_ID_90, mConfig90, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700156 RefreshRate::ConstructorTag(0)};
157 RefreshRate mExpected90DifferentGroupConfig = {HWC_CONFIG_ID_90, mConfig90DifferentGroup,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100158 Fps(90), RefreshRate::ConstructorTag(0)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700159 RefreshRate mExpected90DifferentResolutionConfig = {HWC_CONFIG_ID_90,
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100160 mConfig90DifferentResolution, Fps(90),
Ady Abrahamabc27602020-04-08 17:20:29 -0700161 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100162 RefreshRate mExpected72Config = {HWC_CONFIG_ID_72, mConfig72, Fps(72.0f),
Ady Abrahamabc27602020-04-08 17:20:29 -0700163 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100164 RefreshRate mExpected30Config = {HWC_CONFIG_ID_30, mConfig30, Fps(30),
Ady Abrahamabc27602020-04-08 17:20:29 -0700165 RefreshRate::ConstructorTag(0)};
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100166 RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, Fps(120),
Ady Abrahamabc27602020-04-08 17:20:29 -0700167 RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700168
Ady Abrahamabc27602020-04-08 17:20:29 -0700169private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100170 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
171 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700172};
173
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100174using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700175
Alec Mouri0a1cc962019-03-14 12:33:02 -0700176RefreshRateConfigsTest::RefreshRateConfigsTest() {
177 const ::testing::TestInfo* const test_info =
178 ::testing::UnitTest::GetInstance()->current_test_info();
179 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
180}
181
182RefreshRateConfigsTest::~RefreshRateConfigsTest() {
183 const ::testing::TestInfo* const test_info =
184 ::testing::UnitTest::GetInstance()->current_test_info();
185 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
186}
187
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100188DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
189 int64_t vsyncPeriod, ui::Size resolution) {
190 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
191 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700192 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100193 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100194 .setHeight(resolution.height)
195 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700196 .build();
197}
198
Alec Mouri0a1cc962019-03-14 12:33:02 -0700199namespace {
200/* ------------------------------------------------------------------------
201 * Test cases
202 */
Ady Abraham2139f732019-11-13 18:56:40 -0800203TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700204 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700205 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
206 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700207}
208
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100209TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100210 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700211 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
212 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100213 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100214 0);
215 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
216 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100217}
218
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700219TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700220 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700221 std::make_unique<RefreshRateConfigs>(m60_90Device,
222 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700223
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100224 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
225 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700226
Ady Abrahamabc27602020-04-08 17:20:29 -0700227 ASSERT_EQ(mExpected60Config, minRate);
228 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800229
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100230 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800231 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800232 ASSERT_EQ(minRateByPolicy, minRate);
233 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700234}
Ady Abraham2139f732019-11-13 18:56:40 -0800235
236TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800237 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700238 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
239 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800240
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100241 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
242 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
243 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800244 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800245
Ady Abrahamabc27602020-04-08 17:20:29 -0700246 ASSERT_EQ(mExpected60Config, minRate);
247 ASSERT_EQ(mExpected60Config, minRate60);
248 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800249
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100250 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
251 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100252 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800253
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100254 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800255 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800256
Ady Abrahamabc27602020-04-08 17:20:29 -0700257 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
258 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
259 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
260}
261
262TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
263 auto refreshRateConfigs =
264 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
265 /*currentConfigId=*/HWC_CONFIG_ID_60);
266
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100267 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
268 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
269 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700270 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
271
272 ASSERT_EQ(mExpected60Config, minRate);
273 ASSERT_EQ(mExpected60Config, minRate60);
274 ASSERT_EQ(mExpected60Config, performanceRate60);
275
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100276 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
277 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
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100299 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
300 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800301
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100302 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
303 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700304 ASSERT_EQ(mExpected60Config, minRate60);
305 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800306}
307
308TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800309 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700310 std::make_unique<RefreshRateConfigs>(m60_90Device,
311 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800312 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100313 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100314 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800315 }
316
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100317 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800318 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100319 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100320 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800321 }
322
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100323 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
324 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800325 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100326 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100327 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800328 }
329}
330
Steven Thomasbb374322020-04-28 22:47:16 -0700331TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700332 auto refreshRateConfigs =
333 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
334 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800335
Steven Thomasdebafed2020-05-18 17:30:35 -0700336 // If there are no layers we select the default frame rate, which is the max of the primary
337 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800338 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700339 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700340 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800341
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100342 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
343 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700344 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700345 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800346}
347
Steven Thomasbb374322020-04-28 22:47:16 -0700348TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800349 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700350 std::make_unique<RefreshRateConfigs>(m60_90Device,
351 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800352
353 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
354 auto& lr = layers[0];
355
356 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800357 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700358 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700359 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800360
361 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800362 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700363 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700364 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800365
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100366 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800367 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800368 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700369 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700370 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800371
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100372 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800373 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700374 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700375 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800376
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100377 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800378 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700379 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700380 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800381
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100382 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800383 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700384 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700385 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800386
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100387 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800388 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700389 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700390 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800391
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800392 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100393 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
394 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800395
396 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700397 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700398 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800399
400 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700401 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700402 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800403
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100404 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700406 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700407 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800408
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100409 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700410 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700411 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800412
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100413 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700414 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700415 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800416
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100417 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700418 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700419 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800420
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100421 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700422 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700423 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800424
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100425 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
426 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
427 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800428
429 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700430 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700431 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800432
433 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700434 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700435 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800436
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100437 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700439 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800441
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100442 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700443 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700444 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800445
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100446 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700447 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700448 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800449
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100450 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700451 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700452 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800453
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100454 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700455 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700456 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100458 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
459 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
460 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700462 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700463 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800464
465 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700466 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700467 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800468
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100469 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700471 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700472 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800473
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100474 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700475 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800477
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100478 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700479 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700480 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800481
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100482 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700483 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700484 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800485
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100486 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700487 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700488 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800489}
490
rnlee3bd610662021-06-23 16:27:57 -0700491TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
492 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
493 auto refreshRateConfigs =
494 std::make_unique<RefreshRateConfigs>(m60_90Device,
495 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
496
497 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
498 auto& lr = layers[0];
499
500 lr.vote = LayerVoteType::Min;
501 lr.name = "Min";
502 EXPECT_EQ(mExpected60Config,
503 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
504
505 lr.vote = LayerVoteType::Max;
506 lr.name = "Max";
507 EXPECT_EQ(mExpected90Config,
508 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
509
510 lr.desiredRefreshRate = Fps(90.0f);
511 lr.vote = LayerVoteType::Heuristic;
512 lr.name = "90Hz Heuristic";
513 EXPECT_EQ(mExpected90Config,
514 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
515
516 lr.desiredRefreshRate = Fps(60.0f);
517 lr.name = "60Hz Heuristic";
518 EXPECT_EQ(mExpected60Config,
519 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
520
521 lr.desiredRefreshRate = Fps(45.0f);
522 lr.name = "45Hz Heuristic";
523 EXPECT_EQ(mExpected90Config,
524 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
525
526 lr.desiredRefreshRate = Fps(30.0f);
527 lr.name = "30Hz Heuristic";
528 EXPECT_EQ(mExpected60Config,
529 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
530
531 lr.desiredRefreshRate = Fps(24.0f);
532 lr.name = "24Hz Heuristic";
533 EXPECT_EQ(mExpected60Config,
534 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
535}
536
Steven Thomasbb374322020-04-28 22:47:16 -0700537TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800538 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700539 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
540 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541
542 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
543 auto& lr = layers[0];
544
545 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700546 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700547 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548
549 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700550 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700551 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800552
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100553 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700555 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700556 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800557
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100558 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700559 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700560 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800561
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100562 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700563 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700564 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800565
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100566 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700567 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700568 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800569
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100570 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700571 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700572 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800573}
574
Steven Thomasbb374322020-04-28 22:47:16 -0700575TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800576 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700577 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
578 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800579
580 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
581 LayerRequirement{.weight = 1.0f}};
582 auto& lr1 = layers[0];
583 auto& lr2 = layers[1];
584
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100585 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800586 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100587 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800588 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700589 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700590 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800591
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100592 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800593 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100594 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700596 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700597 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800598
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100599 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800600 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100601 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800602 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700603 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700604 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800605}
606
Steven Thomasbb374322020-04-28 22:47:16 -0700607TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800608 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700609 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
610 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800611
612 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
613 LayerRequirement{.weight = 1.0f}};
614 auto& lr1 = layers[0];
615 auto& lr2 = layers[1];
616
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100617 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800618 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800619 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100620 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800621 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800622 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700623 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700624 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800625
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100626 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800627 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800628 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100629 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800630 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800631 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700632 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700633 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800634
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100635 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800636 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800637 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100638 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800639 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800640 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700641 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700642 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800643
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100644 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800645 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800646 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100647 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800648 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800649 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700650 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700651 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800652
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100653 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800654 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
655 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100656 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800657 lr2.vote = LayerVoteType::ExplicitDefault;
658 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700659 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700660 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800661
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100662 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800663 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800664 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100665 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800666 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800667 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700668 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700669 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800670
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100671 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800672 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800673 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100674 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800675 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800676 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700677 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700678 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800679
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100680 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800681 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800682 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100683 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800684 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800685 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700686 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700687 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800688
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100689 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800690 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800691 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100692 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800693 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800694 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700695 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700696 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800697}
698
rnlee3bd610662021-06-23 16:27:57 -0700699TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
700 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
701 auto refreshRateConfigs =
702 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
703 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
704
705 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
706 LayerRequirement{.weight = 1.0f}};
707 auto& lr1 = layers[0];
708 auto& lr2 = layers[1];
709
710 lr1.desiredRefreshRate = Fps(24.0f);
711 lr1.vote = LayerVoteType::ExplicitDefault;
712 lr1.name = "24Hz ExplicitDefault";
713 lr2.desiredRefreshRate = Fps(60.0f);
714 lr2.vote = LayerVoteType::Heuristic;
715 lr2.name = "60Hz Heuristic";
716 EXPECT_EQ(mExpected120Config,
717 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
718
719 lr1.desiredRefreshRate = Fps(24.0f);
720 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
721 lr1.name = "24Hz ExplicitExactOrMultiple";
722 lr2.desiredRefreshRate = Fps(60.0f);
723 lr2.vote = LayerVoteType::Heuristic;
724 lr2.name = "60Hz Heuristic";
725 EXPECT_EQ(mExpected60Config,
726 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
727
728 lr1.desiredRefreshRate = Fps(24.0f);
729 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
730 lr1.name = "24Hz ExplicitExactOrMultiple";
731 lr2.desiredRefreshRate = Fps(60.0f);
732 lr2.vote = LayerVoteType::ExplicitDefault;
733 lr2.name = "60Hz ExplicitDefault";
734 EXPECT_EQ(mExpected72Config,
735 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
736
737 lr1.desiredRefreshRate = Fps(24.0f);
738 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
739 lr1.name = "24Hz ExplicitExactOrMultiple";
740 lr2.desiredRefreshRate = Fps(90.0f);
741 lr2.vote = LayerVoteType::Heuristic;
742 lr2.name = "90Hz Heuristic";
743 EXPECT_EQ(mExpected90Config,
744 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
745
746 lr1.desiredRefreshRate = Fps(24.0f);
747 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
748 lr1.name = "24Hz ExplicitExactOrMultiple";
749 lr2.desiredRefreshRate = Fps(90.0f);
750 lr2.vote = LayerVoteType::ExplicitDefault;
751 lr2.name = "90Hz Heuristic";
752 EXPECT_EQ(mExpected72Config,
753 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
754
755 lr1.desiredRefreshRate = Fps(24.0f);
756 lr1.vote = LayerVoteType::ExplicitDefault;
757 lr1.name = "24Hz ExplicitDefault";
758 lr2.desiredRefreshRate = Fps(90.0f);
759 lr2.vote = LayerVoteType::Heuristic;
760 lr2.name = "90Hz Heuristic";
761 EXPECT_EQ(mExpected90Config,
762 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
763
764 lr1.desiredRefreshRate = Fps(24.0f);
765 lr1.vote = LayerVoteType::Heuristic;
766 lr1.name = "24Hz Heuristic";
767 lr2.desiredRefreshRate = Fps(90.0f);
768 lr2.vote = LayerVoteType::ExplicitDefault;
769 lr2.name = "90Hz ExplicitDefault";
770 EXPECT_EQ(mExpected72Config,
771 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
772
773 lr1.desiredRefreshRate = Fps(24.0f);
774 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
775 lr1.name = "24Hz ExplicitExactOrMultiple";
776 lr2.desiredRefreshRate = Fps(90.0f);
777 lr2.vote = LayerVoteType::ExplicitDefault;
778 lr2.name = "90Hz ExplicitDefault";
779 EXPECT_EQ(mExpected72Config,
780 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
781
782 lr1.desiredRefreshRate = Fps(24.0f);
783 lr1.vote = LayerVoteType::ExplicitDefault;
784 lr1.name = "24Hz ExplicitDefault";
785 lr2.desiredRefreshRate = Fps(90.0f);
786 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
787 lr2.name = "90Hz ExplicitExactOrMultiple";
788 EXPECT_EQ(mExpected90Config,
789 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
790}
791
Steven Thomasbb374322020-04-28 22:47:16 -0700792TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800793 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700794 std::make_unique<RefreshRateConfigs>(m30_60Device,
795 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796
797 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
798 auto& lr = layers[0];
799
800 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700801 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700802 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800803
804 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700805 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700806 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800807
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100808 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700810 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700811 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800812
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100813 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700814 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700815 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800816
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100817 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700818 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700819 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800820
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100821 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700822 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700823 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100825 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700826 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700827 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800828}
829
Steven Thomasbb374322020-04-28 22:47:16 -0700830TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800831 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700832 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
833 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800834
835 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
836 auto& lr = layers[0];
837
838 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800839 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700840 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700841 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800842
843 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800844 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700845 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700846 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800847
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100848 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800849 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800850 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700851 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700852 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100854 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800855 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700856 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700857 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700858 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700859 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800860
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100861 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800862 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700864 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700865 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700866 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800867
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100868 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800869 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700871 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700872 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800874
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100875 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800876 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700877 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700878 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700879 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700880 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800881
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100882 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800883 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
884 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700885 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700886 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700887 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700888 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800889}
890
Steven Thomasbb374322020-04-28 22:47:16 -0700891TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800892 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700893 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
894 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800895
896 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
897 LayerRequirement{.weight = 1.0f}};
898 auto& lr1 = layers[0];
899 auto& lr2 = layers[1];
900
901 lr1.vote = LayerVoteType::Min;
902 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700903 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700904 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800905
906 lr1.vote = LayerVoteType::Min;
907 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100908 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700909 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700910 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800911
912 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800913 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100914 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700915 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700916 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800917
918 lr1.vote = LayerVoteType::Max;
919 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100920 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700921 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700922 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800923
924 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800925 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100926 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800929
930 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100931 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800932 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100933 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700934 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700935 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800936
937 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100938 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800939 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100940 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700941 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700942 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800943}
944
Steven Thomasbb374322020-04-28 22:47:16 -0700945TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800946 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700947 std::make_unique<RefreshRateConfigs>(m60_90Device,
948 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800949
950 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
951 auto& lr = layers[0];
952
Ady Abraham71c437d2020-01-31 15:56:57 -0800953 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800954 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100955 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800956 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700957 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700958 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800959 }
960}
961
rnlee3bd610662021-06-23 16:27:57 -0700962TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
963 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
964 auto refreshRateConfigs =
965 std::make_unique<RefreshRateConfigs>(m60_120Device,
966 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
967
968 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
969 auto& lr = layers[0];
970
971 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
972 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
973 lr.desiredRefreshRate = Fps(fps);
974 const auto& refreshRate =
975 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
976 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
977 }
978}
979
Steven Thomasbb374322020-04-28 22:47:16 -0700980TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800981 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700982 std::make_unique<RefreshRateConfigs>(m60_90Device,
983 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800984
985 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
986 LayerRequirement{.weight = 1.0f}};
987 auto& lr1 = layers[0];
988 auto& lr2 = layers[1];
989
990 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100991 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800992 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100993 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700994 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700995 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800996
997 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100998 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800999 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001000 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001001 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001002 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -08001003
1004 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001005 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -08001006 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001007 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001008 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001009 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001010}
1011
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001012TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001013 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1014 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1015 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1016 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1017 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001018}
1019
Steven Thomasbb374322020-04-28 22:47:16 -07001020TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001021 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001022 std::make_unique<RefreshRateConfigs>(m60_90Device,
1023 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001024
1025 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1026 auto& lr = layers[0];
1027
Ady Abraham71c437d2020-01-31 15:56:57 -08001028 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001029 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001030 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001031 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001032 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001033 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001034 }
1035}
1036
Steven Thomasbb374322020-04-28 22:47:16 -07001037TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001038 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001039 std::make_unique<RefreshRateConfigs>(m60_90Device,
1040 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001041
1042 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1043 LayerRequirement{.weight = 1.0f}};
1044 auto& lr1 = layers[0];
1045 auto& lr2 = layers[1];
1046
1047 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001048 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001049 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001050 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001051 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001052 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001053 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001054 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001055
1056 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001057 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001058 lr1.name = "60Hz ExplicitExactOrMultiple";
1059 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001060 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001061 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001062 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001063 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001064
1065 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001066 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001067 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001068 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001069 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001070 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001071 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001072
1073 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001074 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001075 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001076 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001077 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001078 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001079 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001081
1082 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001083 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001084 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001085 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001086 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001087 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001088 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001089}
1090
1091TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001092 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001093 std::make_unique<RefreshRateConfigs>(m60_90Device,
1094 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001095
1096 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1097 LayerRequirement{.weight = 1.0f}};
1098 auto& lr1 = layers[0];
1099 auto& lr2 = layers[1];
1100
1101 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001102 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001103 lr1.name = "60Hz ExplicitExactOrMultiple";
1104 lr2.vote = LayerVoteType::NoVote;
1105 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001106 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001107 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001108
1109 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001110 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001111 lr1.name = "60Hz ExplicitExactOrMultiple";
1112 lr2.vote = LayerVoteType::NoVote;
1113 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001114 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001115 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001116
1117 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001118 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001119 lr1.name = "60Hz ExplicitExactOrMultiple";
1120 lr2.vote = LayerVoteType::Max;
1121 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001122 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001123 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001124
1125 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001126 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001127 lr1.name = "60Hz ExplicitExactOrMultiple";
1128 lr2.vote = LayerVoteType::Max;
1129 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001130 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001131 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001132
1133 // The other layer starts to provide buffers
1134 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001135 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001136 lr1.name = "60Hz ExplicitExactOrMultiple";
1137 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001138 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001139 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001140 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001141 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001142}
1143
1144TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001145 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001146 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001147 std::make_unique<RefreshRateConfigs>(m60_90Device,
1148 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001149
Ady Abrahamdfd62162020-06-10 16:11:56 -07001150 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1151 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001152
Ady Abrahamdfd62162020-06-10 16:11:56 -07001153 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1154 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001155
1156 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1157 LayerRequirement{.weight = 1.0f}};
1158 auto& lr1 = layers[0];
1159 auto& lr2 = layers[1];
1160
1161 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001162 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001163 lr1.name = "60Hz ExplicitExactOrMultiple";
1164 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001165 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001166 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001167 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1168 &consideredSignals);
1169 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001170
1171 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001172 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001173 lr1.name = "60Hz ExplicitExactOrMultiple";
1174 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001175 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001176 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001177 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1178 &consideredSignals);
1179 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001180
1181 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001182 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001183 lr1.name = "60Hz ExplicitExactOrMultiple";
1184 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001185 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001186 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001187 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1188 &consideredSignals);
1189 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001190
1191 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001192 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001193 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001194 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001195 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001196 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001197 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1198 &consideredSignals);
1199 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001200}
1201
Steven Thomasbb374322020-04-28 22:47:16 -07001202TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001203 auto refreshRateConfigs =
1204 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1205 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001206
1207 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1208 auto& lr = layers[0];
1209
1210 // Prepare a table with the vote and the expected refresh rate
1211 const std::vector<std::pair<float, float>> testCases = {
1212 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1213
1214 {100, 90}, {90, 90}, {89, 90},
1215
1216 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1217
1218 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1219
1220 {55, 90}, {50, 90}, {45, 90},
1221
1222 {42, 120}, {40, 120}, {39, 120},
1223
1224 {37, 72}, {36, 72}, {35, 72},
1225
1226 {30, 60},
1227 };
1228
1229 for (const auto& test : testCases) {
1230 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001231 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001232
1233 std::stringstream ss;
1234 ss << "ExplicitDefault " << test.first << " fps";
1235 lr.name = ss.str();
1236
1237 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001238 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001239 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001240 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1241 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001242}
1243
Alec Mouri11232a22020-05-14 18:06:25 -07001244TEST_F(RefreshRateConfigsTest,
1245 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1246 auto refreshRateConfigs =
1247 std::make_unique<RefreshRateConfigs>(m60_90Device,
1248 /*currentConfigId=*/HWC_CONFIG_ID_90);
1249
1250 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001251 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001252 0);
1253
1254 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1255 auto& lr = layers[0];
1256
Ady Abrahamdfd62162020-06-10 16:11:56 -07001257 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001258 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001259 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001260 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001261 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001262 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001263 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1264 &consideredSignals));
1265 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001266}
1267
1268TEST_F(RefreshRateConfigsTest,
1269 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1270 auto refreshRateConfigs =
1271 std::make_unique<RefreshRateConfigs>(m60_90Device,
1272 /*currentConfigId=*/HWC_CONFIG_ID_60);
1273
1274 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001275 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001276 0);
1277
1278 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1279 auto& lr = layers[0];
1280
Alec Mouri11232a22020-05-14 18:06:25 -07001281 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001282 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001283 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001284 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001285 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001286 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001287}
1288
1289TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001290 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001291 auto refreshRateConfigs =
1292 std::make_unique<RefreshRateConfigs>(m60_90Device,
1293 /*currentConfigId=*/HWC_CONFIG_ID_90);
1294
1295 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001296 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001297 0);
1298
Ady Abrahamdfd62162020-06-10 16:11:56 -07001299 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001300 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001301 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1302 &consideredSignals));
1303 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001304
1305 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1306 auto& lr = layers[0];
1307
1308 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001309 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001310 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001311 lr.focused = false;
1312 EXPECT_EQ(mExpected90Config,
1313 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1314
1315 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001316 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001317 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001318
1319 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001320 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001321 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001322 lr.focused = false;
1323 EXPECT_EQ(mExpected90Config,
1324 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1325
1326 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001327 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001328 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001329
1330 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001331 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001332 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001333 lr.focused = false;
1334 EXPECT_EQ(mExpected90Config,
1335 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1336
1337 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001338 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001339 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001340
1341 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001342 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001343 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001344 lr.focused = false;
1345 EXPECT_EQ(mExpected90Config,
1346 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1347
1348 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001349 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001350 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001351
1352 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001353 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001354 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001355 lr.focused = false;
1356 EXPECT_EQ(mExpected90Config,
1357 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1358
1359 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001360 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001361 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001362}
1363
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001364TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001365 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001366 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1367 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001368
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001369 // The default policy doesn't allow group switching. Verify that no
1370 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001371 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1372 auto& layer = layers[0];
1373 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001374 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001375 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001376 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001377 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001378
Steven Thomasd4071902020-03-24 16:02:53 -07001379 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001380 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001381 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001382}
Steven Thomasd4071902020-03-24 16:02:53 -07001383
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001384TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1385 auto refreshRateConfigs =
1386 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1387 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001388 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001389 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001390 policy.allowGroupSwitching = true;
1391 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001392
1393 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1394 auto& layer = layers[0];
1395 layer.vote = LayerVoteType::ExplicitDefault;
1396 layer.desiredRefreshRate = Fps(90.0f);
1397 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1398 layer.name = "90Hz ExplicitDefault";
1399 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001400 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001401 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001402 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001403}
1404
1405TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1406 auto refreshRateConfigs =
1407 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1408 /*currentConfigId=*/HWC_CONFIG_ID_60);
1409 RefreshRateConfigs::Policy policy;
1410 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1411 policy.allowGroupSwitching = true;
1412 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001413
1414 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001415 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1416 auto& layer = layers[0];
1417 layer.vote = LayerVoteType::ExplicitDefault;
1418 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001419 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001420 layer.name = "90Hz ExplicitDefault";
1421 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001422 ASSERT_EQ(HWC_CONFIG_ID_60,
1423 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001424 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001425}
1426
1427TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
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 // Verify that we won't do a seamless switch if we request the same mode as the default
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001439 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1440 auto& layer = layers[0];
1441 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001442 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001443 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001444 layer.name = "60Hz ExplicitDefault";
1445 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001446 ASSERT_EQ(HWC_CONFIG_ID_90,
1447 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001448 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001449}
1450
1451TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1452 auto refreshRateConfigs =
1453 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1454 /*currentConfigId=*/HWC_CONFIG_ID_60);
1455 RefreshRateConfigs::Policy policy;
1456 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1457 policy.allowGroupSwitching = true;
1458 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1459
1460 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001461
1462 // Verify that if the current config is in another group and there are no layers with
1463 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001464
1465 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1466 auto& layer = layers[0];
1467 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001468 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001469 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001470 layer.name = "60Hz ExplicitDefault";
1471 layer.focused = true;
1472
Marin Shalamanov46084422020-10-13 12:33:42 +02001473 ASSERT_EQ(HWC_CONFIG_ID_60,
1474 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001475 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001476}
1477
1478TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1479 auto refreshRateConfigs =
1480 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1481 /*currentConfigId=*/HWC_CONFIG_ID_60);
1482 RefreshRateConfigs::Policy policy;
1483 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1484 policy.allowGroupSwitching = true;
1485 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1486
1487 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001488
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001489 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001490 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001491 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1492 layers[0].vote = LayerVoteType::ExplicitDefault;
1493 layers[0].desiredRefreshRate = Fps(60.0f);
1494 layers[0].seamlessness = Seamlessness::OnlySeamless;
1495 layers[0].name = "60Hz ExplicitDefault";
1496 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001497
1498 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001499 layers[1].vote = LayerVoteType::ExplicitDefault;
1500 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1501 layers[1].desiredRefreshRate = Fps(90.0f);
1502 layers[1].name = "90Hz ExplicitDefault";
1503 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001504
1505 ASSERT_EQ(HWC_CONFIG_ID_90,
1506 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001507 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001508}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001509
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001510TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001511 auto refreshRateConfigs =
1512 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1513 /*currentConfigId=*/HWC_CONFIG_ID_60);
1514 RefreshRateConfigs::Policy policy;
1515 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1516 policy.allowGroupSwitching = true;
1517 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1518
1519 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001520
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001521 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1522 // seamlessness=Default can't change the mode group back to the group of the default
1523 // mode.
1524 // For example, this may happen when a video playback requests and gets a seamed switch,
1525 // but another layer (with default seamlessness) starts animating. The animating layer
1526 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001527 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001528 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001529 layers[0].desiredRefreshRate = Fps(60.0f);
1530 layers[0].focused = true;
1531 layers[0].vote = LayerVoteType::ExplicitDefault;
1532 layers[0].name = "60Hz ExplicitDefault";
1533
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001534 layers.push_back(LayerRequirement{.weight = 0.1f});
1535 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1536 layers[1].desiredRefreshRate = Fps(90.0f);
1537 layers[1].focused = true;
1538 layers[1].vote = LayerVoteType::ExplicitDefault;
1539 layers[1].name = "90Hz ExplicitDefault";
1540
Marin Shalamanov46084422020-10-13 12:33:42 +02001541 ASSERT_EQ(HWC_CONFIG_ID_90,
1542 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001543 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001544}
1545
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001546TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1547 auto refreshRateConfigs =
1548 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1549 /*currentConfigId=*/HWC_CONFIG_ID_60);
1550 RefreshRateConfigs::Policy policy;
1551 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1552 policy.allowGroupSwitching = true;
1553 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1554
1555 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1556
1557 // Layer with seamlessness=Default can change the mode group if there's a not
1558 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1559 // when in split screen mode the user switches between the two visible applications.
1560 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1561 layers[0].seamlessness = Seamlessness::Default;
1562 layers[0].desiredRefreshRate = Fps(60.0f);
1563 layers[0].focused = true;
1564 layers[0].vote = LayerVoteType::ExplicitDefault;
1565 layers[0].name = "60Hz ExplicitDefault";
1566
1567 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001568 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1569 layers[1].desiredRefreshRate = Fps(90.0f);
1570 layers[1].focused = false;
1571 layers[1].vote = LayerVoteType::ExplicitDefault;
1572 layers[1].name = "90Hz ExplicitDefault";
1573
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001574 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001575 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1576 .getModeId());
1577}
1578
1579TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1580 auto refreshRateConfigs =
1581 std::make_unique<RefreshRateConfigs>(m30_60Device,
1582 /*currentConfigId=*/HWC_CONFIG_ID_60);
1583
1584 // Allow group switching.
1585 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001586 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001587 policy.allowGroupSwitching = true;
1588 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1589
1590 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1591 auto& layer = layers[0];
1592 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001593 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001594 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001595 layer.name = "60Hz ExplicitExactOrMultiple";
1596 layer.focused = true;
1597
1598 ASSERT_EQ(HWC_CONFIG_ID_60,
1599 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001600 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001601
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001602 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001603 ASSERT_EQ(HWC_CONFIG_ID_120,
1604 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001605 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001606}
1607
1608TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1609 auto refreshRateConfigs =
1610 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1611 /*currentConfigId=*/HWC_CONFIG_ID_60);
1612
1613 // Allow group switching.
1614 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001615 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001616 policy.allowGroupSwitching = true;
1617 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1618
1619 auto layers = std::vector<
1620 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1621 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001622 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001623 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001624 .weight = 0.5f,
1625 .focused = false},
1626 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1627 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001628 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001629 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001630 .weight = 1.0f,
1631 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001632
1633 ASSERT_EQ(HWC_CONFIG_ID_50,
1634 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001635 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001636
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001637 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001638 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001639 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001640
1641 ASSERT_EQ(HWC_CONFIG_ID_25,
1642 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001643 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001644}
1645
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001646TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1647 auto refreshRateConfigs =
1648 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1649 /*currentConfigId=*/HWC_CONFIG_ID_90);
1650
1651 // Allow group switching.
1652 RefreshRateConfigs::Policy policy;
1653 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1654 policy.allowGroupSwitching = true;
1655 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1656
1657 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1658 .vote = LayerVoteType::Min,
1659 .weight = 1.f,
1660 .focused = true}};
1661
1662 ASSERT_EQ(HWC_CONFIG_ID_90,
1663 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1664 .getModeId());
1665}
1666
Steven Thomasf734df42020-04-13 21:09:28 -07001667TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1668 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001669 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001670 /*currentConfigId=*/HWC_CONFIG_ID_60);
1671
1672 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1673 layers[0].name = "Test layer";
1674
Steven Thomasbb374322020-04-28 22:47:16 -07001675 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001676 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001677 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001678 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001679 layers[0].vote = voteType;
1680 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001681 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001682 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001683 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001684 };
1685
1686 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001687 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001688 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001689 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001690 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001691 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001692 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1693 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1694 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1695 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1696 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1697 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001698
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001699 // Layers not focused are not allowed to override primary config
1700 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001701 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001702 /*focused=*/false));
1703 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001704 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001705 /*focused=*/false));
1706
Steven Thomasf734df42020-04-13 21:09:28 -07001707 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001708 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001709 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1710 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001711 EXPECT_EQ(HWC_CONFIG_ID_90,
1712 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001713 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001714 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001715
1716 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001717 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001718 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001719 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1720 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1721 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1722 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1723 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1724 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001725}
1726
Steven Thomasbb374322020-04-28 22:47:16 -07001727TEST_F(RefreshRateConfigsTest, idle) {
1728 auto refreshRateConfigs =
1729 std::make_unique<RefreshRateConfigs>(m60_90Device,
1730 /*currentConfigId=*/HWC_CONFIG_ID_60);
1731
1732 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1733 layers[0].name = "Test layer";
1734
Marin Shalamanov23c44202020-12-22 19:09:20 +01001735 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001736 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001737 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001738 RefreshRateConfigs::GlobalSignals consideredSignals;
1739 const auto configId =
1740 refreshRateConfigs
1741 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1742 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001743 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001744 // Refresh rate will be chosen by either touch state or idle state
1745 EXPECT_EQ(!touchActive, consideredSignals.idle);
1746 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001747 };
1748
1749 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001750 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001751 0);
1752
1753 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001754 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1755 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1756 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1757 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1758 EXPECT_EQ(HWC_CONFIG_ID_90,
1759 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1760 EXPECT_EQ(HWC_CONFIG_ID_90,
1761 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001762
1763 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001764 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001765 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001766 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001767
1768 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001769 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001770 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1771 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1772 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1773 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1774 EXPECT_EQ(HWC_CONFIG_ID_60,
1775 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1776 EXPECT_EQ(HWC_CONFIG_ID_60,
1777 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001778
1779 // Idle should be applied rather than the current config when there are no layers.
1780 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001781 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001782 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001783}
1784
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001785TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1786 auto refreshRateConfigs =
1787 std::make_unique<RefreshRateConfigs>(m60_90Device,
1788 /*currentConfigId=*/HWC_CONFIG_ID_60);
1789
1790 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001791 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1792 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001793 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001794 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001795 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001796 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001797 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001798 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001799 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001800 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001801 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001802 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001803 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001804 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001805 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001806 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001807 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1808 }
1809}
1810
1811TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001812 auto refreshRateConfigs =
1813 std::make_unique<RefreshRateConfigs>(m60_90Device,
1814 /*currentConfigId=*/HWC_CONFIG_ID_60);
1815
1816 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001817 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001818 const RefreshRate& expected;
1819 };
1820
1821 /* clang-format off */
1822 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001823 {Fps(24.0f), mExpected60Config},
1824 {Fps(30.0f), mExpected60Config},
1825 {Fps(45.0f), mExpected90Config},
1826 {Fps(60.0f), mExpected60Config},
1827 {Fps(72.0f), mExpected90Config},
1828 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001829 };
1830 /* clang-format on */
1831
1832 // Make sure the test tests all the known frame rate
1833 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001834 const auto equal =
1835 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1836 knownFrameRatesExpectations.begin(),
1837 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001838 EXPECT_TRUE(equal);
1839
1840 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1841 auto& layer = layers[0];
1842 layer.vote = LayerVoteType::Heuristic;
1843 for (const auto& expectedRate : knownFrameRatesExpectations) {
1844 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001845 const auto& refreshRate =
1846 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001847 EXPECT_EQ(expectedRate.expected, refreshRate);
1848 }
1849}
1850
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001851TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1852 auto refreshRateConfigs =
1853 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1854 /*currentConfigId=*/HWC_CONFIG_ID_60);
1855
1856 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1857 LayerRequirement{.weight = 0.5f}};
1858 auto& explicitExactLayer = layers[0];
1859 auto& explicitExactOrMultipleLayer = layers[1];
1860
1861 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1862 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1863 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1864
1865 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1866 explicitExactLayer.name = "ExplicitExact";
1867 explicitExactLayer.desiredRefreshRate = Fps(30);
1868
1869 EXPECT_EQ(mExpected30Config,
1870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1871 EXPECT_EQ(mExpected30Config,
1872 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1873
1874 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1875 explicitExactLayer.desiredRefreshRate = Fps(60);
1876 EXPECT_EQ(mExpected60Config,
1877 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1878
1879 explicitExactLayer.desiredRefreshRate = Fps(72);
1880 EXPECT_EQ(mExpected72Config,
1881 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1882
1883 explicitExactLayer.desiredRefreshRate = Fps(90);
1884 EXPECT_EQ(mExpected90Config,
1885 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1886
1887 explicitExactLayer.desiredRefreshRate = Fps(120);
1888 EXPECT_EQ(mExpected120Config,
1889 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1890}
1891
1892TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07001893 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001894 auto refreshRateConfigs =
1895 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001896 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001897
1898 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1899 LayerRequirement{.weight = 0.5f}};
1900 auto& explicitExactLayer = layers[0];
1901 auto& explicitExactOrMultipleLayer = layers[1];
1902
1903 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1904 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1905 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1906
1907 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1908 explicitExactLayer.name = "ExplicitExact";
1909 explicitExactLayer.desiredRefreshRate = Fps(30);
1910
1911 EXPECT_EQ(mExpected60Config,
1912 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1913 EXPECT_EQ(mExpected120Config,
1914 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1915
1916 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1917 explicitExactLayer.desiredRefreshRate = Fps(60);
1918 EXPECT_EQ(mExpected120Config,
1919 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1920
1921 explicitExactLayer.desiredRefreshRate = Fps(72);
1922 EXPECT_EQ(mExpected72Config,
1923 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1924
1925 explicitExactLayer.desiredRefreshRate = Fps(90);
1926 EXPECT_EQ(mExpected90Config,
1927 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1928
1929 explicitExactLayer.desiredRefreshRate = Fps(120);
1930 EXPECT_EQ(mExpected120Config,
1931 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1932}
1933
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001934TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1935 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1936
1937 auto refreshRateConfigs =
1938 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1939 /*currentConfigId=*/HWC_CONFIG_ID_60);
1940
1941 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1942 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1943 LayerRequirement>(),
1944 .globalSignals = {.touch = true,
1945 .idle = true},
1946 .outSignalsConsidered =
1947 {.touch = true,
1948 .idle = false},
1949 .resultingBestRefreshRate =
1950 createRefreshRate(
1951 mConfig90)});
1952
1953 EXPECT_EQ(createRefreshRate(mConfig90),
1954 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1955 {.touch = true, .idle = true}));
1956
1957 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
1958 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1959 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1960 LayerRequirement>(),
1961 .globalSignals = {.touch = true,
1962 .idle = true},
1963 .outSignalsConsidered =
1964 cachedSignalsConsidered,
1965 .resultingBestRefreshRate =
1966 createRefreshRate(
1967 mConfig30)});
1968
1969 GlobalSignals signalsConsidered;
1970 EXPECT_EQ(createRefreshRate(mConfig30),
1971 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1972 {.touch = true, .idle = true},
1973 &signalsConsidered));
1974
1975 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1976}
1977
1978TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1979 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1980
1981 auto refreshRateConfigs =
1982 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1983 /*currentConfigId=*/HWC_CONFIG_ID_60);
1984 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1985
1986 GlobalSignals globalSignals{.touch = true, .idle = true};
1987 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1988 LayerRequirement{.weight = 0.5f}};
1989 const auto lastResult =
1990 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1991 /* outSignalsConsidered */ nullptr);
1992
1993 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1994
1995 ASSERT_TRUE(lastInvocation.has_value());
1996 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1997 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1998 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1999
2000 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
2001 // to getBestRefreshRate()
2002 GlobalSignals detaultSignals;
2003 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
2004}
2005
Ady Abraham5e4e9832021-06-14 13:40:56 -07002006TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002007 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002008 auto refreshRateConfigs =
2009 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002010 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002011
2012 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2013 LayerRequirement{.weight = 0.5f}};
2014 auto& explicitExactLayer = layers[0];
2015 auto& explicitExactOrMultipleLayer = layers[1];
2016
2017 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2018 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2019 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2020
2021 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2022 explicitExactLayer.name = "ExplicitExact";
2023 explicitExactLayer.desiredRefreshRate = Fps(30);
2024
2025 EXPECT_EQ(mExpected60Config,
2026 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2027 EXPECT_EQ(mExpected120Config,
2028 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2029
2030 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2031
2032 EXPECT_EQ(mExpected60Config,
2033 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2034 EXPECT_EQ(mExpected60Config,
2035 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2036}
2037
Ana Krulecb9afd792020-06-11 13:16:15 -07002038TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2039 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2040 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2041 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2042}
2043
2044TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2045 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2046
2047 auto refreshRateConfigs =
2048 std::make_unique<RefreshRateConfigs>(m60_90Device,
2049 /*currentConfigId=*/HWC_CONFIG_ID_90);
2050 // SetPolicy(60, 90), current 90Hz => TurnOn.
2051 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2052
2053 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002054 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2055 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002056 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2057
Ady Abrahama91605e2021-06-18 11:41:47 -07002058 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002059 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2060 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002061 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002062
2063 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002064 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2065 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002066 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2067}
2068
Ady Abraham5cc2e262021-03-25 13:09:17 -07002069TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002070 auto refreshRateConfigs =
2071 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2072 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002073
2074 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002075 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2076 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002077
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002078 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002079 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2080 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002081
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002082 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002083 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2084 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002085
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002086 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002087 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2088 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002089
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002090 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002091 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2092 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002093
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002094 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002095 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2096 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
2097 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.6f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002098}
2099
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002100TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002101 auto refreshRateConfigs =
2102 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2103 HWC_CONFIG_ID_120);
2104
2105 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002106 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2107 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002108}
2109
2110TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002111 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002112 auto refreshRateConfigs =
2113 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002114 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002115
2116 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2117 layers[0].name = "Test layer";
2118 layers[0].ownerUid = 1234;
2119 layers[0].desiredRefreshRate = Fps(60.0f);
2120 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002121 auto frameRateOverrides =
2122 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002123 ASSERT_EQ(1, frameRateOverrides.size());
2124 ASSERT_EQ(1, frameRateOverrides.count(1234));
2125 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2126
2127 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002128 frameRateOverrides =
2129 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002130 ASSERT_EQ(1, frameRateOverrides.size());
2131 ASSERT_EQ(1, frameRateOverrides.count(1234));
2132 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2133
2134 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002135 frameRateOverrides =
2136 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002137 ASSERT_TRUE(frameRateOverrides.empty());
2138
2139 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002140 frameRateOverrides =
2141 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002142 ASSERT_TRUE(frameRateOverrides.empty());
2143
2144 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002145 frameRateOverrides =
2146 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002147 ASSERT_TRUE(frameRateOverrides.empty());
2148
2149 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002150 frameRateOverrides =
2151 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002152 ASSERT_TRUE(frameRateOverrides.empty());
2153}
2154
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002155TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002156 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002157 auto refreshRateConfigs =
2158 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002159 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002160
2161 auto layers = std::vector<LayerRequirement>{
2162 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2163 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2164 };
2165
2166 layers[0].name = "Test layer 1234";
2167 layers[0].desiredRefreshRate = Fps(60.0f);
2168 layers[0].vote = LayerVoteType::ExplicitDefault;
2169
2170 layers[1].name = "Test layer 5678";
2171 layers[1].desiredRefreshRate = Fps(30.0f);
2172 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002173 auto frameRateOverrides =
2174 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002175
2176 ASSERT_EQ(2, frameRateOverrides.size());
2177 ASSERT_EQ(1, frameRateOverrides.count(1234));
2178 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2179 ASSERT_EQ(1, frameRateOverrides.count(5678));
2180 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2181
2182 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002183 frameRateOverrides =
2184 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002185 ASSERT_EQ(1, frameRateOverrides.size());
2186 ASSERT_EQ(1, frameRateOverrides.count(1234));
2187 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2188
2189 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002190 frameRateOverrides =
2191 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2192 ASSERT_TRUE(frameRateOverrides.empty());
2193}
2194
2195TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002196 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002197 auto refreshRateConfigs =
2198 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002199 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002200
2201 auto layers = std::vector<LayerRequirement>{
2202 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2203 };
2204
2205 layers[0].name = "Test layer";
2206 layers[0].desiredRefreshRate = Fps(60.0f);
2207 layers[0].vote = LayerVoteType::ExplicitDefault;
2208
2209 auto frameRateOverrides =
2210 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2211 ASSERT_EQ(1, frameRateOverrides.size());
2212 ASSERT_EQ(1, frameRateOverrides.count(1234));
2213 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2214
2215 frameRateOverrides =
2216 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2217 ASSERT_EQ(1, frameRateOverrides.size());
2218 ASSERT_EQ(1, frameRateOverrides.count(1234));
2219 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2220
2221 layers[0].vote = LayerVoteType::ExplicitExact;
2222 frameRateOverrides =
2223 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2224 ASSERT_EQ(1, frameRateOverrides.size());
2225 ASSERT_EQ(1, frameRateOverrides.count(1234));
2226 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2227
2228 frameRateOverrides =
2229 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2230 ASSERT_EQ(1, frameRateOverrides.size());
2231 ASSERT_EQ(1, frameRateOverrides.count(1234));
2232 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2233
2234 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2235 frameRateOverrides =
2236 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2237 ASSERT_EQ(1, frameRateOverrides.size());
2238 ASSERT_EQ(1, frameRateOverrides.count(1234));
2239 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2240
2241 frameRateOverrides =
2242 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002243 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002244}
2245
Marin Shalamanov75f37252021-02-10 21:43:57 +01002246TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
2247 auto refreshRateConfigs =
2248 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2249 /*currentConfigId=*/HWC_CONFIG_ID_30);
2250 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
2251 /* allowGroupSwitching */ false,
2252 /* range */ {Fps(30.0f), Fps(30.0f)}});
2253
2254 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
2255
2256 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
2257 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
2258 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
2259
2260 EXPECT_TRUE(
2261 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
2262 EXPECT_TRUE(
2263 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
2264}
2265
Alec Mouri0a1cc962019-03-14 12:33:02 -07002266} // namespace
2267} // namespace scheduler
2268} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002269
2270// TODO(b/129481165): remove the #pragma below and fix conversion issues
2271#pragma clang diagnostic pop // ignored "-Wextra"