blob: d4b229fa222bc0a2822a6656472a147ac363734a [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)};
Ady Abrahamabc27602020-04-08 17:20:29 -0700168private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100169 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
170 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700171};
172
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100173using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700174
Alec Mouri0a1cc962019-03-14 12:33:02 -0700175RefreshRateConfigsTest::RefreshRateConfigsTest() {
176 const ::testing::TestInfo* const test_info =
177 ::testing::UnitTest::GetInstance()->current_test_info();
178 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
179}
180
181RefreshRateConfigsTest::~RefreshRateConfigsTest() {
182 const ::testing::TestInfo* const test_info =
183 ::testing::UnitTest::GetInstance()->current_test_info();
184 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
185}
186
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100187DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
188 int64_t vsyncPeriod, ui::Size resolution) {
189 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
190 .setId(modeId)
Ady Abrahamabc27602020-04-08 17:20:29 -0700191 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100192 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100193 .setHeight(resolution.height)
194 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700195 .build();
196}
197
Alec Mouri0a1cc962019-03-14 12:33:02 -0700198namespace {
199/* ------------------------------------------------------------------------
200 * Test cases
201 */
Ady Abraham2139f732019-11-13 18:56:40 -0800202TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700203 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700204 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
205 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700206}
207
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100208TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100209 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700210 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
211 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100212 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100213 0);
214 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
215 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100216}
217
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700218TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700219 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700220 std::make_unique<RefreshRateConfigs>(m60_90Device,
221 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700222
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100223 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
224 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700225
Ady Abrahamabc27602020-04-08 17:20:29 -0700226 ASSERT_EQ(mExpected60Config, minRate);
227 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800228
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100229 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800230 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800231 ASSERT_EQ(minRateByPolicy, minRate);
232 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700233}
Ady Abraham2139f732019-11-13 18:56:40 -0800234
235TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800236 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700237 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
238 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800239
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100240 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
241 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
242 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800243 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800244
Ady Abrahamabc27602020-04-08 17:20:29 -0700245 ASSERT_EQ(mExpected60Config, minRate);
246 ASSERT_EQ(mExpected60Config, minRate60);
247 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800248
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100249 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
250 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100251 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800252
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100253 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800254 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800255
Ady Abrahamabc27602020-04-08 17:20:29 -0700256 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
257 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
258 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
259}
260
261TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
262 auto refreshRateConfigs =
263 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
264 /*currentConfigId=*/HWC_CONFIG_ID_60);
265
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100266 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
267 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
268 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700269 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
270
271 ASSERT_EQ(mExpected60Config, minRate);
272 ASSERT_EQ(mExpected60Config, minRate60);
273 ASSERT_EQ(mExpected60Config, performanceRate60);
274
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100275 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
276 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100277 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700278
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100279 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700280 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
281
282 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
283 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
284 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800285}
286
287TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800288 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700289 std::make_unique<RefreshRateConfigs>(m60_90Device,
290 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800291
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100292 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
293 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800294
Ady Abrahamabc27602020-04-08 17:20:29 -0700295 ASSERT_EQ(mExpected60Config, minRate);
296 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800297
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100298 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
299 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800300
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100301 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
302 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700303 ASSERT_EQ(mExpected60Config, minRate60);
304 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800305}
306
307TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800308 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700309 std::make_unique<RefreshRateConfigs>(m60_90Device,
310 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800311 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100312 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100313 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800314 }
315
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100316 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800317 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100318 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100319 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800320 }
321
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100322 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
323 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800324 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100325 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100326 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800327 }
328}
329
Steven Thomasbb374322020-04-28 22:47:16 -0700330TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700331 auto refreshRateConfigs =
332 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
333 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800334
Steven Thomasdebafed2020-05-18 17:30:35 -0700335 // If there are no layers we select the default frame rate, which is the max of the primary
336 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800337 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700338 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700339 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800340
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100341 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
342 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700343 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700344 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800345}
346
Steven Thomasbb374322020-04-28 22:47:16 -0700347TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800348 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700349 std::make_unique<RefreshRateConfigs>(m60_90Device,
350 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800351
352 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
353 auto& lr = layers[0];
354
355 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800356 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700357 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700358 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800359
360 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800361 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700362 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700363 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800364
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100365 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800366 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800367 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700368 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700369 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800370
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100371 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800372 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700373 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700374 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800375
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100376 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800377 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700378 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700379 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800380
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100381 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800382 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700383 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700384 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800385
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100386 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800387 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700388 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700389 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800390
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800391 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100392 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
393 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800394
395 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700396 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700397 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398
399 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700400 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700401 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800402
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100403 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800404 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700405 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700406 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800407
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100408 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700409 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700410 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800411
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100412 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700413 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700414 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800415
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100416 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700417 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700418 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800419
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100420 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700421 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700422 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800423
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100424 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
425 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
426 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800427
428 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700429 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700430 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431
432 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700433 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700434 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800435
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100436 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800437 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700438 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700439 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800440
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100441 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700442 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700443 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800444
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100445 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700446 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700447 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800448
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100449 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700450 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700451 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800452
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100453 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700454 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700455 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800456
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100457 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
458 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
459 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800460 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700461 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700462 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463
464 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700465 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700466 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800467
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100468 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800469 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700470 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700471 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800472
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100473 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700474 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700475 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800476
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100477 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700478 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700479 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800480
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100481 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700482 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700483 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800484
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100485 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700486 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700487 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800488}
489
Steven Thomasbb374322020-04-28 22:47:16 -0700490TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800491 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700492 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
493 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800494
495 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
496 auto& lr = layers[0];
497
498 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700499 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700500 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800501
502 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700503 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700504 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800505
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100506 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800507 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700508 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700509 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800510
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100511 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700512 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700513 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800514
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100515 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700516 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700517 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800518
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100519 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700520 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700521 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800522
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100523 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700524 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700525 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800526}
527
Steven Thomasbb374322020-04-28 22:47:16 -0700528TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800529 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700530 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
531 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800532
533 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
534 LayerRequirement{.weight = 1.0f}};
535 auto& lr1 = layers[0];
536 auto& lr2 = layers[1];
537
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100538 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800539 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100540 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700542 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700543 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800544
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100545 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800546 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100547 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800548 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700549 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700550 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800551
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100552 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800553 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100554 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800555 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700556 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700557 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800558}
559
Steven Thomasbb374322020-04-28 22:47:16 -0700560TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800561 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700562 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
563 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800564
565 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
566 LayerRequirement{.weight = 1.0f}};
567 auto& lr1 = layers[0];
568 auto& lr2 = layers[1];
569
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100570 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800571 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800572 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100573 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800574 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800575 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700576 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700577 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800578
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100579 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800580 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800581 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100582 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800583 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800584 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700585 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700586 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800587
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100588 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800589 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800590 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100591 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800592 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800593 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700594 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700595 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800596
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100597 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800598 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800599 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100600 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800601 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800602 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700603 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700604 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800605
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100606 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800607 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
608 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100609 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800610 lr2.vote = LayerVoteType::ExplicitDefault;
611 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700612 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700613 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800614
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100615 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800616 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800617 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100618 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800619 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800620 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700621 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700622 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800623
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100624 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800625 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800626 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100627 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800628 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800629 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700630 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700631 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800632
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100633 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800634 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800635 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100636 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800637 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800638 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700639 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700640 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800641
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100642 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800643 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800644 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100645 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800646 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700648 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700649 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800650}
651
Steven Thomasbb374322020-04-28 22:47:16 -0700652TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800653 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700654 std::make_unique<RefreshRateConfigs>(m30_60Device,
655 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800656
657 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
658 auto& lr = layers[0];
659
660 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700661 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700662 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800663
664 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700665 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700666 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800667
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100668 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800669 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700670 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700671 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800672
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100673 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700674 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700675 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800676
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100677 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700678 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700679 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800680
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100681 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700682 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700683 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800684
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100685 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700686 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700687 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800688}
689
Steven Thomasbb374322020-04-28 22:47:16 -0700690TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800691 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700692 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
693 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800694
695 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
696 auto& lr = layers[0];
697
698 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800699 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700700 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700701 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800702
703 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800704 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700705 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700706 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800707
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100708 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800709 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800710 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700711 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700712 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800713
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100714 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800715 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700716 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700717 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700718 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800720
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100721 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800722 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700723 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700724 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700725 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700726 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800727
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100728 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800729 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700730 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700731 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700732 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700733 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800734
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100735 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800736 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700737 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700738 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700739 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700740 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800741
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100742 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800743 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
744 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700745 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700746 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700747 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700748 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800749}
750
Steven Thomasbb374322020-04-28 22:47:16 -0700751TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800752 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700753 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
754 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800755
756 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
757 LayerRequirement{.weight = 1.0f}};
758 auto& lr1 = layers[0];
759 auto& lr2 = layers[1];
760
761 lr1.vote = LayerVoteType::Min;
762 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700763 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700764 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800765
766 lr1.vote = LayerVoteType::Min;
767 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100768 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700769 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700770 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800771
772 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800773 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100774 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700775 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700776 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800777
778 lr1.vote = LayerVoteType::Max;
779 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100780 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700781 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700782 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800783
784 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800785 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100786 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700787 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700788 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800789
790 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100791 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800792 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100793 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700794 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700795 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796
797 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100798 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800799 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100800 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700801 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700802 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800803}
804
Steven Thomasbb374322020-04-28 22:47:16 -0700805TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800806 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700807 std::make_unique<RefreshRateConfigs>(m60_90Device,
808 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809
810 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
811 auto& lr = layers[0];
812
Ady Abraham71c437d2020-01-31 15:56:57 -0800813 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800814 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100815 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800816 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700817 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700818 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800819 }
820}
821
Steven Thomasbb374322020-04-28 22:47:16 -0700822TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800823 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700824 std::make_unique<RefreshRateConfigs>(m60_90Device,
825 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800826
827 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
828 LayerRequirement{.weight = 1.0f}};
829 auto& lr1 = layers[0];
830 auto& lr2 = layers[1];
831
832 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100833 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800834 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100835 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700836 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700837 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800838
839 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100840 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800841 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100842 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700843 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700844 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800845
846 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100847 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800848 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100849 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700850 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700851 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -0800852}
853
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800854TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100855 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
856 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
857 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
858 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
859 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -0800860}
861
Steven Thomasbb374322020-04-28 22:47:16 -0700862TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -0800863 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700864 std::make_unique<RefreshRateConfigs>(m60_90Device,
865 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -0800866
867 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
868 auto& lr = layers[0];
869
Ady Abraham71c437d2020-01-31 15:56:57 -0800870 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -0800871 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100872 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800873 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700874 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700875 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -0800876 }
877}
878
Steven Thomasbb374322020-04-28 22:47:16 -0700879TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -0800880 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700881 std::make_unique<RefreshRateConfigs>(m60_90Device,
882 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -0800883
884 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
885 LayerRequirement{.weight = 1.0f}};
886 auto& lr1 = layers[0];
887 auto& lr2 = layers[1];
888
889 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100890 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800891 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800892 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100893 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800894 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700895 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700896 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800897
898 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100899 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800900 lr1.name = "60Hz ExplicitExactOrMultiple";
901 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100902 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800903 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700904 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700905 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800906
907 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100908 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800909 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800910 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800911 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700912 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700913 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -0800914
915 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100916 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800917 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800918 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100919 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800920 lr2.name = "90Hz Heuristic";
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 Abraham34702102020-02-10 14:12:05 -0800923
924 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100925 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800926 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -0800927 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800928 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700929 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700930 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800931}
932
933TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800934 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700935 std::make_unique<RefreshRateConfigs>(m60_90Device,
936 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800937
938 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
939 LayerRequirement{.weight = 1.0f}};
940 auto& lr1 = layers[0];
941 auto& lr2 = layers[1];
942
943 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100944 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800945 lr1.name = "60Hz ExplicitExactOrMultiple";
946 lr2.vote = LayerVoteType::NoVote;
947 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700948 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700949 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800950
951 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100952 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800953 lr1.name = "60Hz ExplicitExactOrMultiple";
954 lr2.vote = LayerVoteType::NoVote;
955 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -0700956 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700957 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800958
959 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100960 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800961 lr1.name = "60Hz ExplicitExactOrMultiple";
962 lr2.vote = LayerVoteType::Max;
963 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700964 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700965 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800966
967 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100968 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800969 lr1.name = "60Hz ExplicitExactOrMultiple";
970 lr2.vote = LayerVoteType::Max;
971 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700972 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700973 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800974
975 // The other layer starts to provide buffers
976 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100977 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800978 lr1.name = "60Hz ExplicitExactOrMultiple";
979 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100980 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800981 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700982 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700983 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -0800984}
985
986TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -0700987 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -0800988 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700989 std::make_unique<RefreshRateConfigs>(m60_90Device,
990 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800991
Ady Abrahamdfd62162020-06-10 16:11:56 -0700992 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
993 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800994
Ady Abrahamdfd62162020-06-10 16:11:56 -0700995 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
996 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -0800997
998 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
999 LayerRequirement{.weight = 1.0f}};
1000 auto& lr1 = layers[0];
1001 auto& lr2 = layers[1];
1002
1003 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001004 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001005 lr1.name = "60Hz ExplicitExactOrMultiple";
1006 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001007 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001008 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001009 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1010 &consideredSignals);
1011 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001012
1013 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001014 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001015 lr1.name = "60Hz ExplicitExactOrMultiple";
1016 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001017 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001018 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001019 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1020 &consideredSignals);
1021 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001022
1023 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001024 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001025 lr1.name = "60Hz ExplicitExactOrMultiple";
1026 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001027 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001028 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001029 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1030 &consideredSignals);
1031 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001032
1033 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001034 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001035 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001036 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001037 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001038 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001039 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1040 &consideredSignals);
1041 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001042}
1043
Steven Thomasbb374322020-04-28 22:47:16 -07001044TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001045 auto refreshRateConfigs =
1046 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1047 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001048
1049 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1050 auto& lr = layers[0];
1051
1052 // Prepare a table with the vote and the expected refresh rate
1053 const std::vector<std::pair<float, float>> testCases = {
1054 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1055
1056 {100, 90}, {90, 90}, {89, 90},
1057
1058 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1059
1060 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1061
1062 {55, 90}, {50, 90}, {45, 90},
1063
1064 {42, 120}, {40, 120}, {39, 120},
1065
1066 {37, 72}, {36, 72}, {35, 72},
1067
1068 {30, 60},
1069 };
1070
1071 for (const auto& test : testCases) {
1072 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001073 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001074
1075 std::stringstream ss;
1076 ss << "ExplicitDefault " << test.first << " fps";
1077 lr.name = ss.str();
1078
1079 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001080 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001081 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001082 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1083 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001084}
1085
Alec Mouri11232a22020-05-14 18:06:25 -07001086TEST_F(RefreshRateConfigsTest,
1087 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1088 auto refreshRateConfigs =
1089 std::make_unique<RefreshRateConfigs>(m60_90Device,
1090 /*currentConfigId=*/HWC_CONFIG_ID_90);
1091
1092 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001093 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001094 0);
1095
1096 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1097 auto& lr = layers[0];
1098
Ady Abrahamdfd62162020-06-10 16:11:56 -07001099 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001100 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001101 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001102 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001103 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001104 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001105 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1106 &consideredSignals));
1107 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001108}
1109
1110TEST_F(RefreshRateConfigsTest,
1111 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1112 auto refreshRateConfigs =
1113 std::make_unique<RefreshRateConfigs>(m60_90Device,
1114 /*currentConfigId=*/HWC_CONFIG_ID_60);
1115
1116 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001117 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001118 0);
1119
1120 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1121 auto& lr = layers[0];
1122
Alec Mouri11232a22020-05-14 18:06:25 -07001123 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001124 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001125 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001126 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001127 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001128 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001129}
1130
1131TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001132 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001133 auto refreshRateConfigs =
1134 std::make_unique<RefreshRateConfigs>(m60_90Device,
1135 /*currentConfigId=*/HWC_CONFIG_ID_90);
1136
1137 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001138 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001139 0);
1140
Ady Abrahamdfd62162020-06-10 16:11:56 -07001141 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001142 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001143 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1144 &consideredSignals));
1145 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001146
1147 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1148 auto& lr = layers[0];
1149
1150 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001151 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001152 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001153 lr.focused = false;
1154 EXPECT_EQ(mExpected90Config,
1155 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1156
1157 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001158 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001159 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001160
1161 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001162 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001163 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001164 lr.focused = false;
1165 EXPECT_EQ(mExpected90Config,
1166 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1167
1168 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001169 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001170 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001171
1172 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001173 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001174 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001175 lr.focused = false;
1176 EXPECT_EQ(mExpected90Config,
1177 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1178
1179 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001180 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001181 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001182
1183 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001184 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001185 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001186 lr.focused = false;
1187 EXPECT_EQ(mExpected90Config,
1188 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1189
1190 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001191 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001192 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001193
1194 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001195 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001196 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001197 lr.focused = false;
1198 EXPECT_EQ(mExpected90Config,
1199 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1200
1201 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001202 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001203 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001204}
1205
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001206TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001207 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001208 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1209 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001210
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001211 // The default policy doesn't allow group switching. Verify that no
1212 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001213 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1214 auto& layer = layers[0];
1215 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001216 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001217 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001218 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001219 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001220
Steven Thomasd4071902020-03-24 16:02:53 -07001221 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001222 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001223 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001224}
Steven Thomasd4071902020-03-24 16:02:53 -07001225
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001226TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1227 auto refreshRateConfigs =
1228 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1229 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001230 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001231 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001232 policy.allowGroupSwitching = true;
1233 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001234
1235 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1236 auto& layer = layers[0];
1237 layer.vote = LayerVoteType::ExplicitDefault;
1238 layer.desiredRefreshRate = Fps(90.0f);
1239 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1240 layer.name = "90Hz ExplicitDefault";
1241 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001242 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001243 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001244 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001245}
1246
1247TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1248 auto refreshRateConfigs =
1249 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1250 /*currentConfigId=*/HWC_CONFIG_ID_60);
1251 RefreshRateConfigs::Policy policy;
1252 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1253 policy.allowGroupSwitching = true;
1254 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001255
1256 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001257 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1258 auto& layer = layers[0];
1259 layer.vote = LayerVoteType::ExplicitDefault;
1260 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001261 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001262 layer.name = "90Hz ExplicitDefault";
1263 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001264 ASSERT_EQ(HWC_CONFIG_ID_60,
1265 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001266 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001267}
1268
1269TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1270 auto refreshRateConfigs =
1271 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1272 /*currentConfigId=*/HWC_CONFIG_ID_60);
1273 RefreshRateConfigs::Policy policy;
1274 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1275 policy.allowGroupSwitching = true;
1276 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1277
1278 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001279
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001280 // 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 +01001281 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1282 auto& layer = layers[0];
1283 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001284 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001285 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001286 layer.name = "60Hz ExplicitDefault";
1287 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001288 ASSERT_EQ(HWC_CONFIG_ID_90,
1289 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001290 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001291}
1292
1293TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1294 auto refreshRateConfigs =
1295 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1296 /*currentConfigId=*/HWC_CONFIG_ID_60);
1297 RefreshRateConfigs::Policy policy;
1298 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1299 policy.allowGroupSwitching = true;
1300 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1301
1302 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001303
1304 // Verify that if the current config is in another group and there are no layers with
1305 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001306
1307 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1308 auto& layer = layers[0];
1309 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001310 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001311 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001312 layer.name = "60Hz ExplicitDefault";
1313 layer.focused = true;
1314
Marin Shalamanov46084422020-10-13 12:33:42 +02001315 ASSERT_EQ(HWC_CONFIG_ID_60,
1316 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001317 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001318}
1319
1320TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1321 auto refreshRateConfigs =
1322 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1323 /*currentConfigId=*/HWC_CONFIG_ID_60);
1324 RefreshRateConfigs::Policy policy;
1325 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1326 policy.allowGroupSwitching = true;
1327 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1328
1329 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001330
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001331 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001332 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001333 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1334 layers[0].vote = LayerVoteType::ExplicitDefault;
1335 layers[0].desiredRefreshRate = Fps(60.0f);
1336 layers[0].seamlessness = Seamlessness::OnlySeamless;
1337 layers[0].name = "60Hz ExplicitDefault";
1338 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001339
1340 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001341 layers[1].vote = LayerVoteType::ExplicitDefault;
1342 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1343 layers[1].desiredRefreshRate = Fps(90.0f);
1344 layers[1].name = "90Hz ExplicitDefault";
1345 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001346
1347 ASSERT_EQ(HWC_CONFIG_ID_90,
1348 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001349 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001350}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001351
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001352TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001353 auto refreshRateConfigs =
1354 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1355 /*currentConfigId=*/HWC_CONFIG_ID_60);
1356 RefreshRateConfigs::Policy policy;
1357 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1358 policy.allowGroupSwitching = true;
1359 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1360
1361 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001362
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001363 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1364 // seamlessness=Default can't change the mode group back to the group of the default
1365 // mode.
1366 // For example, this may happen when a video playback requests and gets a seamed switch,
1367 // but another layer (with default seamlessness) starts animating. The animating layer
1368 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001369 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001370 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001371 layers[0].desiredRefreshRate = Fps(60.0f);
1372 layers[0].focused = true;
1373 layers[0].vote = LayerVoteType::ExplicitDefault;
1374 layers[0].name = "60Hz ExplicitDefault";
1375
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001376 layers.push_back(LayerRequirement{.weight = 0.1f});
1377 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1378 layers[1].desiredRefreshRate = Fps(90.0f);
1379 layers[1].focused = true;
1380 layers[1].vote = LayerVoteType::ExplicitDefault;
1381 layers[1].name = "90Hz ExplicitDefault";
1382
Marin Shalamanov46084422020-10-13 12:33:42 +02001383 ASSERT_EQ(HWC_CONFIG_ID_90,
1384 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001385 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001386}
1387
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001388TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1389 auto refreshRateConfigs =
1390 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1391 /*currentConfigId=*/HWC_CONFIG_ID_60);
1392 RefreshRateConfigs::Policy policy;
1393 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1394 policy.allowGroupSwitching = true;
1395 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1396
1397 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1398
1399 // Layer with seamlessness=Default can change the mode group if there's a not
1400 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1401 // when in split screen mode the user switches between the two visible applications.
1402 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1403 layers[0].seamlessness = Seamlessness::Default;
1404 layers[0].desiredRefreshRate = Fps(60.0f);
1405 layers[0].focused = true;
1406 layers[0].vote = LayerVoteType::ExplicitDefault;
1407 layers[0].name = "60Hz ExplicitDefault";
1408
1409 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001410 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1411 layers[1].desiredRefreshRate = Fps(90.0f);
1412 layers[1].focused = false;
1413 layers[1].vote = LayerVoteType::ExplicitDefault;
1414 layers[1].name = "90Hz ExplicitDefault";
1415
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001416 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001417 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1418 .getModeId());
1419}
1420
1421TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1422 auto refreshRateConfigs =
1423 std::make_unique<RefreshRateConfigs>(m30_60Device,
1424 /*currentConfigId=*/HWC_CONFIG_ID_60);
1425
1426 // Allow group switching.
1427 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001428 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001429 policy.allowGroupSwitching = true;
1430 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1431
1432 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1433 auto& layer = layers[0];
1434 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001435 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001436 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001437 layer.name = "60Hz ExplicitExactOrMultiple";
1438 layer.focused = true;
1439
1440 ASSERT_EQ(HWC_CONFIG_ID_60,
1441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001442 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001443
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001444 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001445 ASSERT_EQ(HWC_CONFIG_ID_120,
1446 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001447 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001448}
1449
1450TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1451 auto refreshRateConfigs =
1452 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1453 /*currentConfigId=*/HWC_CONFIG_ID_60);
1454
1455 // Allow group switching.
1456 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001457 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001458 policy.allowGroupSwitching = true;
1459 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1460
1461 auto layers = std::vector<
1462 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1463 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001464 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001465 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001466 .weight = 0.5f,
1467 .focused = false},
1468 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1469 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001470 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001471 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001472 .weight = 1.0f,
1473 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001474
1475 ASSERT_EQ(HWC_CONFIG_ID_50,
1476 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001477 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001478
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001479 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001480 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001481 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001482
1483 ASSERT_EQ(HWC_CONFIG_ID_25,
1484 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001485 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001486}
1487
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001488TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1489 auto refreshRateConfigs =
1490 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1491 /*currentConfigId=*/HWC_CONFIG_ID_90);
1492
1493 // Allow group switching.
1494 RefreshRateConfigs::Policy policy;
1495 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1496 policy.allowGroupSwitching = true;
1497 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1498
1499 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1500 .vote = LayerVoteType::Min,
1501 .weight = 1.f,
1502 .focused = true}};
1503
1504 ASSERT_EQ(HWC_CONFIG_ID_90,
1505 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1506 .getModeId());
1507}
1508
Steven Thomasf734df42020-04-13 21:09:28 -07001509TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1510 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001511 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001512 /*currentConfigId=*/HWC_CONFIG_ID_60);
1513
1514 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1515 layers[0].name = "Test layer";
1516
Steven Thomasbb374322020-04-28 22:47:16 -07001517 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001518 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001519 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001520 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001521 layers[0].vote = voteType;
1522 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001523 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001524 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001525 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001526 };
1527
1528 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001529 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001530 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001531 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001532 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001533 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001534 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1535 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1536 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1537 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1538 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1539 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001540
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001541 // Layers not focused are not allowed to override primary config
1542 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001543 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001544 /*focused=*/false));
1545 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001546 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001547 /*focused=*/false));
1548
Steven Thomasf734df42020-04-13 21:09:28 -07001549 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001550 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001551 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1552 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001553 EXPECT_EQ(HWC_CONFIG_ID_90,
1554 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001555 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001556 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001557
1558 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001559 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001560 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001561 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1562 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1563 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1564 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1565 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1566 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001567}
1568
Steven Thomasbb374322020-04-28 22:47:16 -07001569TEST_F(RefreshRateConfigsTest, idle) {
1570 auto refreshRateConfigs =
1571 std::make_unique<RefreshRateConfigs>(m60_90Device,
1572 /*currentConfigId=*/HWC_CONFIG_ID_60);
1573
1574 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1575 layers[0].name = "Test layer";
1576
Marin Shalamanov23c44202020-12-22 19:09:20 +01001577 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001578 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001579 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001580 RefreshRateConfigs::GlobalSignals consideredSignals;
1581 const auto configId =
1582 refreshRateConfigs
1583 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1584 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001585 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001586 // Refresh rate will be chosen by either touch state or idle state
1587 EXPECT_EQ(!touchActive, consideredSignals.idle);
1588 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001589 };
1590
1591 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001592 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001593 0);
1594
1595 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001596 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1597 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1598 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1599 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1600 EXPECT_EQ(HWC_CONFIG_ID_90,
1601 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1602 EXPECT_EQ(HWC_CONFIG_ID_90,
1603 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001604
1605 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001606 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001607 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001608 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001609
1610 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001611 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001612 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1613 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1614 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1615 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1616 EXPECT_EQ(HWC_CONFIG_ID_60,
1617 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1618 EXPECT_EQ(HWC_CONFIG_ID_60,
1619 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001620
1621 // Idle should be applied rather than the current config when there are no layers.
1622 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001623 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001624 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001625}
1626
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001627TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1628 auto refreshRateConfigs =
1629 std::make_unique<RefreshRateConfigs>(m60_90Device,
1630 /*currentConfigId=*/HWC_CONFIG_ID_60);
1631
1632 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001633 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1634 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001635 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001636 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001637 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001638 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001639 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001640 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001641 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001642 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001643 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001644 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001645 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001646 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001647 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001648 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001649 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1650 }
1651}
1652
1653TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001654 auto refreshRateConfigs =
1655 std::make_unique<RefreshRateConfigs>(m60_90Device,
1656 /*currentConfigId=*/HWC_CONFIG_ID_60);
1657
1658 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001659 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001660 const RefreshRate& expected;
1661 };
1662
1663 /* clang-format off */
1664 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001665 {Fps(24.0f), mExpected60Config},
1666 {Fps(30.0f), mExpected60Config},
1667 {Fps(45.0f), mExpected90Config},
1668 {Fps(60.0f), mExpected60Config},
1669 {Fps(72.0f), mExpected90Config},
1670 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001671 };
1672 /* clang-format on */
1673
1674 // Make sure the test tests all the known frame rate
1675 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001676 const auto equal =
1677 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1678 knownFrameRatesExpectations.begin(),
1679 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001680 EXPECT_TRUE(equal);
1681
1682 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1683 auto& layer = layers[0];
1684 layer.vote = LayerVoteType::Heuristic;
1685 for (const auto& expectedRate : knownFrameRatesExpectations) {
1686 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001687 const auto& refreshRate =
1688 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001689 EXPECT_EQ(expectedRate.expected, refreshRate);
1690 }
1691}
1692
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001693TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1694 auto refreshRateConfigs =
1695 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1696 /*currentConfigId=*/HWC_CONFIG_ID_60);
1697
1698 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1699 LayerRequirement{.weight = 0.5f}};
1700 auto& explicitExactLayer = layers[0];
1701 auto& explicitExactOrMultipleLayer = layers[1];
1702
1703 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1704 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1705 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1706
1707 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1708 explicitExactLayer.name = "ExplicitExact";
1709 explicitExactLayer.desiredRefreshRate = Fps(30);
1710
1711 EXPECT_EQ(mExpected30Config,
1712 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1713 EXPECT_EQ(mExpected30Config,
1714 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1715
1716 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1717 explicitExactLayer.desiredRefreshRate = Fps(60);
1718 EXPECT_EQ(mExpected60Config,
1719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1720
1721 explicitExactLayer.desiredRefreshRate = Fps(72);
1722 EXPECT_EQ(mExpected72Config,
1723 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1724
1725 explicitExactLayer.desiredRefreshRate = Fps(90);
1726 EXPECT_EQ(mExpected90Config,
1727 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1728
1729 explicitExactLayer.desiredRefreshRate = Fps(120);
1730 EXPECT_EQ(mExpected120Config,
1731 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1732}
1733
1734TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
1735 auto refreshRateConfigs =
1736 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1737 /*currentConfigId=*/HWC_CONFIG_ID_60,
1738 /*enableFrameRateOverride=*/true);
1739
1740 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1741 LayerRequirement{.weight = 0.5f}};
1742 auto& explicitExactLayer = layers[0];
1743 auto& explicitExactOrMultipleLayer = layers[1];
1744
1745 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1746 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1747 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1748
1749 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1750 explicitExactLayer.name = "ExplicitExact";
1751 explicitExactLayer.desiredRefreshRate = Fps(30);
1752
1753 EXPECT_EQ(mExpected60Config,
1754 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1755 EXPECT_EQ(mExpected120Config,
1756 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1757
1758 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1759 explicitExactLayer.desiredRefreshRate = Fps(60);
1760 EXPECT_EQ(mExpected120Config,
1761 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1762
1763 explicitExactLayer.desiredRefreshRate = Fps(72);
1764 EXPECT_EQ(mExpected72Config,
1765 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1766
1767 explicitExactLayer.desiredRefreshRate = Fps(90);
1768 EXPECT_EQ(mExpected90Config,
1769 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1770
1771 explicitExactLayer.desiredRefreshRate = Fps(120);
1772 EXPECT_EQ(mExpected120Config,
1773 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1774}
1775
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001776TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1777 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1778
1779 auto refreshRateConfigs =
1780 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1781 /*currentConfigId=*/HWC_CONFIG_ID_60);
1782
1783 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1784 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1785 LayerRequirement>(),
1786 .globalSignals = {.touch = true,
1787 .idle = true},
1788 .outSignalsConsidered =
1789 {.touch = true,
1790 .idle = false},
1791 .resultingBestRefreshRate =
1792 createRefreshRate(
1793 mConfig90)});
1794
1795 EXPECT_EQ(createRefreshRate(mConfig90),
1796 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1797 {.touch = true, .idle = true}));
1798
1799 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
1800 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1801 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1802 LayerRequirement>(),
1803 .globalSignals = {.touch = true,
1804 .idle = true},
1805 .outSignalsConsidered =
1806 cachedSignalsConsidered,
1807 .resultingBestRefreshRate =
1808 createRefreshRate(
1809 mConfig30)});
1810
1811 GlobalSignals signalsConsidered;
1812 EXPECT_EQ(createRefreshRate(mConfig30),
1813 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1814 {.touch = true, .idle = true},
1815 &signalsConsidered));
1816
1817 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1818}
1819
1820TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1821 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1822
1823 auto refreshRateConfigs =
1824 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1825 /*currentConfigId=*/HWC_CONFIG_ID_60);
1826 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1827
1828 GlobalSignals globalSignals{.touch = true, .idle = true};
1829 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1830 LayerRequirement{.weight = 0.5f}};
1831 const auto lastResult =
1832 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1833 /* outSignalsConsidered */ nullptr);
1834
1835 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1836
1837 ASSERT_TRUE(lastInvocation.has_value());
1838 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1839 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1840 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1841
1842 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1843 // to getBestRefreshRate()
1844 GlobalSignals detaultSignals;
1845 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1846}
1847
Ady Abraham5e4e9832021-06-14 13:40:56 -07001848TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
1849 auto refreshRateConfigs =
1850 std::make_unique<RefreshRateConfigs>(m60_120Device,
1851 /*currentConfigId=*/HWC_CONFIG_ID_60,
1852 /*enableFrameRateOverride=*/true);
1853
1854 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1855 LayerRequirement{.weight = 0.5f}};
1856 auto& explicitExactLayer = layers[0];
1857 auto& explicitExactOrMultipleLayer = layers[1];
1858
1859 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1860 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1861 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1862
1863 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1864 explicitExactLayer.name = "ExplicitExact";
1865 explicitExactLayer.desiredRefreshRate = Fps(30);
1866
1867 EXPECT_EQ(mExpected60Config,
1868 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1869 EXPECT_EQ(mExpected120Config,
1870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1871
1872 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
1873
1874 EXPECT_EQ(mExpected60Config,
1875 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1876 EXPECT_EQ(mExpected60Config,
1877 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1878}
1879
Ana Krulecb9afd792020-06-11 13:16:15 -07001880TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
1881 EXPECT_TRUE(mExpected60Config < mExpected90Config);
1882 EXPECT_FALSE(mExpected60Config < mExpected60Config);
1883 EXPECT_FALSE(mExpected90Config < mExpected90Config);
1884}
1885
1886TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
1887 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
1888
1889 auto refreshRateConfigs =
1890 std::make_unique<RefreshRateConfigs>(m60_90Device,
1891 /*currentConfigId=*/HWC_CONFIG_ID_90);
1892 // SetPolicy(60, 90), current 90Hz => TurnOn.
1893 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1894
1895 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001896 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
1897 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001898 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
1899
Ady Abrahama91605e2021-06-18 11:41:47 -07001900 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001901 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
1902 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07001903 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07001904
1905 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001906 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
1907 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07001908 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
1909}
1910
Ady Abraham5cc2e262021-03-25 13:09:17 -07001911TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07001912 auto refreshRateConfigs =
1913 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1914 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08001915
1916 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001917 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1918 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001919
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001920 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001921 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1922 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001923
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001924 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001925 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1926 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001927
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001928 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001929 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1930 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07001931
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001932 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001933 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1934 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07001935
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001936 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07001937 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
1938 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
1939 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.6f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08001940}
1941
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001942TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001943 auto refreshRateConfigs =
1944 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
1945 HWC_CONFIG_ID_120);
1946
1947 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001948 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
1949 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08001950}
1951
1952TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
1953 auto refreshRateConfigs =
1954 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001955 HWC_CONFIG_ID_120,
1956 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08001957
1958 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1959 layers[0].name = "Test layer";
1960 layers[0].ownerUid = 1234;
1961 layers[0].desiredRefreshRate = Fps(60.0f);
1962 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001963 auto frameRateOverrides =
1964 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001965 ASSERT_EQ(1, frameRateOverrides.size());
1966 ASSERT_EQ(1, frameRateOverrides.count(1234));
1967 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1968
1969 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001970 frameRateOverrides =
1971 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001972 ASSERT_EQ(1, frameRateOverrides.size());
1973 ASSERT_EQ(1, frameRateOverrides.count(1234));
1974 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
1975
1976 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001977 frameRateOverrides =
1978 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001979 ASSERT_TRUE(frameRateOverrides.empty());
1980
1981 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001982 frameRateOverrides =
1983 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001984 ASSERT_TRUE(frameRateOverrides.empty());
1985
1986 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001987 frameRateOverrides =
1988 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001989 ASSERT_TRUE(frameRateOverrides.empty());
1990
1991 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001992 frameRateOverrides =
1993 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08001994 ASSERT_TRUE(frameRateOverrides.empty());
1995}
1996
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001997TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
Ady Abraham62a0be22020-12-08 16:54:10 -08001998 auto refreshRateConfigs =
1999 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002000 HWC_CONFIG_ID_120,
2001 /*enableFrameRateOverride=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002002
2003 auto layers = std::vector<LayerRequirement>{
2004 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2005 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2006 };
2007
2008 layers[0].name = "Test layer 1234";
2009 layers[0].desiredRefreshRate = Fps(60.0f);
2010 layers[0].vote = LayerVoteType::ExplicitDefault;
2011
2012 layers[1].name = "Test layer 5678";
2013 layers[1].desiredRefreshRate = Fps(30.0f);
2014 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002015 auto frameRateOverrides =
2016 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002017
2018 ASSERT_EQ(2, frameRateOverrides.size());
2019 ASSERT_EQ(1, frameRateOverrides.count(1234));
2020 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2021 ASSERT_EQ(1, frameRateOverrides.count(5678));
2022 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2023
2024 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002025 frameRateOverrides =
2026 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002027 ASSERT_EQ(1, frameRateOverrides.size());
2028 ASSERT_EQ(1, frameRateOverrides.count(1234));
2029 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2030
2031 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002032 frameRateOverrides =
2033 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2034 ASSERT_TRUE(frameRateOverrides.empty());
2035}
2036
2037TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
2038 auto refreshRateConfigs =
2039 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2040 HWC_CONFIG_ID_120,
2041 /*enableFrameRateOverride=*/true);
2042
2043 auto layers = std::vector<LayerRequirement>{
2044 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2045 };
2046
2047 layers[0].name = "Test layer";
2048 layers[0].desiredRefreshRate = Fps(60.0f);
2049 layers[0].vote = LayerVoteType::ExplicitDefault;
2050
2051 auto frameRateOverrides =
2052 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2053 ASSERT_EQ(1, frameRateOverrides.size());
2054 ASSERT_EQ(1, frameRateOverrides.count(1234));
2055 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2056
2057 frameRateOverrides =
2058 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2059 ASSERT_EQ(1, frameRateOverrides.size());
2060 ASSERT_EQ(1, frameRateOverrides.count(1234));
2061 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2062
2063 layers[0].vote = LayerVoteType::ExplicitExact;
2064 frameRateOverrides =
2065 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2066 ASSERT_EQ(1, frameRateOverrides.size());
2067 ASSERT_EQ(1, frameRateOverrides.count(1234));
2068 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2069
2070 frameRateOverrides =
2071 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2072 ASSERT_EQ(1, frameRateOverrides.size());
2073 ASSERT_EQ(1, frameRateOverrides.count(1234));
2074 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2075
2076 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2077 frameRateOverrides =
2078 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2079 ASSERT_EQ(1, frameRateOverrides.size());
2080 ASSERT_EQ(1, frameRateOverrides.count(1234));
2081 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2082
2083 frameRateOverrides =
2084 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002085 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002086}
2087
Marin Shalamanov75f37252021-02-10 21:43:57 +01002088TEST_F(RefreshRateConfigsTest, updateDisplayModes) {
2089 auto refreshRateConfigs =
2090 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2091 /*currentConfigId=*/HWC_CONFIG_ID_30);
2092 refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(HWC_CONFIG_ID_30),
2093 /* allowGroupSwitching */ false,
2094 /* range */ {Fps(30.0f), Fps(30.0f)}});
2095
2096 refreshRateConfigs->updateDisplayModes(m60_90Device, HWC_CONFIG_ID_60);
2097
2098 const auto currentRefreshRate = refreshRateConfigs->getCurrentRefreshRate();
2099 EXPECT_TRUE(currentRefreshRate.getFps().equalsWithMargin(Fps(60.0)));
2100 EXPECT_EQ(currentRefreshRate.getModeId(), HWC_CONFIG_ID_60);
2101
2102 EXPECT_TRUE(
2103 getMaxSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(90.0)));
2104 EXPECT_TRUE(
2105 getMinSupportedRefreshRate(*refreshRateConfigs).getFps().equalsWithMargin(Fps(60.0)));
2106}
2107
Alec Mouri0a1cc962019-03-14 12:33:02 -07002108} // namespace
2109} // namespace scheduler
2110} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002111
2112// TODO(b/129481165): remove the #pragma below and fix conversion issues
2113#pragma clang diagnostic pop // ignored "-Wextra"