blob: c04919ff0447892252b46e310bce2070640887c9 [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) {
Ady Abraham6b7ad652021-06-23 17:34:57 -070054 return {displayMode, RefreshRate::ConstructorTag(0)};
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020055 }
56
Marin Shalamanove8a663d2020-11-24 17:48:00 +010057 Fps findClosestKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs, Fps frameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070058 return refreshRateConfigs.findClosestKnownFrameRate(frameRate);
59 }
60
Marin Shalamanove8a663d2020-11-24 17:48:00 +010061 std::vector<Fps> getKnownFrameRate(const RefreshRateConfigs& refreshRateConfigs) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -070062 return refreshRateConfigs.mKnownFrameRates;
63 }
64
Marin Shalamanoveadf2e72020-12-10 15:35:28 +010065 RefreshRate getMinRefreshRateByPolicy(const RefreshRateConfigs& refreshRateConfigs) {
66 std::lock_guard lock(refreshRateConfigs.mLock);
67 return refreshRateConfigs.getMinRefreshRateByPolicyLocked();
68 }
69
70 RefreshRate getMinSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
71 std::lock_guard lock(refreshRateConfigs.mLock);
72 return *refreshRateConfigs.mMinSupportedRefreshRate;
73 }
74
75 RefreshRate getMaxSupportedRefreshRate(const RefreshRateConfigs& refreshRateConfigs) {
76 std::lock_guard lock(refreshRateConfigs.mLock);
77 return *refreshRateConfigs.mMaxSupportedRefreshRate;
78 }
79
Marin Shalamanov4c7831e2021-06-08 20:44:06 +020080 void setLastBestRefreshRateInvocation(RefreshRateConfigs& refreshRateConfigs,
81 const GetBestRefreshRateInvocation& invocation) {
82 std::lock_guard lock(refreshRateConfigs.mLock);
83 refreshRateConfigs.lastBestRefreshRateInvocation.emplace(
84 GetBestRefreshRateInvocation(invocation));
85 }
86
87 std::optional<GetBestRefreshRateInvocation> getLastBestRefreshRateInvocation(
88 const RefreshRateConfigs& refreshRateConfigs) {
89 std::lock_guard lock(refreshRateConfigs.mLock);
90 return refreshRateConfigs.lastBestRefreshRateInvocation;
91 }
92
Ady Abrahamabc27602020-04-08 17:20:29 -070093 // Test config IDs
Marin Shalamanov23c44202020-12-22 19:09:20 +010094 static inline const DisplayModeId HWC_CONFIG_ID_60 = DisplayModeId(0);
95 static inline const DisplayModeId HWC_CONFIG_ID_90 = DisplayModeId(1);
96 static inline const DisplayModeId HWC_CONFIG_ID_72 = DisplayModeId(2);
97 static inline const DisplayModeId HWC_CONFIG_ID_120 = DisplayModeId(3);
98 static inline const DisplayModeId HWC_CONFIG_ID_30 = DisplayModeId(4);
99 static inline const DisplayModeId HWC_CONFIG_ID_25 = DisplayModeId(5);
100 static inline const DisplayModeId HWC_CONFIG_ID_50 = DisplayModeId(6);
Ady Abrahamabc27602020-04-08 17:20:29 -0700101
102 // Test configs
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100103 DisplayModePtr mConfig60 = createDisplayMode(HWC_CONFIG_ID_60, 0, Fps(60.0f).getPeriodNsecs());
104 DisplayModePtr mConfig90 = createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100105 DisplayModePtr mConfig90DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100106 createDisplayMode(HWC_CONFIG_ID_90, 1, Fps(90.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100107 DisplayModePtr mConfig90DifferentResolution =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100108 createDisplayMode(HWC_CONFIG_ID_90, 0, Fps(90.0f).getPeriodNsecs(), ui::Size(111, 222));
109 DisplayModePtr mConfig72 = createDisplayMode(HWC_CONFIG_ID_72, 0, Fps(72.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100110 DisplayModePtr mConfig72DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100111 createDisplayMode(HWC_CONFIG_ID_72, 1, Fps(72.0f).getPeriodNsecs());
112 DisplayModePtr mConfig120 =
113 createDisplayMode(HWC_CONFIG_ID_120, 0, Fps(120.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100114 DisplayModePtr mConfig120DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100115 createDisplayMode(HWC_CONFIG_ID_120, 1, Fps(120.0f).getPeriodNsecs());
116 DisplayModePtr mConfig30 = createDisplayMode(HWC_CONFIG_ID_30, 0, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100117 DisplayModePtr mConfig30DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100118 createDisplayMode(HWC_CONFIG_ID_30, 1, Fps(30.0f).getPeriodNsecs());
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100119 DisplayModePtr mConfig25DifferentGroup =
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100120 createDisplayMode(HWC_CONFIG_ID_25, 1, Fps(25.0f).getPeriodNsecs());
121 DisplayModePtr mConfig50 = createDisplayMode(HWC_CONFIG_ID_50, 0, Fps(50.0f).getPeriodNsecs());
Ady Abrahamabc27602020-04-08 17:20:29 -0700122
123 // Test device configurations
Marin Shalamanov46084422020-10-13 12:33:42 +0200124 // The positions of the configs in the arrays below MUST match their IDs. For example,
125 // the first config should always be 60Hz, the second 90Hz etc.
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100126 DisplayModes m60OnlyConfigDevice = {mConfig60};
127 DisplayModes m60_90Device = {mConfig60, mConfig90};
128 DisplayModes m60_90DeviceWithDifferentGroups = {mConfig60, mConfig90DifferentGroup};
129 DisplayModes m60_90DeviceWithDifferentResolutions = {mConfig60, mConfig90DifferentResolution};
130 DisplayModes m60_72_90Device = {mConfig60, mConfig90, mConfig72};
131 DisplayModes m60_90_72_120Device = {mConfig60, mConfig90, mConfig72, mConfig120};
132 DisplayModes m30_60_72_90_120Device = {mConfig60, mConfig90, mConfig72, mConfig120, mConfig30};
133 DisplayModes m30_60Device = {mConfig60, mConfig90DifferentGroup, mConfig72DifferentGroup,
134 mConfig120DifferentGroup, mConfig30};
135 DisplayModes m30_60_72_90Device = {mConfig60, mConfig90, mConfig72, mConfig120DifferentGroup,
136 mConfig30};
137 DisplayModes m30_60_90Device = {mConfig60, mConfig90, mConfig72DifferentGroup,
138 mConfig120DifferentGroup, mConfig30};
139 DisplayModes m25_30_50_60Device = {mConfig60,
140 mConfig90,
141 mConfig72DifferentGroup,
142 mConfig120DifferentGroup,
143 mConfig30DifferentGroup,
144 mConfig25DifferentGroup,
145 mConfig50};
Ady Abraham5e4e9832021-06-14 13:40:56 -0700146 DisplayModes m60_120Device = {mConfig60, mConfig120};
Ady Abrahamabc27602020-04-08 17:20:29 -0700147
148 // Expected RefreshRate objects
Ady Abraham6b7ad652021-06-23 17:34:57 -0700149 RefreshRate mExpected60Config = {mConfig60, RefreshRate::ConstructorTag(0)};
150 RefreshRate mExpectedAlmost60Config = {createDisplayMode(HWC_CONFIG_ID_60, 0, 16666665),
151 RefreshRate::ConstructorTag(0)};
152 RefreshRate mExpected90Config = {mConfig90, RefreshRate::ConstructorTag(0)};
153 RefreshRate mExpected90DifferentGroupConfig = {mConfig90DifferentGroup,
154 RefreshRate::ConstructorTag(0)};
155 RefreshRate mExpected90DifferentResolutionConfig = {mConfig90DifferentResolution,
Ady Abrahamabc27602020-04-08 17:20:29 -0700156 RefreshRate::ConstructorTag(0)};
Ady Abraham6b7ad652021-06-23 17:34:57 -0700157 RefreshRate mExpected72Config = {mConfig72, RefreshRate::ConstructorTag(0)};
158 RefreshRate mExpected30Config = {mConfig30, RefreshRate::ConstructorTag(0)};
159 RefreshRate mExpected120Config = {mConfig120, RefreshRate::ConstructorTag(0)};
rnlee3bd610662021-06-23 16:27:57 -0700160
Ady Abrahamabc27602020-04-08 17:20:29 -0700161private:
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100162 DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,
163 ui::Size resolution = ui::Size());
Alec Mouri0a1cc962019-03-14 12:33:02 -0700164};
165
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100166using Builder = DisplayMode::Builder;
Ady Abrahamabc27602020-04-08 17:20:29 -0700167
Alec Mouri0a1cc962019-03-14 12:33:02 -0700168RefreshRateConfigsTest::RefreshRateConfigsTest() {
169 const ::testing::TestInfo* const test_info =
170 ::testing::UnitTest::GetInstance()->current_test_info();
171 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
172}
173
174RefreshRateConfigsTest::~RefreshRateConfigsTest() {
175 const ::testing::TestInfo* const test_info =
176 ::testing::UnitTest::GetInstance()->current_test_info();
177 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
178}
179
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100180DisplayModePtr RefreshRateConfigsTest::createDisplayMode(DisplayModeId modeId, int32_t group,
181 int64_t vsyncPeriod, ui::Size resolution) {
182 return DisplayMode::Builder(hal::HWConfigId(modeId.value()))
183 .setId(modeId)
Ady Abraham5e7ee862021-06-23 17:43:41 -0700184 .setPhysicalDisplayId(PhysicalDisplayId::fromPort(0))
Ady Abrahamabc27602020-04-08 17:20:29 -0700185 .setVsyncPeriod(int32_t(vsyncPeriod))
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100186 .setGroup(group)
Marin Shalamanov3ea1d602020-12-16 19:59:39 +0100187 .setHeight(resolution.height)
188 .setWidth(resolution.width)
Ady Abrahamabc27602020-04-08 17:20:29 -0700189 .build();
190}
191
Alec Mouri0a1cc962019-03-14 12:33:02 -0700192namespace {
193/* ------------------------------------------------------------------------
194 * Test cases
195 */
Ady Abraham2139f732019-11-13 18:56:40 -0800196TEST_F(RefreshRateConfigsTest, oneDeviceConfig_SwitchingSupported) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700197 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700198 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
199 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700200}
201
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100202TEST_F(RefreshRateConfigsTest, invalidPolicy) {
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100203 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700204 std::make_unique<RefreshRateConfigs>(m60OnlyConfigDevice,
205 /*currentConfigId=*/HWC_CONFIG_ID_60);
Marin Shalamanov23c44202020-12-22 19:09:20 +0100206 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({DisplayModeId(10), {Fps(60), Fps(60)}}),
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100207 0);
208 ASSERT_LT(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(20), Fps(40)}}),
209 0);
Ana Kruleced3a8cc2019-11-14 00:55:07 +0100210}
211
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700212TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700213 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700214 std::make_unique<RefreshRateConfigs>(m60_90Device,
215 /*currentConfigId=*/HWC_CONFIG_ID_60);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700216
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100217 const auto& minRate = getMinSupportedRefreshRate(*refreshRateConfigs);
218 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700219
Ady Abrahamabc27602020-04-08 17:20:29 -0700220 ASSERT_EQ(mExpected60Config, minRate);
221 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800222
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100223 const auto& minRateByPolicy = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800224 const auto& performanceRateByPolicy = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800225 ASSERT_EQ(minRateByPolicy, minRate);
226 ASSERT_EQ(performanceRateByPolicy, performanceRate);
Alec Mouri0a1cc962019-03-14 12:33:02 -0700227}
Ady Abraham2139f732019-11-13 18:56:40 -0800228
229TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentGroups) {
Ady Abraham2139f732019-11-13 18:56:40 -0800230 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700231 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
232 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800233
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100234 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
235 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
236 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800237 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800238
Ady Abrahamabc27602020-04-08 17:20:29 -0700239 ASSERT_EQ(mExpected60Config, minRate);
240 ASSERT_EQ(mExpected60Config, minRate60);
241 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800242
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100243 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
244 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100245 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800246
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100247 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abraham2e1dd892020-03-05 13:48:36 -0800248 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800249
Ady Abrahamabc27602020-04-08 17:20:29 -0700250 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate);
251 ASSERT_EQ(mExpected90DifferentGroupConfig, minRate90);
252 ASSERT_EQ(mExpected90DifferentGroupConfig, performanceRate90);
253}
254
255TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesFullRefreshRateMap_differentResolutions) {
256 auto refreshRateConfigs =
257 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentResolutions,
258 /*currentConfigId=*/HWC_CONFIG_ID_60);
259
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100260 const auto& minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
261 const auto& performanceRate = getMaxSupportedRefreshRate(*refreshRateConfigs);
262 const auto& minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700263 const auto& performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
264
265 ASSERT_EQ(mExpected60Config, minRate);
266 ASSERT_EQ(mExpected60Config, minRate60);
267 ASSERT_EQ(mExpected60Config, performanceRate60);
268
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100269 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(60), Fps(90)}}),
270 0);
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100271 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamabc27602020-04-08 17:20:29 -0700272
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100273 const auto& minRate90 = getMinRefreshRateByPolicy(*refreshRateConfigs);
Ady Abrahamabc27602020-04-08 17:20:29 -0700274 const auto& performanceRate90 = refreshRateConfigs->getMaxRefreshRateByPolicy();
275
276 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate);
277 ASSERT_EQ(mExpected90DifferentResolutionConfig, minRate90);
278 ASSERT_EQ(mExpected90DifferentResolutionConfig, performanceRate90);
Ady Abraham2139f732019-11-13 18:56:40 -0800279}
280
281TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_policyChange) {
Ady Abraham2139f732019-11-13 18:56:40 -0800282 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700283 std::make_unique<RefreshRateConfigs>(m60_90Device,
284 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ana Krulec3f6a2062020-01-23 15:48:01 -0800285
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100286 auto minRate = getMinRefreshRateByPolicy(*refreshRateConfigs);
287 auto performanceRate = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abraham2139f732019-11-13 18:56:40 -0800288
Ady Abrahamabc27602020-04-08 17:20:29 -0700289 ASSERT_EQ(mExpected60Config, minRate);
290 ASSERT_EQ(mExpected90Config, performanceRate);
Ady Abraham2139f732019-11-13 18:56:40 -0800291
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100292 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
293 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800294
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100295 auto minRate60 = getMinRefreshRateByPolicy(*refreshRateConfigs);
296 auto performanceRate60 = refreshRateConfigs->getMaxRefreshRateByPolicy();
Ady Abrahamabc27602020-04-08 17:20:29 -0700297 ASSERT_EQ(mExpected60Config, minRate60);
298 ASSERT_EQ(mExpected60Config, performanceRate60);
Ady Abraham2139f732019-11-13 18:56:40 -0800299}
300
301TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getCurrentRefreshRate) {
Ady Abraham2139f732019-11-13 18:56:40 -0800302 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700303 std::make_unique<RefreshRateConfigs>(m60_90Device,
304 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800305 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100306 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100307 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_60);
Ady Abraham2139f732019-11-13 18:56:40 -0800308 }
309
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100310 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
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_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800314 }
315
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100316 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
317 0);
Ady Abraham2139f732019-11-13 18:56:40 -0800318 {
Marin Shalamanoveadf2e72020-12-10 15:35:28 +0100319 auto current = refreshRateConfigs->getCurrentRefreshRate();
Marin Shalamanova7fe3042021-01-29 21:02:08 +0100320 EXPECT_EQ(current.getModeId(), HWC_CONFIG_ID_90);
Ady Abraham2139f732019-11-13 18:56:40 -0800321 }
322}
323
Steven Thomasbb374322020-04-28 22:47:16 -0700324TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) {
Ady Abrahamabc27602020-04-08 17:20:29 -0700325 auto refreshRateConfigs =
326 std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/
327 HWC_CONFIG_ID_72);
Ana Krulec3d367c82020-02-25 15:02:01 -0800328
Steven Thomasdebafed2020-05-18 17:30:35 -0700329 // If there are no layers we select the default frame rate, which is the max of the primary
330 // range.
Ana Krulec3d367c82020-02-25 15:02:01 -0800331 auto layers = std::vector<LayerRequirement>{};
Steven Thomasdebafed2020-05-18 17:30:35 -0700332 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700333 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800334
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100335 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
336 0);
Ady Abrahamabc27602020-04-08 17:20:29 -0700337 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700338 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ana Krulec3d367c82020-02-25 15:02:01 -0800339}
340
Steven Thomasbb374322020-04-28 22:47:16 -0700341TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800342 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700343 std::make_unique<RefreshRateConfigs>(m60_90Device,
344 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800345
346 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
347 auto& lr = layers[0];
348
349 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800350 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700351 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700352 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800353
354 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800355 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700356 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700357 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800358
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100359 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800360 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800361 lr.name = "90Hz Heuristic";
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(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800366 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700367 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700368 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800369
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100370 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800371 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700372 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800374
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100375 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800376 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700377 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700378 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800379
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100380 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800381 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700382 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700383 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800384
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800385 lr.name = "";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100386 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
387 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800388
389 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700390 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700391 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800392
393 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700394 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700395 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800396
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100397 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800398 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700399 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700400 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800401
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100402 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700403 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700404 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800405
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100406 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700407 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700408 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800409
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100410 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700411 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700412 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800413
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100414 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700415 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700416 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800417
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100418 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
419 {HWC_CONFIG_ID_90, {Fps(90.0f), Fps(90.0f)}}),
420 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800421
422 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700423 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700424 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800425
426 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700427 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700428 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800429
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100430 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800431 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700432 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700433 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800434
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100435 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700436 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700437 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800438
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100439 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700440 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700441 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800442
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100443 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700444 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700445 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800446
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100447 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700448 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700449 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800450
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100451 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
452 {HWC_CONFIG_ID_60, {Fps(0.0f), Fps(120.0f)}}),
453 0);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800454 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700455 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700456 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800457
458 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700459 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700460 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800461
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100462 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800463 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700464 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700465 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800466
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100467 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700468 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700469 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800470
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100471 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700472 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700473 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800474
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100475 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700476 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700477 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800478
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100479 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700480 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700481 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800482}
483
rnlee3bd610662021-06-23 16:27:57 -0700484TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) {
485 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90};
486 auto refreshRateConfigs =
487 std::make_unique<RefreshRateConfigs>(m60_90Device,
488 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
489
490 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
491 auto& lr = layers[0];
492
493 lr.vote = LayerVoteType::Min;
494 lr.name = "Min";
495 EXPECT_EQ(mExpected60Config,
496 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
497
498 lr.vote = LayerVoteType::Max;
499 lr.name = "Max";
500 EXPECT_EQ(mExpected90Config,
501 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
502
503 lr.desiredRefreshRate = Fps(90.0f);
504 lr.vote = LayerVoteType::Heuristic;
505 lr.name = "90Hz Heuristic";
506 EXPECT_EQ(mExpected90Config,
507 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
508
509 lr.desiredRefreshRate = Fps(60.0f);
510 lr.name = "60Hz Heuristic";
511 EXPECT_EQ(mExpected60Config,
512 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
513
514 lr.desiredRefreshRate = Fps(45.0f);
515 lr.name = "45Hz Heuristic";
516 EXPECT_EQ(mExpected90Config,
517 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
518
519 lr.desiredRefreshRate = Fps(30.0f);
520 lr.name = "30Hz Heuristic";
521 EXPECT_EQ(mExpected60Config,
522 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
523
524 lr.desiredRefreshRate = Fps(24.0f);
525 lr.name = "24Hz Heuristic";
526 EXPECT_EQ(mExpected60Config,
527 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
528}
529
Steven Thomasbb374322020-04-28 22:47:16 -0700530TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800531 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700532 std::make_unique<RefreshRateConfigs>(m60_72_90Device,
533 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800534
535 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
536 auto& lr = layers[0];
537
538 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700539 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700540 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800541
542 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700543 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700544 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800545
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100546 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800547 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700548 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700549 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800550
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100551 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700552 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700553 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800554
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100555 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700556 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700557 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800558
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100559 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700560 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700561 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800562
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100563 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700564 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700565 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800566}
567
Steven Thomasbb374322020-04-28 22:47:16 -0700568TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90_120) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800569 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700570 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
571 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800572
573 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
574 LayerRequirement{.weight = 1.0f}};
575 auto& lr1 = layers[0];
576 auto& lr2 = layers[1];
577
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100578 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800579 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100580 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800581 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700582 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700583 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800584
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100585 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800586 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100587 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800588 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700589 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700590 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800591
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100592 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800593 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100594 lr2.desiredRefreshRate = Fps(48.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800595 lr2.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700596 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700597 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800598}
599
Steven Thomasbb374322020-04-28 22:47:16 -0700600TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {
Ady Abraham71c437d2020-01-31 15:56:57 -0800601 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700602 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
603 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham71c437d2020-01-31 15:56:57 -0800604
605 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
606 LayerRequirement{.weight = 1.0f}};
607 auto& lr1 = layers[0];
608 auto& lr2 = layers[1];
609
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100610 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800611 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800612 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100613 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800614 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800615 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700616 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700617 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800618
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100619 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800620 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800621 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100622 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800623 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800624 lr2.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700625 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700626 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800627
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100628 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800629 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800630 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100631 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800632 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800633 lr2.name = "60Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700634 EXPECT_EQ(mExpected120Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700635 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800636
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100637 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800638 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800639 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100640 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800641 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800642 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700643 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700644 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800645
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100646 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800647 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
648 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100649 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800650 lr2.vote = LayerVoteType::ExplicitDefault;
651 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700652 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700653 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800654
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100655 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800656 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800657 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100658 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800659 lr2.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800660 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700661 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700662 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800663
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100664 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800665 lr1.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800666 lr1.name = "24Hz Heuristic";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100667 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800668 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800669 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700670 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700671 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800672
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100673 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800674 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800675 lr1.name = "24Hz ExplicitExactOrMultiple";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100676 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800677 lr2.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800678 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -0700679 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700680 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800681
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100682 lr1.desiredRefreshRate = Fps(24.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800683 lr1.vote = LayerVoteType::ExplicitDefault;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800684 lr1.name = "24Hz ExplicitDefault";
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100685 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800686 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800687 lr2.name = "90Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700688 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700689 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham71c437d2020-01-31 15:56:57 -0800690}
691
rnlee3bd610662021-06-23 16:27:57 -0700692TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) {
693 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
694 auto refreshRateConfigs =
695 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
696 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
697
698 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
699 LayerRequirement{.weight = 1.0f}};
700 auto& lr1 = layers[0];
701 auto& lr2 = layers[1];
702
703 lr1.desiredRefreshRate = Fps(24.0f);
704 lr1.vote = LayerVoteType::ExplicitDefault;
705 lr1.name = "24Hz ExplicitDefault";
706 lr2.desiredRefreshRate = Fps(60.0f);
707 lr2.vote = LayerVoteType::Heuristic;
708 lr2.name = "60Hz Heuristic";
709 EXPECT_EQ(mExpected120Config,
710 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
711
712 lr1.desiredRefreshRate = Fps(24.0f);
713 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
714 lr1.name = "24Hz ExplicitExactOrMultiple";
715 lr2.desiredRefreshRate = Fps(60.0f);
716 lr2.vote = LayerVoteType::Heuristic;
717 lr2.name = "60Hz Heuristic";
718 EXPECT_EQ(mExpected60Config,
719 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
720
721 lr1.desiredRefreshRate = Fps(24.0f);
722 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
723 lr1.name = "24Hz ExplicitExactOrMultiple";
724 lr2.desiredRefreshRate = Fps(60.0f);
725 lr2.vote = LayerVoteType::ExplicitDefault;
726 lr2.name = "60Hz ExplicitDefault";
727 EXPECT_EQ(mExpected72Config,
728 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
729
730 lr1.desiredRefreshRate = Fps(24.0f);
731 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
732 lr1.name = "24Hz ExplicitExactOrMultiple";
733 lr2.desiredRefreshRate = Fps(90.0f);
734 lr2.vote = LayerVoteType::Heuristic;
735 lr2.name = "90Hz Heuristic";
736 EXPECT_EQ(mExpected90Config,
737 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
738
739 lr1.desiredRefreshRate = Fps(24.0f);
740 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
741 lr1.name = "24Hz ExplicitExactOrMultiple";
742 lr2.desiredRefreshRate = Fps(90.0f);
743 lr2.vote = LayerVoteType::ExplicitDefault;
744 lr2.name = "90Hz Heuristic";
745 EXPECT_EQ(mExpected72Config,
746 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
747
748 lr1.desiredRefreshRate = Fps(24.0f);
749 lr1.vote = LayerVoteType::ExplicitDefault;
750 lr1.name = "24Hz ExplicitDefault";
751 lr2.desiredRefreshRate = Fps(90.0f);
752 lr2.vote = LayerVoteType::Heuristic;
753 lr2.name = "90Hz Heuristic";
754 EXPECT_EQ(mExpected90Config,
755 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
756
757 lr1.desiredRefreshRate = Fps(24.0f);
758 lr1.vote = LayerVoteType::Heuristic;
759 lr1.name = "24Hz Heuristic";
760 lr2.desiredRefreshRate = Fps(90.0f);
761 lr2.vote = LayerVoteType::ExplicitDefault;
762 lr2.name = "90Hz ExplicitDefault";
763 EXPECT_EQ(mExpected72Config,
764 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
765
766 lr1.desiredRefreshRate = Fps(24.0f);
767 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
768 lr1.name = "24Hz ExplicitExactOrMultiple";
769 lr2.desiredRefreshRate = Fps(90.0f);
770 lr2.vote = LayerVoteType::ExplicitDefault;
771 lr2.name = "90Hz ExplicitDefault";
772 EXPECT_EQ(mExpected72Config,
773 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
774
775 lr1.desiredRefreshRate = Fps(24.0f);
776 lr1.vote = LayerVoteType::ExplicitDefault;
777 lr1.name = "24Hz ExplicitDefault";
778 lr2.desiredRefreshRate = Fps(90.0f);
779 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
780 lr2.name = "90Hz ExplicitExactOrMultiple";
781 EXPECT_EQ(mExpected90Config,
782 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
783}
784
Steven Thomasbb374322020-04-28 22:47:16 -0700785TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800786 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700787 std::make_unique<RefreshRateConfigs>(m30_60Device,
788 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800789
790 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
791 auto& lr = layers[0];
792
793 lr.vote = LayerVoteType::Min;
Ady Abrahamabc27602020-04-08 17:20:29 -0700794 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700795 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800796
797 lr.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700798 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700799 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800800
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100801 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800802 lr.vote = LayerVoteType::Heuristic;
Ady Abrahamabc27602020-04-08 17:20:29 -0700803 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700804 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800805
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100806 lr.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700807 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700808 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800809
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100810 lr.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700811 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700812 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800813
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100814 lr.desiredRefreshRate = Fps(30.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700815 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700816 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800817
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100818 lr.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700819 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700820 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800821}
822
Steven Thomasbb374322020-04-28 22:47:16 -0700823TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_72_90) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800824 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700825 std::make_unique<RefreshRateConfigs>(m30_60_72_90Device,
826 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800827
828 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
829 auto& lr = layers[0];
830
831 lr.vote = LayerVoteType::Min;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800832 lr.name = "Min";
Ady Abrahamabc27602020-04-08 17:20:29 -0700833 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700834 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800835
836 lr.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800837 lr.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -0700838 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700839 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800840
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100841 lr.desiredRefreshRate = Fps(90.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800842 lr.vote = LayerVoteType::Heuristic;
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800843 lr.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700844 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700845 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800846
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100847 lr.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800848 lr.name = "60Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700849 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700850 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700851 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700852 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800853
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100854 lr.desiredRefreshRate = Fps(45.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800855 lr.name = "45Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700856 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700857 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700858 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700859 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800860
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100861 lr.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800862 lr.name = "30Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700863 EXPECT_EQ(mExpected30Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700864 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700865 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700866 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800867
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100868 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800869 lr.name = "24Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -0700870 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700871 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700872 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700873 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800874
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100875 lr.desiredRefreshRate = Fps(24.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800876 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
877 lr.name = "24Hz ExplicitExactOrMultiple";
Ady Abrahamabc27602020-04-08 17:20:29 -0700878 EXPECT_EQ(mExpected72Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700879 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abrahamabc27602020-04-08 17:20:29 -0700880 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700881 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800882}
883
Steven Thomasbb374322020-04-28 22:47:16 -0700884TEST_F(RefreshRateConfigsTest, getBestRefreshRate_PriorityTest) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800885 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700886 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
887 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800888
889 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
890 LayerRequirement{.weight = 1.0f}};
891 auto& lr1 = layers[0];
892 auto& lr2 = layers[1];
893
894 lr1.vote = LayerVoteType::Min;
895 lr2.vote = LayerVoteType::Max;
Ady Abrahamabc27602020-04-08 17:20:29 -0700896 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700897 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800898
899 lr1.vote = LayerVoteType::Min;
900 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100901 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700902 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700903 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800904
905 lr1.vote = LayerVoteType::Min;
Ady Abraham71c437d2020-01-31 15:56:57 -0800906 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100907 lr2.desiredRefreshRate = Fps(24.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700908 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700909 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800910
911 lr1.vote = LayerVoteType::Max;
912 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100913 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700914 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700915 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800916
917 lr1.vote = LayerVoteType::Max;
Ady Abraham71c437d2020-01-31 15:56:57 -0800918 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100919 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700920 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700921 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800922
923 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100924 lr1.desiredRefreshRate = Fps(15.0f);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800925 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100926 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700927 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700928 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800929
930 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100931 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800932 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100933 lr2.desiredRefreshRate = Fps(45.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700934 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700935 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800936}
937
Steven Thomasbb374322020-04-28 22:47:16 -0700938TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800939 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700940 std::make_unique<RefreshRateConfigs>(m60_90Device,
941 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800942
943 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
944 auto& lr = layers[0];
945
Ady Abraham71c437d2020-01-31 15:56:57 -0800946 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abraham8a82ba62020-01-17 12:43:17 -0800947 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100948 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800949 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -0700950 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -0700951 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abraham8a82ba62020-01-17 12:43:17 -0800952 }
953}
954
rnlee3bd610662021-06-23 16:27:57 -0700955TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) {
956 RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120};
957 auto refreshRateConfigs =
958 std::make_unique<RefreshRateConfigs>(m60_120Device,
959 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
960
961 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
962 auto& lr = layers[0];
963
964 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
965 for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) {
966 lr.desiredRefreshRate = Fps(fps);
967 const auto& refreshRate =
968 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
969 EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
970 }
971}
972
Steven Thomasbb374322020-04-28 22:47:16 -0700973TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {
Ady Abraham8a82ba62020-01-17 12:43:17 -0800974 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -0700975 std::make_unique<RefreshRateConfigs>(m60_90Device,
976 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham8a82ba62020-01-17 12:43:17 -0800977
978 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
979 LayerRequirement{.weight = 1.0f}};
980 auto& lr1 = layers[0];
981 auto& lr2 = layers[1];
982
983 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100984 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800985 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100986 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700987 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700988 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800989
990 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100991 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -0800992 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100993 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -0700994 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -0700995 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham8a82ba62020-01-17 12:43:17 -0800996
997 lr1.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +0100998 lr1.desiredRefreshRate = Fps(90.0f);
Ady Abraham71c437d2020-01-31 15:56:57 -0800999 lr2.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001000 lr2.desiredRefreshRate = Fps(60.0f);
Ady Abrahamabc27602020-04-08 17:20:29 -07001001 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001002 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham2139f732019-11-13 18:56:40 -08001003}
1004
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001005TEST_F(RefreshRateConfigsTest, testInPolicy) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001006 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(60.000004f), Fps(60.000004f)));
1007 ASSERT_TRUE(mExpectedAlmost60Config.inPolicy(Fps(59.0f), Fps(60.1f)));
1008 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(75.0f), Fps(90.0f)));
1009 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(60.0011f), Fps(90.0f)));
1010 ASSERT_FALSE(mExpectedAlmost60Config.inPolicy(Fps(50.0f), Fps(59.998f)));
Ana Krulec72f0d6e2020-01-06 15:24:47 -08001011}
1012
Steven Thomasbb374322020-04-28 22:47:16 -07001013TEST_F(RefreshRateConfigsTest, getBestRefreshRate_75HzContent) {
Ady Abrahamf6b77072020-01-30 14:22:54 -08001014 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001015 std::make_unique<RefreshRateConfigs>(m60_90Device,
1016 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abrahamf6b77072020-01-30 14:22:54 -08001017
1018 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1019 auto& lr = layers[0];
1020
Ady Abraham71c437d2020-01-31 15:56:57 -08001021 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamf6b77072020-01-30 14:22:54 -08001022 for (float fps = 75.0f; fps < 100.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001023 lr.desiredRefreshRate = Fps(fps);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001024 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001025 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001026 EXPECT_EQ(mExpected90Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName();
Ady Abrahamf6b77072020-01-30 14:22:54 -08001027 }
1028}
1029
Steven Thomasbb374322020-04-28 22:47:16 -07001030TEST_F(RefreshRateConfigsTest, getBestRefreshRate_Multiples) {
Ady Abraham34702102020-02-10 14:12:05 -08001031 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001032 std::make_unique<RefreshRateConfigs>(m60_90Device,
1033 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham34702102020-02-10 14:12:05 -08001034
1035 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1036 LayerRequirement{.weight = 1.0f}};
1037 auto& lr1 = layers[0];
1038 auto& lr2 = layers[1];
1039
1040 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001041 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001042 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001043 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001044 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001045 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001046 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001047 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001048
1049 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001050 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001051 lr1.name = "60Hz ExplicitExactOrMultiple";
1052 lr2.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001053 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001054 lr2.name = "90Hz ExplicitDefault";
Ady Abrahamabc27602020-04-08 17:20:29 -07001055 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001056 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001057
1058 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001059 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001060 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001061 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001062 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001063 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001064 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001065
1066 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001067 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001068 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001069 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001070 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001071 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001072 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001073 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham34702102020-02-10 14:12:05 -08001074
1075 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001076 lr1.desiredRefreshRate = Fps(30.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001077 lr1.name = "30Hz ExplicitExactOrMultiple";
Ady Abraham34702102020-02-10 14:12:05 -08001078 lr2.vote = LayerVoteType::Max;
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001079 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001080 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001081 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001082}
1083
1084TEST_F(RefreshRateConfigsTest, scrollWhileWatching60fps_60_90) {
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001085 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001086 std::make_unique<RefreshRateConfigs>(m60_90Device,
1087 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001088
1089 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1090 LayerRequirement{.weight = 1.0f}};
1091 auto& lr1 = layers[0];
1092 auto& lr2 = layers[1];
1093
1094 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001095 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001096 lr1.name = "60Hz ExplicitExactOrMultiple";
1097 lr2.vote = LayerVoteType::NoVote;
1098 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001099 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001100 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001101
1102 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001103 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001104 lr1.name = "60Hz ExplicitExactOrMultiple";
1105 lr2.vote = LayerVoteType::NoVote;
1106 lr2.name = "NoVote";
Ady Abrahamabc27602020-04-08 17:20:29 -07001107 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001108 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001109
1110 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001111 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001112 lr1.name = "60Hz ExplicitExactOrMultiple";
1113 lr2.vote = LayerVoteType::Max;
1114 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001115 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001116 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001117
1118 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001119 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001120 lr1.name = "60Hz ExplicitExactOrMultiple";
1121 lr2.vote = LayerVoteType::Max;
1122 lr2.name = "Max";
Ady Abrahamabc27602020-04-08 17:20:29 -07001123 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001124 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001125
1126 // The other layer starts to provide buffers
1127 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001128 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001129 lr1.name = "60Hz ExplicitExactOrMultiple";
1130 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001131 lr2.desiredRefreshRate = Fps(90.0f);
Ady Abraham4ccdcb42020-02-11 17:34:34 -08001132 lr2.name = "90Hz Heuristic";
Ady Abrahamabc27602020-04-08 17:20:29 -07001133 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001134 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Ady Abraham6fb599b2020-03-05 13:48:22 -08001135}
1136
1137TEST_F(RefreshRateConfigsTest, touchConsidered) {
Ady Abrahamdfd62162020-06-10 16:11:56 -07001138 RefreshRateConfigs::GlobalSignals consideredSignals;
Ady Abraham6fb599b2020-03-05 13:48:22 -08001139 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001140 std::make_unique<RefreshRateConfigs>(m60_90Device,
1141 /*currentConfigId=*/HWC_CONFIG_ID_60);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001142
Ady Abrahamdfd62162020-06-10 16:11:56 -07001143 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false}, &consideredSignals);
1144 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001145
Ady Abrahamdfd62162020-06-10 16:11:56 -07001146 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = false}, &consideredSignals);
1147 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001148
1149 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1150 LayerRequirement{.weight = 1.0f}};
1151 auto& lr1 = layers[0];
1152 auto& lr2 = layers[1];
1153
1154 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001155 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001156 lr1.name = "60Hz ExplicitExactOrMultiple";
1157 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001158 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001159 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001160 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1161 &consideredSignals);
1162 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001163
1164 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001165 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001166 lr1.name = "60Hz ExplicitExactOrMultiple";
1167 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001168 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001169 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001170 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1171 &consideredSignals);
1172 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001173
1174 lr1.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001175 lr1.desiredRefreshRate = Fps(60.0f);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001176 lr1.name = "60Hz ExplicitExactOrMultiple";
1177 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001178 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001179 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001180 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1181 &consideredSignals);
1182 EXPECT_EQ(true, consideredSignals.touch);
Ady Abraham6fb599b2020-03-05 13:48:22 -08001183
1184 lr1.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001185 lr1.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001186 lr1.name = "60Hz ExplicitExactOrMultiple";
Ady Abraham6fb599b2020-03-05 13:48:22 -08001187 lr2.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001188 lr2.desiredRefreshRate = Fps(60.0f);
Steven Thomasf734df42020-04-13 21:09:28 -07001189 lr2.name = "60Hz Heuristic";
Ady Abrahamdfd62162020-06-10 16:11:56 -07001190 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false},
1191 &consideredSignals);
1192 EXPECT_EQ(false, consideredSignals.touch);
Ady Abraham34702102020-02-10 14:12:05 -08001193}
1194
Steven Thomasbb374322020-04-28 22:47:16 -07001195TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitDefault) {
Ady Abrahamabc27602020-04-08 17:20:29 -07001196 auto refreshRateConfigs =
1197 std::make_unique<RefreshRateConfigs>(m60_90_72_120Device, /*currentConfigId=*/
1198 HWC_CONFIG_ID_60);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001199
1200 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1201 auto& lr = layers[0];
1202
1203 // Prepare a table with the vote and the expected refresh rate
1204 const std::vector<std::pair<float, float>> testCases = {
1205 {130, 120}, {120, 120}, {119, 120}, {110, 120},
1206
1207 {100, 90}, {90, 90}, {89, 90},
1208
1209 {80, 72}, {73, 72}, {72, 72}, {71, 72}, {70, 72},
1210
1211 {65, 60}, {60, 60}, {59, 60}, {58, 60},
1212
1213 {55, 90}, {50, 90}, {45, 90},
1214
1215 {42, 120}, {40, 120}, {39, 120},
1216
1217 {37, 72}, {36, 72}, {35, 72},
1218
1219 {30, 60},
1220 };
1221
1222 for (const auto& test : testCases) {
1223 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001224 lr.desiredRefreshRate = Fps(test.first);
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001225
1226 std::stringstream ss;
1227 ss << "ExplicitDefault " << test.first << " fps";
1228 lr.name = ss.str();
1229
1230 const auto& refreshRate =
Ady Abrahamdfd62162020-06-10 16:11:56 -07001231 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001232 EXPECT_TRUE(refreshRate.getFps().equalsWithMargin(Fps(test.second)))
Ady Abraham5b8afb5a2020-03-06 14:57:26 -08001233 << "Expecting " << test.first << "fps => " << test.second << "Hz";
1234 }
Alec Mouri0a1cc962019-03-14 12:33:02 -07001235}
1236
Alec Mouri11232a22020-05-14 18:06:25 -07001237TEST_F(RefreshRateConfigsTest,
1238 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresTouchFlag) {
1239 auto refreshRateConfigs =
1240 std::make_unique<RefreshRateConfigs>(m60_90Device,
1241 /*currentConfigId=*/HWC_CONFIG_ID_90);
1242
1243 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001244 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001245 0);
1246
1247 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1248 auto& lr = layers[0];
1249
Ady Abrahamdfd62162020-06-10 16:11:56 -07001250 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001251 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001252 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001253 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001254 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001255 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001256 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = true},
1257 &consideredSignals));
1258 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001259}
1260
1261TEST_F(RefreshRateConfigsTest,
1262 getBestRefreshRate_withDisplayManagerRequestingSingleRate_ignoresIdleFlag) {
1263 auto refreshRateConfigs =
1264 std::make_unique<RefreshRateConfigs>(m60_90Device,
1265 /*currentConfigId=*/HWC_CONFIG_ID_60);
1266
1267 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001268 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001269 0);
1270
1271 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1272 auto& lr = layers[0];
1273
Alec Mouri11232a22020-05-14 18:06:25 -07001274 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001275 lr.desiredRefreshRate = Fps(90.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001276 lr.name = "90Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001277 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001278 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001279 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = true}));
Alec Mouri11232a22020-05-14 18:06:25 -07001280}
1281
1282TEST_F(RefreshRateConfigsTest,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001283 getBestRefreshRate_withDisplayManagerRequestingSingleRate_onlySwitchesRatesForExplicitFocusedLayers) {
Alec Mouri11232a22020-05-14 18:06:25 -07001284 auto refreshRateConfigs =
1285 std::make_unique<RefreshRateConfigs>(m60_90Device,
1286 /*currentConfigId=*/HWC_CONFIG_ID_90);
1287
1288 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001289 {HWC_CONFIG_ID_90, {Fps(90.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Alec Mouri11232a22020-05-14 18:06:25 -07001290 0);
1291
Ady Abrahamdfd62162020-06-10 16:11:56 -07001292 RefreshRateConfigs::GlobalSignals consideredSignals;
Alec Mouri11232a22020-05-14 18:06:25 -07001293 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001294 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false},
1295 &consideredSignals));
1296 EXPECT_EQ(false, consideredSignals.touch);
Alec Mouri11232a22020-05-14 18:06:25 -07001297
1298 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1299 auto& lr = layers[0];
1300
1301 lr.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001302 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001303 lr.name = "60Hz ExplicitExactOrMultiple";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001304 lr.focused = false;
1305 EXPECT_EQ(mExpected90Config,
1306 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1307
1308 lr.focused = true;
Ady Abraham20c029c2020-07-06 12:58:05 -07001309 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001310 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001311
1312 lr.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001313 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001314 lr.name = "60Hz ExplicitDefault";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001315 lr.focused = false;
1316 EXPECT_EQ(mExpected90Config,
1317 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1318
1319 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001320 EXPECT_EQ(mExpected60Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001321 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001322
1323 lr.vote = LayerVoteType::Heuristic;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001324 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001325 lr.name = "60Hz Heuristic";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001326 lr.focused = false;
1327 EXPECT_EQ(mExpected90Config,
1328 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1329
1330 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001331 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001332 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001333
1334 lr.vote = LayerVoteType::Max;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001335 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001336 lr.name = "60Hz Max";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001337 lr.focused = false;
1338 EXPECT_EQ(mExpected90Config,
1339 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1340
1341 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001342 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001343 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001344
1345 lr.vote = LayerVoteType::Min;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001346 lr.desiredRefreshRate = Fps(60.0f);
Alec Mouri11232a22020-05-14 18:06:25 -07001347 lr.name = "60Hz Min";
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001348 lr.focused = false;
1349 EXPECT_EQ(mExpected90Config,
1350 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1351
1352 lr.focused = true;
Alec Mouri11232a22020-05-14 18:06:25 -07001353 EXPECT_EQ(mExpected90Config,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001354 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
Alec Mouri11232a22020-05-14 18:06:25 -07001355}
1356
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001357TEST_F(RefreshRateConfigsTest, groupSwitchingNotAllowed) {
Steven Thomasd4071902020-03-24 16:02:53 -07001358 auto refreshRateConfigs =
Ady Abrahamabc27602020-04-08 17:20:29 -07001359 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1360 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001361
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001362 // The default policy doesn't allow group switching. Verify that no
1363 // group switches are performed.
Steven Thomasd4071902020-03-24 16:02:53 -07001364 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1365 auto& layer = layers[0];
1366 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001367 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001368 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Steven Thomasd4071902020-03-24 16:02:53 -07001369 layer.name = "90Hz ExplicitDefault";
Marin Shalamanov46084422020-10-13 12:33:42 +02001370 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001371
Steven Thomasd4071902020-03-24 16:02:53 -07001372 ASSERT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001373 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001374 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001375}
Steven Thomasd4071902020-03-24 16:02:53 -07001376
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001377TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayer) {
1378 auto refreshRateConfigs =
1379 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1380 /*currentConfigId=*/HWC_CONFIG_ID_60);
Steven Thomasd4071902020-03-24 16:02:53 -07001381 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001382 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Steven Thomasd4071902020-03-24 16:02:53 -07001383 policy.allowGroupSwitching = true;
1384 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001385
1386 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1387 auto& layer = layers[0];
1388 layer.vote = LayerVoteType::ExplicitDefault;
1389 layer.desiredRefreshRate = Fps(90.0f);
1390 layer.seamlessness = Seamlessness::SeamedAndSeamless;
1391 layer.name = "90Hz ExplicitDefault";
1392 layer.focused = true;
Steven Thomasd4071902020-03-24 16:02:53 -07001393 ASSERT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001394 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001395 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001396}
1397
1398TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamless) {
1399 auto refreshRateConfigs =
1400 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1401 /*currentConfigId=*/HWC_CONFIG_ID_60);
1402 RefreshRateConfigs::Policy policy;
1403 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1404 policy.allowGroupSwitching = true;
1405 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
Marin Shalamanov46084422020-10-13 12:33:42 +02001406
1407 // Verify that we won't change the group if seamless switch is required.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001408 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1409 auto& layer = layers[0];
1410 layer.vote = LayerVoteType::ExplicitDefault;
1411 layer.desiredRefreshRate = Fps(90.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001412 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001413 layer.name = "90Hz ExplicitDefault";
1414 layer.focused = true;
Marin Shalamanov46084422020-10-13 12:33:42 +02001415 ASSERT_EQ(HWC_CONFIG_ID_60,
1416 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001417 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001418}
1419
1420TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerOnlySeamlessDefaultFps) {
1421 auto refreshRateConfigs =
1422 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1423 /*currentConfigId=*/HWC_CONFIG_ID_60);
1424 RefreshRateConfigs::Policy policy;
1425 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1426 policy.allowGroupSwitching = true;
1427 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1428
1429 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001430
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001431 // 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 +01001432 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1433 auto& layer = layers[0];
1434 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001435 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001436 layer.seamlessness = Seamlessness::OnlySeamless;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001437 layer.name = "60Hz ExplicitDefault";
1438 layer.focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001439 ASSERT_EQ(HWC_CONFIG_ID_90,
1440 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001441 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001442}
1443
1444TEST_F(RefreshRateConfigsTest, groupSwitchingWithOneLayerDefaultSeamlessness) {
1445 auto refreshRateConfigs =
1446 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1447 /*currentConfigId=*/HWC_CONFIG_ID_60);
1448 RefreshRateConfigs::Policy policy;
1449 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1450 policy.allowGroupSwitching = true;
1451 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1452
1453 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001454
1455 // Verify that if the current config is in another group and there are no layers with
1456 // seamlessness=SeamedAndSeamless we'll go back to the default group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001457
1458 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1459 auto& layer = layers[0];
1460 layer.vote = LayerVoteType::ExplicitDefault;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001461 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001462 layer.seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001463 layer.name = "60Hz ExplicitDefault";
1464 layer.focused = true;
1465
Marin Shalamanov46084422020-10-13 12:33:42 +02001466 ASSERT_EQ(HWC_CONFIG_ID_60,
1467 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001468 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001469}
1470
1471TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersOnlySeamlessAndSeamed) {
1472 auto refreshRateConfigs =
1473 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1474 /*currentConfigId=*/HWC_CONFIG_ID_60);
1475 RefreshRateConfigs::Policy policy;
1476 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1477 policy.allowGroupSwitching = true;
1478 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1479
1480 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov46084422020-10-13 12:33:42 +02001481
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001482 // If there's a layer with seamlessness=SeamedAndSeamless, another layer with
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001483 // seamlessness=OnlySeamless can't change the mode group.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001484 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1485 layers[0].vote = LayerVoteType::ExplicitDefault;
1486 layers[0].desiredRefreshRate = Fps(60.0f);
1487 layers[0].seamlessness = Seamlessness::OnlySeamless;
1488 layers[0].name = "60Hz ExplicitDefault";
1489 layers[0].focused = true;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001490
1491 layers.push_back(LayerRequirement{.weight = 0.5f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001492 layers[1].vote = LayerVoteType::ExplicitDefault;
1493 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1494 layers[1].desiredRefreshRate = Fps(90.0f);
1495 layers[1].name = "90Hz ExplicitDefault";
1496 layers[1].focused = false;
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001497
1498 ASSERT_EQ(HWC_CONFIG_ID_90,
1499 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001500 .getModeId());
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001501}
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001502
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001503TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultFocusedAndSeamed) {
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001504 auto refreshRateConfigs =
1505 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1506 /*currentConfigId=*/HWC_CONFIG_ID_60);
1507 RefreshRateConfigs::Policy policy;
1508 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1509 policy.allowGroupSwitching = true;
1510 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1511
1512 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001513
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001514 // If there's a focused layer with seamlessness=SeamedAndSeamless, another layer with
1515 // seamlessness=Default can't change the mode group back to the group of the default
1516 // mode.
1517 // For example, this may happen when a video playback requests and gets a seamed switch,
1518 // but another layer (with default seamlessness) starts animating. The animating layer
1519 // should not cause a seamed switch.
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001520 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001521 layers[0].seamlessness = Seamlessness::Default;
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001522 layers[0].desiredRefreshRate = Fps(60.0f);
1523 layers[0].focused = true;
1524 layers[0].vote = LayerVoteType::ExplicitDefault;
1525 layers[0].name = "60Hz ExplicitDefault";
1526
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001527 layers.push_back(LayerRequirement{.weight = 0.1f});
1528 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1529 layers[1].desiredRefreshRate = Fps(90.0f);
1530 layers[1].focused = true;
1531 layers[1].vote = LayerVoteType::ExplicitDefault;
1532 layers[1].name = "90Hz ExplicitDefault";
1533
Marin Shalamanov46084422020-10-13 12:33:42 +02001534 ASSERT_EQ(HWC_CONFIG_ID_90,
1535 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001536 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001537}
1538
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001539TEST_F(RefreshRateConfigsTest, groupSwitchingWithTwoLayersDefaultNotFocusedAndSeamed) {
1540 auto refreshRateConfigs =
1541 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1542 /*currentConfigId=*/HWC_CONFIG_ID_60);
1543 RefreshRateConfigs::Policy policy;
1544 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1545 policy.allowGroupSwitching = true;
1546 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1547
1548 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
1549
1550 // Layer with seamlessness=Default can change the mode group if there's a not
1551 // focused layer with seamlessness=SeamedAndSeamless. This happens for example,
1552 // when in split screen mode the user switches between the two visible applications.
1553 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1554 layers[0].seamlessness = Seamlessness::Default;
1555 layers[0].desiredRefreshRate = Fps(60.0f);
1556 layers[0].focused = true;
1557 layers[0].vote = LayerVoteType::ExplicitDefault;
1558 layers[0].name = "60Hz ExplicitDefault";
1559
1560 layers.push_back(LayerRequirement{.weight = 0.7f});
Marin Shalamanovbb65d052021-03-23 19:21:52 +01001561 layers[1].seamlessness = Seamlessness::SeamedAndSeamless;
1562 layers[1].desiredRefreshRate = Fps(90.0f);
1563 layers[1].focused = false;
1564 layers[1].vote = LayerVoteType::ExplicitDefault;
1565 layers[1].name = "90Hz ExplicitDefault";
1566
Marin Shalamanovae0b5352021-03-24 12:56:08 +01001567 ASSERT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanov46084422020-10-13 12:33:42 +02001568 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1569 .getModeId());
1570}
1571
1572TEST_F(RefreshRateConfigsTest, nonSeamlessVotePrefersSeamlessSwitches) {
1573 auto refreshRateConfigs =
1574 std::make_unique<RefreshRateConfigs>(m30_60Device,
1575 /*currentConfigId=*/HWC_CONFIG_ID_60);
1576
1577 // Allow group switching.
1578 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001579 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001580 policy.allowGroupSwitching = true;
1581 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1582
1583 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1584 auto& layer = layers[0];
1585 layer.vote = LayerVoteType::ExplicitExactOrMultiple;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001586 layer.desiredRefreshRate = Fps(60.0f);
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001587 layer.seamlessness = Seamlessness::SeamedAndSeamless;
Marin Shalamanov46084422020-10-13 12:33:42 +02001588 layer.name = "60Hz ExplicitExactOrMultiple";
1589 layer.focused = true;
1590
1591 ASSERT_EQ(HWC_CONFIG_ID_60,
1592 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001593 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001594
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001595 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Marin Shalamanov46084422020-10-13 12:33:42 +02001596 ASSERT_EQ(HWC_CONFIG_ID_120,
1597 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001598 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001599}
1600
1601TEST_F(RefreshRateConfigsTest, nonSeamlessExactAndSeamlessMultipleLayers) {
1602 auto refreshRateConfigs =
1603 std::make_unique<RefreshRateConfigs>(m25_30_50_60Device,
1604 /*currentConfigId=*/HWC_CONFIG_ID_60);
1605
1606 // Allow group switching.
1607 RefreshRateConfigs::Policy policy;
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001608 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
Marin Shalamanov46084422020-10-13 12:33:42 +02001609 policy.allowGroupSwitching = true;
1610 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1611
1612 auto layers = std::vector<
1613 LayerRequirement>{LayerRequirement{.name = "60Hz ExplicitDefault",
1614 .vote = LayerVoteType::ExplicitDefault,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001615 .desiredRefreshRate = Fps(60.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001616 .seamlessness = Seamlessness::SeamedAndSeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001617 .weight = 0.5f,
1618 .focused = false},
1619 LayerRequirement{.name = "25Hz ExplicitExactOrMultiple",
1620 .vote = LayerVoteType::ExplicitExactOrMultiple,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001621 .desiredRefreshRate = Fps(25.0f),
Marin Shalamanov53fc11d2020-11-20 14:00:13 +01001622 .seamlessness = Seamlessness::OnlySeamless,
Marin Shalamanov46084422020-10-13 12:33:42 +02001623 .weight = 1.0f,
1624 .focused = true}};
Marin Shalamanov46084422020-10-13 12:33:42 +02001625
1626 ASSERT_EQ(HWC_CONFIG_ID_50,
1627 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001628 .getModeId());
Marin Shalamanov46084422020-10-13 12:33:42 +02001629
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001630 auto& seamedLayer = layers[0];
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001631 seamedLayer.name = "30Hz ExplicitDefault", seamedLayer.desiredRefreshRate = Fps(30.0f);
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001632 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_30);
Marin Shalamanov46084422020-10-13 12:33:42 +02001633
1634 ASSERT_EQ(HWC_CONFIG_ID_25,
1635 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001636 .getModeId());
Steven Thomasd4071902020-03-24 16:02:53 -07001637}
1638
Marin Shalamanove7aadcc2021-04-09 18:58:38 +02001639TEST_F(RefreshRateConfigsTest, minLayersDontTrigerSeamedSwitch) {
1640 auto refreshRateConfigs =
1641 std::make_unique<RefreshRateConfigs>(m60_90DeviceWithDifferentGroups,
1642 /*currentConfigId=*/HWC_CONFIG_ID_90);
1643
1644 // Allow group switching.
1645 RefreshRateConfigs::Policy policy;
1646 policy.defaultMode = refreshRateConfigs->getCurrentPolicy().defaultMode;
1647 policy.allowGroupSwitching = true;
1648 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(policy), 0);
1649
1650 auto layers = std::vector<LayerRequirement>{LayerRequirement{.name = "Min",
1651 .vote = LayerVoteType::Min,
1652 .weight = 1.f,
1653 .focused = true}};
1654
1655 ASSERT_EQ(HWC_CONFIG_ID_90,
1656 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})
1657 .getModeId());
1658}
1659
Steven Thomasf734df42020-04-13 21:09:28 -07001660TEST_F(RefreshRateConfigsTest, primaryVsAppRequestPolicy) {
1661 auto refreshRateConfigs =
Alec Mouri11232a22020-05-14 18:06:25 -07001662 std::make_unique<RefreshRateConfigs>(m30_60_90Device,
Steven Thomasf734df42020-04-13 21:09:28 -07001663 /*currentConfigId=*/HWC_CONFIG_ID_60);
1664
1665 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1666 layers[0].name = "Test layer";
1667
Steven Thomasbb374322020-04-28 22:47:16 -07001668 // Return the config ID from calling getBestRefreshRate() for a single layer with the
Steven Thomasf734df42020-04-13 21:09:28 -07001669 // given voteType and fps.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001670 auto getFrameRate = [&](LayerVoteType voteType, Fps fps, bool touchActive = false,
Marin Shalamanov23c44202020-12-22 19:09:20 +01001671 bool focused = true) -> DisplayModeId {
Steven Thomasf734df42020-04-13 21:09:28 -07001672 layers[0].vote = voteType;
1673 layers[0].desiredRefreshRate = fps;
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001674 layers[0].focused = focused;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001675 return refreshRateConfigs->getBestRefreshRate(layers, {.touch = touchActive, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001676 .getModeId();
Steven Thomasf734df42020-04-13 21:09:28 -07001677 };
1678
1679 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001680 {HWC_CONFIG_ID_60, {Fps(30.f), Fps(60.f)}, {Fps(30.f), Fps(90.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001681 0);
Steven Thomasf734df42020-04-13 21:09:28 -07001682 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001683 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = false})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001684 .getModeId());
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001685 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1686 EXPECT_EQ(HWC_CONFIG_ID_30, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1687 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1688 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1689 EXPECT_EQ(HWC_CONFIG_ID_90, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1690 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001691
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001692 // Layers not focused are not allowed to override primary config
1693 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001694 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001695 /*focused=*/false));
1696 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001697 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/false,
Ady Abrahamaae5ed52020-06-26 09:32:43 -07001698 /*focused=*/false));
1699
Steven Thomasf734df42020-04-13 21:09:28 -07001700 // Touch boost should be restricted to the primary range.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001701 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001702 // When we're higher than the primary range max due to a layer frame rate setting, touch boost
1703 // shouldn't drag us back down to the primary range max.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001704 EXPECT_EQ(HWC_CONFIG_ID_90,
1705 getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f), /*touch=*/true));
Ady Abraham20c029c2020-07-06 12:58:05 -07001706 EXPECT_EQ(HWC_CONFIG_ID_60,
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001707 getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f), /*touch=*/true));
Steven Thomasf734df42020-04-13 21:09:28 -07001708
1709 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001710 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(60.f)}, {Fps(60.f), Fps(60.f)}}),
Steven Thomasf734df42020-04-13 21:09:28 -07001711 0);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001712 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::NoVote, Fps(90.f)));
1713 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Min, Fps(90.f)));
1714 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Max, Fps(90.f)));
1715 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::Heuristic, Fps(90.f)));
1716 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitDefault, Fps(90.f)));
1717 EXPECT_EQ(HWC_CONFIG_ID_60, getFrameRate(LayerVoteType::ExplicitExactOrMultiple, Fps(90.f)));
Steven Thomasf734df42020-04-13 21:09:28 -07001718}
1719
Steven Thomasbb374322020-04-28 22:47:16 -07001720TEST_F(RefreshRateConfigsTest, idle) {
1721 auto refreshRateConfigs =
1722 std::make_unique<RefreshRateConfigs>(m60_90Device,
1723 /*currentConfigId=*/HWC_CONFIG_ID_60);
1724
1725 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1726 layers[0].name = "Test layer";
1727
Marin Shalamanov23c44202020-12-22 19:09:20 +01001728 const auto getIdleFrameRate = [&](LayerVoteType voteType, bool touchActive) -> DisplayModeId {
Steven Thomasbb374322020-04-28 22:47:16 -07001729 layers[0].vote = voteType;
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001730 layers[0].desiredRefreshRate = Fps(90.f);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001731 RefreshRateConfigs::GlobalSignals consideredSignals;
1732 const auto configId =
1733 refreshRateConfigs
1734 ->getBestRefreshRate(layers, {.touch = touchActive, .idle = true},
1735 &consideredSignals)
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001736 .getModeId();
Ady Abrahamdfd62162020-06-10 16:11:56 -07001737 // Refresh rate will be chosen by either touch state or idle state
1738 EXPECT_EQ(!touchActive, consideredSignals.idle);
1739 return configId;
Steven Thomasbb374322020-04-28 22:47:16 -07001740 };
1741
1742 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001743 {HWC_CONFIG_ID_60, {Fps(60.f), Fps(90.f)}, {Fps(60.f), Fps(90.f)}}),
Steven Thomasbb374322020-04-28 22:47:16 -07001744 0);
1745
1746 // Idle should be lower priority than touch boost.
Ady Abrahamdfd62162020-06-10 16:11:56 -07001747 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/true));
1748 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/true));
1749 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/true));
1750 EXPECT_EQ(HWC_CONFIG_ID_90, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/true));
1751 EXPECT_EQ(HWC_CONFIG_ID_90,
1752 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/true));
1753 EXPECT_EQ(HWC_CONFIG_ID_90,
1754 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/true));
Steven Thomasbb374322020-04-28 22:47:16 -07001755
1756 // With no layers, idle should still be lower priority than touch boost.
Steven Thomasbb374322020-04-28 22:47:16 -07001757 EXPECT_EQ(HWC_CONFIG_ID_90,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001758 refreshRateConfigs->getBestRefreshRate({}, {.touch = true, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001759 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001760
1761 // Idle should be higher precedence than other layer frame rate considerations.
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001762 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abrahamdfd62162020-06-10 16:11:56 -07001763 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::NoVote, /*touchActive=*/false));
1764 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Min, /*touchActive=*/false));
1765 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Max, /*touchActive=*/false));
1766 EXPECT_EQ(HWC_CONFIG_ID_60, getIdleFrameRate(LayerVoteType::Heuristic, /*touchActive=*/false));
1767 EXPECT_EQ(HWC_CONFIG_ID_60,
1768 getIdleFrameRate(LayerVoteType::ExplicitDefault, /*touchActive=*/false));
1769 EXPECT_EQ(HWC_CONFIG_ID_60,
1770 getIdleFrameRate(LayerVoteType::ExplicitExactOrMultiple, /*touchActive=*/false));
Steven Thomasbb374322020-04-28 22:47:16 -07001771
1772 // Idle should be applied rather than the current config when there are no layers.
1773 EXPECT_EQ(HWC_CONFIG_ID_60,
Ady Abrahamdfd62162020-06-10 16:11:56 -07001774 refreshRateConfigs->getBestRefreshRate({}, {.touch = false, .idle = true})
Marin Shalamanova7fe3042021-01-29 21:02:08 +01001775 .getModeId());
Steven Thomasbb374322020-04-28 22:47:16 -07001776}
1777
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001778TEST_F(RefreshRateConfigsTest, findClosestKnownFrameRate) {
1779 auto refreshRateConfigs =
1780 std::make_unique<RefreshRateConfigs>(m60_90Device,
1781 /*currentConfigId=*/HWC_CONFIG_ID_60);
1782
1783 for (float fps = 1.0f; fps <= 120.0f; fps += 0.1f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001784 const auto knownFrameRate = findClosestKnownFrameRate(*refreshRateConfigs, Fps(fps));
1785 Fps expectedFrameRate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001786 if (fps < 26.91f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001787 expectedFrameRate = Fps(24.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001788 } else if (fps < 37.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001789 expectedFrameRate = Fps(30.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001790 } else if (fps < 52.51f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001791 expectedFrameRate = Fps(45.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001792 } else if (fps < 66.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001793 expectedFrameRate = Fps(60.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001794 } else if (fps < 81.01f) {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001795 expectedFrameRate = Fps(72.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001796 } else {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001797 expectedFrameRate = Fps(90.0f);
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001798 }
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001799 EXPECT_TRUE(expectedFrameRate.equalsWithMargin(knownFrameRate))
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001800 << "findClosestKnownFrameRate(" << fps << ") = " << knownFrameRate;
1801 }
1802}
1803
1804TEST_F(RefreshRateConfigsTest, getBestRefreshRate_KnownFrameRate) {
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001805 auto refreshRateConfigs =
1806 std::make_unique<RefreshRateConfigs>(m60_90Device,
1807 /*currentConfigId=*/HWC_CONFIG_ID_60);
1808
1809 struct ExpectedRate {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001810 Fps rate;
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001811 const RefreshRate& expected;
1812 };
1813
1814 /* clang-format off */
1815 std::vector<ExpectedRate> knownFrameRatesExpectations = {
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001816 {Fps(24.0f), mExpected60Config},
1817 {Fps(30.0f), mExpected60Config},
1818 {Fps(45.0f), mExpected90Config},
1819 {Fps(60.0f), mExpected60Config},
1820 {Fps(72.0f), mExpected90Config},
1821 {Fps(90.0f), mExpected90Config},
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001822 };
1823 /* clang-format on */
1824
1825 // Make sure the test tests all the known frame rate
1826 const auto knownFrameRateList = getKnownFrameRate(*refreshRateConfigs);
Marin Shalamanove8a663d2020-11-24 17:48:00 +01001827 const auto equal =
1828 std::equal(knownFrameRateList.begin(), knownFrameRateList.end(),
1829 knownFrameRatesExpectations.begin(),
1830 [](Fps a, const ExpectedRate& b) { return a.equalsWithMargin(b.rate); });
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001831 EXPECT_TRUE(equal);
1832
1833 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
1834 auto& layer = layers[0];
1835 layer.vote = LayerVoteType::Heuristic;
1836 for (const auto& expectedRate : knownFrameRatesExpectations) {
1837 layer.desiredRefreshRate = expectedRate.rate;
Ady Abrahamdfd62162020-06-10 16:11:56 -07001838 const auto& refreshRate =
1839 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false});
Ady Abrahamb1b9d412020-06-01 19:53:52 -07001840 EXPECT_EQ(expectedRate.expected, refreshRate);
1841 }
1842}
1843
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001844TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {
1845 auto refreshRateConfigs =
1846 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1847 /*currentConfigId=*/HWC_CONFIG_ID_60);
1848
1849 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1850 LayerRequirement{.weight = 0.5f}};
1851 auto& explicitExactLayer = layers[0];
1852 auto& explicitExactOrMultipleLayer = layers[1];
1853
1854 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1855 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1856 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1857
1858 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1859 explicitExactLayer.name = "ExplicitExact";
1860 explicitExactLayer.desiredRefreshRate = Fps(30);
1861
1862 EXPECT_EQ(mExpected30Config,
1863 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1864 EXPECT_EQ(mExpected30Config,
1865 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1866
1867 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1868 explicitExactLayer.desiredRefreshRate = Fps(60);
1869 EXPECT_EQ(mExpected60Config,
1870 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1871
1872 explicitExactLayer.desiredRefreshRate = Fps(72);
1873 EXPECT_EQ(mExpected72Config,
1874 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1875
1876 explicitExactLayer.desiredRefreshRate = Fps(90);
1877 EXPECT_EQ(mExpected90Config,
1878 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1879
1880 explicitExactLayer.desiredRefreshRate = Fps(120);
1881 EXPECT_EQ(mExpected120Config,
1882 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1883}
1884
1885TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) {
rnlee3bd610662021-06-23 16:27:57 -07001886 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001887 auto refreshRateConfigs =
1888 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
rnlee3bd610662021-06-23 16:27:57 -07001889 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08001890
1891 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1892 LayerRequirement{.weight = 0.5f}};
1893 auto& explicitExactLayer = layers[0];
1894 auto& explicitExactOrMultipleLayer = layers[1];
1895
1896 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
1897 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
1898 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
1899
1900 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
1901 explicitExactLayer.name = "ExplicitExact";
1902 explicitExactLayer.desiredRefreshRate = Fps(30);
1903
1904 EXPECT_EQ(mExpected60Config,
1905 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1906 EXPECT_EQ(mExpected120Config,
1907 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
1908
1909 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(120);
1910 explicitExactLayer.desiredRefreshRate = Fps(60);
1911 EXPECT_EQ(mExpected120Config,
1912 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1913
1914 explicitExactLayer.desiredRefreshRate = Fps(72);
1915 EXPECT_EQ(mExpected72Config,
1916 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1917
1918 explicitExactLayer.desiredRefreshRate = Fps(90);
1919 EXPECT_EQ(mExpected90Config,
1920 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1921
1922 explicitExactLayer.desiredRefreshRate = Fps(120);
1923 EXPECT_EQ(mExpected120Config,
1924 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
1925}
1926
Marin Shalamanov4c7831e2021-06-08 20:44:06 +02001927TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ReadsCached) {
1928 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1929
1930 auto refreshRateConfigs =
1931 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1932 /*currentConfigId=*/HWC_CONFIG_ID_60);
1933
1934 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1935 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1936 LayerRequirement>(),
1937 .globalSignals = {.touch = true,
1938 .idle = true},
1939 .outSignalsConsidered =
1940 {.touch = true,
1941 .idle = false},
1942 .resultingBestRefreshRate =
1943 createRefreshRate(
1944 mConfig90)});
1945
1946 EXPECT_EQ(createRefreshRate(mConfig90),
1947 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1948 {.touch = true, .idle = true}));
1949
1950 const GlobalSignals cachedSignalsConsidered{.touch = true, .idle = false};
1951 setLastBestRefreshRateInvocation(*refreshRateConfigs,
1952 GetBestRefreshRateInvocation{.layerRequirements = std::vector<
1953 LayerRequirement>(),
1954 .globalSignals = {.touch = true,
1955 .idle = true},
1956 .outSignalsConsidered =
1957 cachedSignalsConsidered,
1958 .resultingBestRefreshRate =
1959 createRefreshRate(
1960 mConfig30)});
1961
1962 GlobalSignals signalsConsidered;
1963 EXPECT_EQ(createRefreshRate(mConfig30),
1964 refreshRateConfigs->getBestRefreshRate(std::vector<LayerRequirement>(),
1965 {.touch = true, .idle = true},
1966 &signalsConsidered));
1967
1968 EXPECT_EQ(cachedSignalsConsidered, signalsConsidered);
1969}
1970
1971TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {
1972 using GlobalSignals = RefreshRateConfigs::GlobalSignals;
1973
1974 auto refreshRateConfigs =
1975 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
1976 /*currentConfigId=*/HWC_CONFIG_ID_60);
1977 ASSERT_FALSE(getLastBestRefreshRateInvocation(*refreshRateConfigs).has_value());
1978
1979 GlobalSignals globalSignals{.touch = true, .idle = true};
1980 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
1981 LayerRequirement{.weight = 0.5f}};
1982 const auto lastResult =
1983 refreshRateConfigs->getBestRefreshRate(layers, globalSignals,
1984 /* outSignalsConsidered */ nullptr);
1985
1986 const auto lastInvocation = getLastBestRefreshRateInvocation(*refreshRateConfigs);
1987
1988 ASSERT_TRUE(lastInvocation.has_value());
1989 ASSERT_EQ(layers, lastInvocation->layerRequirements);
1990 ASSERT_EQ(globalSignals, lastInvocation->globalSignals);
1991 ASSERT_EQ(lastResult, lastInvocation->resultingBestRefreshRate);
1992
1993 // outSignalsConsidered needs to be populated even tho earlier we gave nullptr
1994 // to getBestRefreshRate()
1995 GlobalSignals detaultSignals;
1996 ASSERT_FALSE(detaultSignals == lastInvocation->outSignalsConsidered);
1997}
1998
Ady Abraham5e4e9832021-06-14 13:40:56 -07001999TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) {
rnlee3bd610662021-06-23 16:27:57 -07002000 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham5e4e9832021-06-14 13:40:56 -07002001 auto refreshRateConfigs =
2002 std::make_unique<RefreshRateConfigs>(m60_120Device,
rnlee3bd610662021-06-23 16:27:57 -07002003 /*currentConfigId=*/HWC_CONFIG_ID_60, config);
Ady Abraham5e4e9832021-06-14 13:40:56 -07002004
2005 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},
2006 LayerRequirement{.weight = 0.5f}};
2007 auto& explicitExactLayer = layers[0];
2008 auto& explicitExactOrMultipleLayer = layers[1];
2009
2010 explicitExactOrMultipleLayer.vote = LayerVoteType::ExplicitExactOrMultiple;
2011 explicitExactOrMultipleLayer.name = "ExplicitExactOrMultiple";
2012 explicitExactOrMultipleLayer.desiredRefreshRate = Fps(60);
2013
2014 explicitExactLayer.vote = LayerVoteType::ExplicitExact;
2015 explicitExactLayer.name = "ExplicitExact";
2016 explicitExactLayer.desiredRefreshRate = Fps(30);
2017
2018 EXPECT_EQ(mExpected60Config,
2019 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2020 EXPECT_EQ(mExpected120Config,
2021 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2022
2023 explicitExactOrMultipleLayer.vote = LayerVoteType::NoVote;
2024
2025 EXPECT_EQ(mExpected60Config,
2026 refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));
2027 EXPECT_EQ(mExpected60Config,
2028 refreshRateConfigs->getBestRefreshRate(layers, {.touch = true, .idle = false}));
2029}
2030
Ana Krulecb9afd792020-06-11 13:16:15 -07002031TEST_F(RefreshRateConfigsTest, testComparisonOperator) {
2032 EXPECT_TRUE(mExpected60Config < mExpected90Config);
2033 EXPECT_FALSE(mExpected60Config < mExpected60Config);
2034 EXPECT_FALSE(mExpected90Config < mExpected90Config);
2035}
2036
2037TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {
2038 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2039
2040 auto refreshRateConfigs =
2041 std::make_unique<RefreshRateConfigs>(m60_90Device,
2042 /*currentConfigId=*/HWC_CONFIG_ID_90);
2043 // SetPolicy(60, 90), current 90Hz => TurnOn.
2044 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2045
2046 // SetPolicy(60, 90), current 60Hz => TurnOn.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002047 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(90)}}),
2048 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002049 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2050
Ady Abrahama91605e2021-06-18 11:41:47 -07002051 // SetPolicy(60, 60), current 60Hz => TurnOff
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002052 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2053 0);
Ady Abrahama91605e2021-06-18 11:41:47 -07002054 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
Ana Krulecb9afd792020-06-11 13:16:15 -07002055
2056 // SetPolicy(90, 90), current 90Hz => TurnOff.
Marin Shalamanove8a663d2020-11-24 17:48:00 +01002057 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_90, {Fps(90), Fps(90)}}),
2058 0);
Ana Krulecb9afd792020-06-11 13:16:15 -07002059 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2060}
2061
TreeHugger Robot758ab612021-06-22 19:17:29 +00002062TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) {
2063 using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
2064
2065 // Tests with 120Hz
2066 auto refreshRateConfigs =
2067 std::make_unique<RefreshRateConfigs>(m60_120Device,
2068 /*currentConfigId=*/HWC_CONFIG_ID_120);
2069 // SetPolicy(0, 60), current 60Hz => TurnOn.
2070 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}),
2071 0);
2072 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2073
2074 // SetPolicy(60, 60), current 60Hz => TurnOff.
2075 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}),
2076 0);
2077 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2078
2079 // SetPolicy(60, 120), current 60Hz => TurnOn.
2080 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}),
2081 0);
2082 EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction());
2083
2084 // SetPolicy(120, 120), current 120Hz => TurnOff.
2085 ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy(
2086 {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}),
2087 0);
2088 EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());
2089}
2090
Ady Abraham5cc2e262021-03-25 13:09:17 -07002091TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {
Ady Abraham0bb6a472020-10-12 10:22:13 -07002092 auto refreshRateConfigs =
2093 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device,
2094 /*currentConfigId=*/HWC_CONFIG_ID_30);
Ady Abraham62a0be22020-12-08 16:54:10 -08002095
2096 const auto frameRate = Fps(30.f);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002097 Fps displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2098 EXPECT_EQ(1, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002099
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002100 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_60);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002101 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2102 EXPECT_EQ(2, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002103
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002104 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_72);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002105 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2106 EXPECT_EQ(0, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002107
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002108 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002109 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2110 EXPECT_EQ(3, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham0bb6a472020-10-12 10:22:13 -07002111
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002112 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_120);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002113 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2114 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, frameRate));
Ady Abraham62f216c2020-10-13 19:07:23 -07002115
Marin Shalamanova7fe3042021-01-29 21:02:08 +01002116 refreshRateConfigs->setCurrentModeId(HWC_CONFIG_ID_90);
Ady Abraham5cc2e262021-03-25 13:09:17 -07002117 displayRefreshRate = refreshRateConfigs->getCurrentRefreshRate().getFps();
2118 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.5f)));
2119 EXPECT_EQ(4, RefreshRateConfigs::getFrameRateDivider(displayRefreshRate, Fps(22.6f)));
Ady Abraham62a0be22020-12-08 16:54:10 -08002120}
2121
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002122TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {
Ady Abraham62a0be22020-12-08 16:54:10 -08002123 auto refreshRateConfigs =
2124 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
2125 HWC_CONFIG_ID_120);
2126
2127 auto layers = std::vector<LayerRequirement>{};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002128 ASSERT_TRUE(refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false)
2129 .empty());
Ady Abraham62a0be22020-12-08 16:54:10 -08002130}
2131
2132TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {
rnlee3bd610662021-06-23 16:27:57 -07002133 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002134 auto refreshRateConfigs =
2135 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002136 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002137
2138 auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};
2139 layers[0].name = "Test layer";
2140 layers[0].ownerUid = 1234;
2141 layers[0].desiredRefreshRate = Fps(60.0f);
2142 layers[0].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002143 auto frameRateOverrides =
2144 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002145 ASSERT_EQ(1, frameRateOverrides.size());
2146 ASSERT_EQ(1, frameRateOverrides.count(1234));
2147 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2148
2149 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002150 frameRateOverrides =
2151 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002152 ASSERT_EQ(1, frameRateOverrides.size());
2153 ASSERT_EQ(1, frameRateOverrides.count(1234));
2154 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2155
2156 layers[0].vote = LayerVoteType::NoVote;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002157 frameRateOverrides =
2158 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002159 ASSERT_TRUE(frameRateOverrides.empty());
2160
2161 layers[0].vote = LayerVoteType::Min;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002162 frameRateOverrides =
2163 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002164 ASSERT_TRUE(frameRateOverrides.empty());
2165
2166 layers[0].vote = LayerVoteType::Max;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002167 frameRateOverrides =
2168 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002169 ASSERT_TRUE(frameRateOverrides.empty());
2170
2171 layers[0].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002172 frameRateOverrides =
2173 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002174 ASSERT_TRUE(frameRateOverrides.empty());
2175}
2176
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002177TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {
rnlee3bd610662021-06-23 16:27:57 -07002178 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abraham62a0be22020-12-08 16:54:10 -08002179 auto refreshRateConfigs =
2180 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002181 HWC_CONFIG_ID_120, config);
Ady Abraham62a0be22020-12-08 16:54:10 -08002182
2183 auto layers = std::vector<LayerRequirement>{
2184 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2185 LayerRequirement{.ownerUid = 5678, .weight = 1.0f},
2186 };
2187
2188 layers[0].name = "Test layer 1234";
2189 layers[0].desiredRefreshRate = Fps(60.0f);
2190 layers[0].vote = LayerVoteType::ExplicitDefault;
2191
2192 layers[1].name = "Test layer 5678";
2193 layers[1].desiredRefreshRate = Fps(30.0f);
2194 layers[1].vote = LayerVoteType::ExplicitDefault;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002195 auto frameRateOverrides =
2196 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002197
2198 ASSERT_EQ(2, frameRateOverrides.size());
2199 ASSERT_EQ(1, frameRateOverrides.count(1234));
2200 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2201 ASSERT_EQ(1, frameRateOverrides.count(5678));
2202 ASSERT_EQ(30.0f, frameRateOverrides.at(5678).getValue());
2203
2204 layers[1].vote = LayerVoteType::Heuristic;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002205 frameRateOverrides =
2206 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
Ady Abraham62a0be22020-12-08 16:54:10 -08002207 ASSERT_EQ(1, frameRateOverrides.size());
2208 ASSERT_EQ(1, frameRateOverrides.count(1234));
2209 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2210
2211 layers[1].ownerUid = 1234;
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002212 frameRateOverrides =
2213 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2214 ASSERT_TRUE(frameRateOverrides.empty());
2215}
2216
2217TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) {
rnlee3bd610662021-06-23 16:27:57 -07002218 RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002219 auto refreshRateConfigs =
2220 std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/
rnlee3bd610662021-06-23 16:27:57 -07002221 HWC_CONFIG_ID_120, config);
Ady Abrahamdd5bfa92021-01-07 17:56:08 -08002222
2223 auto layers = std::vector<LayerRequirement>{
2224 LayerRequirement{.ownerUid = 1234, .weight = 1.0f},
2225 };
2226
2227 layers[0].name = "Test layer";
2228 layers[0].desiredRefreshRate = Fps(60.0f);
2229 layers[0].vote = LayerVoteType::ExplicitDefault;
2230
2231 auto frameRateOverrides =
2232 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2233 ASSERT_EQ(1, frameRateOverrides.size());
2234 ASSERT_EQ(1, frameRateOverrides.count(1234));
2235 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2236
2237 frameRateOverrides =
2238 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2239 ASSERT_EQ(1, frameRateOverrides.size());
2240 ASSERT_EQ(1, frameRateOverrides.count(1234));
2241 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2242
2243 layers[0].vote = LayerVoteType::ExplicitExact;
2244 frameRateOverrides =
2245 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2246 ASSERT_EQ(1, frameRateOverrides.size());
2247 ASSERT_EQ(1, frameRateOverrides.count(1234));
2248 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2249
2250 frameRateOverrides =
2251 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
2252 ASSERT_EQ(1, frameRateOverrides.size());
2253 ASSERT_EQ(1, frameRateOverrides.count(1234));
2254 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2255
2256 layers[0].vote = LayerVoteType::ExplicitExactOrMultiple;
2257 frameRateOverrides =
2258 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/false);
2259 ASSERT_EQ(1, frameRateOverrides.size());
2260 ASSERT_EQ(1, frameRateOverrides.count(1234));
2261 ASSERT_EQ(60.0f, frameRateOverrides.at(1234).getValue());
2262
2263 frameRateOverrides =
2264 refreshRateConfigs->getFrameRateOverrides(layers, Fps(120.0f), /*touch=*/true);
Ady Abraham62a0be22020-12-08 16:54:10 -08002265 ASSERT_TRUE(frameRateOverrides.empty());
Ady Abraham0bb6a472020-10-12 10:22:13 -07002266}
2267
Alec Mouri0a1cc962019-03-14 12:33:02 -07002268} // namespace
2269} // namespace scheduler
2270} // namespace android
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002271
2272// TODO(b/129481165): remove the #pragma below and fix conversion issues
2273#pragma clang diagnostic pop // ignored "-Wextra"