blob: 51c6beabae0313c089dbfa10246f3bcf63500e8b [file] [log] [blame]
Ady Abraham60e42ea2020-03-09 19:17:31 -07001/*
2 * Copyright 2020 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
17#undef LOG_TAG
18#define LOG_TAG "LibSurfaceFlingerUnittests"
19
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
22#include <gui/LayerMetadata.h>
23
24// TODO(b/129481165): remove the #pragma below and fix conversion issues
25#pragma clang diagnostic push
26#pragma clang diagnostic ignored "-Wconversion"
Ady Abraham60e42ea2020-03-09 19:17:31 -070027#include "BufferStateLayer.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070028#include "Layer.h"
29// TODO(b/129481165): remove the #pragma below and fix conversion issues
30#pragma clang diagnostic pop // ignored "-Wconversion"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070031#include "FpsOps.h"
Garfield Tan23202892022-03-02 16:10:21 -080032#include "LayerTestUtils.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070033#include "TestableSurfaceFlinger.h"
34#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070035#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070036
37namespace android {
38
Ady Abraham60e42ea2020-03-09 19:17:31 -070039using testing::DoAll;
40using testing::Mock;
Ady Abraham60e42ea2020-03-09 19:17:31 -070041using testing::SetArgPointee;
42
43using android::Hwc2::IComposer;
44using android::Hwc2::IComposerClient;
45
Dominik Laskowski068173d2021-08-11 17:22:59 -070046using scheduler::LayerHistory;
47
Ady Abraham60e42ea2020-03-09 19:17:31 -070048using FrameRate = Layer::FrameRate;
49using FrameRateCompatibility = Layer::FrameRateCompatibility;
50
Ady Abraham60e42ea2020-03-09 19:17:31 -070051/**
52 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
53 */
Garfield Tan23202892022-03-02 16:10:21 -080054class SetFrameRateTest : public BaseLayerTest {
Ady Abraham60e42ea2020-03-09 19:17:31 -070055protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070056 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
57 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
58 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
59 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
60 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -070061
62 SetFrameRateTest();
63
Ady Abraham60e42ea2020-03-09 19:17:31 -070064 void addChild(sp<Layer> layer, sp<Layer> child);
65 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070066 void commitTransaction();
67
Ady Abraham60e42ea2020-03-09 19:17:31 -070068 std::vector<sp<Layer>> mLayers;
69};
70
71SetFrameRateTest::SetFrameRateTest() {
72 const ::testing::TestInfo* const test_info =
73 ::testing::UnitTest::GetInstance()->current_test_info();
74 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
75
Dominik Laskowski13948602021-03-08 20:48:28 -080076 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -070077}
Dominik Laskowski13948602021-03-08 20:48:28 -080078
Ady Abraham60e42ea2020-03-09 19:17:31 -070079void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070080 layer->addChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070081}
82
83void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
Ady Abrahamd11bade2022-08-01 16:18:03 -070084 layer->removeChild(child);
Ady Abraham60e42ea2020-03-09 19:17:31 -070085}
86
Ady Abraham60e42ea2020-03-09 19:17:31 -070087void SetFrameRateTest::commitTransaction() {
88 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -070089 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -080090 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -070091 }
92}
93
Ady Abraham60e42ea2020-03-09 19:17:31 -070094namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070095
Ady Abraham60e42ea2020-03-09 19:17:31 -070096TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -070097 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -070098
99 const auto& layerFactory = GetParam();
100
101 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
102 layer->setFrameRate(FRAME_RATE_VOTE1);
103 commitTransaction();
104 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
105}
106
107TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700108 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700109
110 const auto& layerFactory = GetParam();
111
112 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
113 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
114 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
115
116 addChild(parent, child1);
117 addChild(child1, child2);
118
119 child2->setFrameRate(FRAME_RATE_VOTE1);
120 commitTransaction();
121 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
122 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
123 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
124
125 child2->setFrameRate(FRAME_RATE_NO_VOTE);
126 commitTransaction();
127 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
128 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
129 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
130}
131
132TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700133 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700134
135 const auto& layerFactory = GetParam();
136
137 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
138 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
139 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
140
141 addChild(parent, child1);
142 addChild(child1, child2);
143
144 child2->setFrameRate(FRAME_RATE_VOTE1);
145 child1->setFrameRate(FRAME_RATE_VOTE2);
146 parent->setFrameRate(FRAME_RATE_VOTE3);
147 commitTransaction();
148 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
149 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
150 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
151
152 child2->setFrameRate(FRAME_RATE_NO_VOTE);
153 commitTransaction();
154 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
155 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700156 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700157
158 child1->setFrameRate(FRAME_RATE_NO_VOTE);
159 commitTransaction();
160 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700161 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
162 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700163
164 parent->setFrameRate(FRAME_RATE_NO_VOTE);
165 commitTransaction();
166 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
167 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
168 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
169}
170
171TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700172 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700173
174 const auto& layerFactory = GetParam();
175
176 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
177 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
178 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
179
180 addChild(parent, child1);
181 addChild(child1, child2);
182
183 parent->setFrameRate(FRAME_RATE_VOTE1);
184 commitTransaction();
185 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700186 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
187 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700188
189 parent->setFrameRate(FRAME_RATE_NO_VOTE);
190 commitTransaction();
191 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
192 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
193 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
194}
195
196TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700197 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700198
199 const auto& layerFactory = GetParam();
200
201 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
202 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
203 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
204
205 addChild(parent, child1);
206 addChild(child1, child2);
207
208 child2->setFrameRate(FRAME_RATE_VOTE1);
209 child1->setFrameRate(FRAME_RATE_VOTE2);
210 parent->setFrameRate(FRAME_RATE_VOTE3);
211 commitTransaction();
212 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
213 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
214 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
215
216 parent->setFrameRate(FRAME_RATE_NO_VOTE);
217 commitTransaction();
218 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
219 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
220 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
221
222 child1->setFrameRate(FRAME_RATE_NO_VOTE);
223 commitTransaction();
224 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
225 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
226 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
227
228 child2->setFrameRate(FRAME_RATE_NO_VOTE);
229 commitTransaction();
230 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
231 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
232 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
233}
234
235TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700236 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700237
238 const auto& layerFactory = GetParam();
239
240 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
241 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
242 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
243
244 addChild(parent, child1);
245
246 parent->setFrameRate(FRAME_RATE_VOTE1);
247 commitTransaction();
248 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700249 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700250 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
251
252 addChild(child1, child2);
253 commitTransaction();
254 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700255 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
256 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700257
258 parent->setFrameRate(FRAME_RATE_NO_VOTE);
259 commitTransaction();
260 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
261 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
262 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
263}
264
265TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700266 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700267
268 const auto& layerFactory = GetParam();
269
270 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
271 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
272 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
273
274 addChild(parent, child1);
275 addChild(child1, child2);
276
277 parent->setFrameRate(FRAME_RATE_VOTE1);
278 commitTransaction();
279 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700280 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
281 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700282
283 removeChild(child1, child2);
284 commitTransaction();
285 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700286 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700287 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
288
289 parent->setFrameRate(FRAME_RATE_NO_VOTE);
290 commitTransaction();
291 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
292 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
293 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
294}
295
296TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700297 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700298
299 const auto& layerFactory = GetParam();
300
301 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
302 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
303 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
304 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
305
306 addChild(parent, child1);
307 addChild(child1, child2);
308 addChild(child1, child2_1);
309
310 child2->setFrameRate(FRAME_RATE_VOTE1);
311 commitTransaction();
312 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
313 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
314 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
315 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
316
317 child2->setFrameRate(FRAME_RATE_NO_VOTE);
318 commitTransaction();
319 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
320 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
321 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
322 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
323}
324
Ady Abraham60e42ea2020-03-09 19:17:31 -0700325INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700326 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700327 std::make_shared<EffectLayerFactory>()),
328 PrintToStringParamName);
329
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800330TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100331 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
332 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
333 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
334 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
335 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
336 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
337 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
338 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700339
340 // Privileged APIs.
341 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
342 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
343 EXPECT_FALSE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
344 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
345
346 constexpr bool kPrivileged = true;
Marin Shalamanovc5986772021-03-16 16:09:49 +0100347 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
348 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700349 kPrivileged));
350 EXPECT_TRUE(ValidateFrameRate(0.0f, ANATIVEWINDOW_FRAME_RATE_NO_VOTE,
351 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
352 kPrivileged));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800353
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700354 // Invalid frame rate.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100355 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
356 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
357 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
358 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
359 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
360 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800361
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700362 // Invalid compatibility.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100363 EXPECT_FALSE(
364 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
365 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
366
Dominik Laskowski1f6fc702022-03-21 08:34:50 -0700367 // Invalid change frame rate strategy.
Marin Shalamanovc5986772021-03-16 16:09:49 +0100368 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
369 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800370}
371
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800372TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
373 const auto& layerFactory = GetParam();
374
375 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800376
377 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
378 addChild(parent, child);
379
380 parent->setFrameRate(FRAME_RATE_VOTE1);
381 commitTransaction();
382
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700383 auto& history = mFlinger.mutableScheduler().mutableLayerHistory();
384 history.record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
385 history.record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
Ady Abrahambdda8f02021-04-01 16:06:11 -0700386
Dominik Laskowski9c93d602021-10-07 19:38:26 -0700387 const auto configs = mFlinger.mutableScheduler().refreshRateConfigs();
388 const auto summary = history.summarize(*configs, 0);
389
390 ASSERT_EQ(2u, summary.size());
391 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[0].desiredRefreshRate);
392 EXPECT_EQ(FRAME_RATE_VOTE1.rate, summary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800393}
394
Ady Abrahama850c182021-08-04 13:04:37 -0700395TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700396 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700397
398 const auto& layerFactory = GetParam();
399
400 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
401 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
402 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
403 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
404
405 addChild(parent, child1);
406 addChild(child1, childOfChild1);
407
408 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
409 commitTransaction();
410 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
411 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
412 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
413 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
414
415 addChild(parent, child2);
416 commitTransaction();
417 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
418 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
419 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
420 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
421
422 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
423 commitTransaction();
424 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
425 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
426 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
427 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
428}
429
Ady Abraham60e42ea2020-03-09 19:17:31 -0700430} // namespace
431} // namespace android