blob: 3b409658d743420b1f3712a7ab9321077c4bc595 [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"
28#include "EffectLayer.h"
29#include "Layer.h"
30// TODO(b/129481165): remove the #pragma below and fix conversion issues
31#pragma clang diagnostic pop // ignored "-Wconversion"
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070032#include "FpsOps.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070033#include "TestableSurfaceFlinger.h"
34#include "mock/DisplayHardware/MockComposer.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070035#include "mock/MockEventThread.h"
36#include "mock/MockMessageQueue.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070037#include "mock/MockVsyncController.h"
Ady Abraham60e42ea2020-03-09 19:17:31 -070038
39namespace android {
40
41using testing::_;
42using testing::DoAll;
43using testing::Mock;
44using testing::Return;
45using testing::SetArgPointee;
46
47using android::Hwc2::IComposer;
48using android::Hwc2::IComposerClient;
49
50using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
51
52using FrameRate = Layer::FrameRate;
53using FrameRateCompatibility = Layer::FrameRateCompatibility;
54
55class LayerFactory {
56public:
57 virtual ~LayerFactory() = default;
58
59 virtual std::string name() = 0;
60 virtual sp<Layer> createLayer(TestableSurfaceFlinger& flinger) = 0;
61
62protected:
63 static constexpr uint32_t WIDTH = 100;
64 static constexpr uint32_t HEIGHT = 100;
65 static constexpr uint32_t LAYER_FLAGS = 0;
66};
67
Ady Abraham60e42ea2020-03-09 19:17:31 -070068class BufferStateLayerFactory : public LayerFactory {
69public:
70 std::string name() override { return "BufferStateLayer"; }
71 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
72 sp<Client> client;
Ady Abraham44e9f3b2021-02-16 15:22:58 -080073 LayerCreationArgs args(flinger.flinger(), client, "buffer-state-layer", WIDTH, HEIGHT,
Ady Abraham60e42ea2020-03-09 19:17:31 -070074 LAYER_FLAGS, LayerMetadata());
75 return new BufferStateLayer(args);
76 }
77};
78
79class EffectLayerFactory : public LayerFactory {
80public:
81 std::string name() override { return "EffectLayer"; }
82 sp<Layer> createLayer(TestableSurfaceFlinger& flinger) override {
83 sp<Client> client;
84 LayerCreationArgs args(flinger.flinger(), client, "color-layer", WIDTH, HEIGHT, LAYER_FLAGS,
85 LayerMetadata());
86 return new EffectLayer(args);
87 }
88};
89
90std::string PrintToStringParamName(
91 const ::testing::TestParamInfo<std::shared_ptr<LayerFactory>>& info) {
92 return info.param->name();
93}
94
95/**
96 * This class tests the behaviour of Layer::SetFrameRate and Layer::GetFrameRate
97 */
98class SetFrameRateTest : public ::testing::TestWithParam<std::shared_ptr<LayerFactory>> {
99protected:
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700100 const FrameRate FRAME_RATE_VOTE1 = FrameRate(67_Hz, FrameRateCompatibility::Default);
101 const FrameRate FRAME_RATE_VOTE2 = FrameRate(14_Hz, FrameRateCompatibility::ExactOrMultiple);
102 const FrameRate FRAME_RATE_VOTE3 = FrameRate(99_Hz, FrameRateCompatibility::NoVote);
103 const FrameRate FRAME_RATE_TREE = FrameRate(Fps(), FrameRateCompatibility::NoVote);
104 const FrameRate FRAME_RATE_NO_VOTE = FrameRate(Fps(), FrameRateCompatibility::Default);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700105
106 SetFrameRateTest();
107
108 void setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700109
110 void addChild(sp<Layer> layer, sp<Layer> child);
111 void removeChild(sp<Layer> layer, sp<Layer> child);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700112 void commitTransaction();
113
114 TestableSurfaceFlinger mFlinger;
Ady Abraham60e42ea2020-03-09 19:17:31 -0700115 mock::MessageQueue* mMessageQueue = new mock::MessageQueue();
116
117 std::vector<sp<Layer>> mLayers;
118};
119
120SetFrameRateTest::SetFrameRateTest() {
121 const ::testing::TestInfo* const test_info =
122 ::testing::UnitTest::GetInstance()->current_test_info();
123 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
124
125 mFlinger.mutableUseFrameRateApi() = true;
126
127 setupScheduler();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700128
Dominik Laskowski13948602021-03-08 20:48:28 -0800129 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700130 mFlinger.mutableEventQueue().reset(mMessageQueue);
131}
Dominik Laskowski13948602021-03-08 20:48:28 -0800132
Ady Abraham60e42ea2020-03-09 19:17:31 -0700133void SetFrameRateTest::addChild(sp<Layer> layer, sp<Layer> child) {
134 layer.get()->addChild(child.get());
135}
136
137void SetFrameRateTest::removeChild(sp<Layer> layer, sp<Layer> child) {
138 layer.get()->removeChild(child.get());
139}
140
Ady Abraham60e42ea2020-03-09 19:17:31 -0700141void SetFrameRateTest::commitTransaction() {
142 for (auto layer : mLayers) {
Robert Carr6a160312021-05-17 12:08:20 -0700143 auto c = layer->getDrawingState();
Robert Carr0758e5d2021-03-11 22:15:04 -0800144 layer->commitTransaction(c);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700145 }
146}
147
148void SetFrameRateTest::setupScheduler() {
149 auto eventThread = std::make_unique<mock::EventThread>();
150 auto sfEventThread = std::make_unique<mock::EventThread>();
151
152 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
153 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700154 .WillOnce(Return(new EventThreadConnection(eventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700155 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700156
157 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
158 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abraham0bb6a472020-10-12 10:22:13 -0700159 .WillOnce(Return(new EventThreadConnection(sfEventThread.get(), /*callingUid=*/0,
Ady Abraham62f216c2020-10-13 19:07:23 -0700160 ResyncCallback())));
Ady Abraham60e42ea2020-03-09 19:17:31 -0700161
Ady Abraham8cb21882020-08-26 18:22:05 -0700162 auto vsyncController = std::make_unique<mock::VsyncController>();
163 auto vsyncTracker = std::make_unique<mock::VSyncTracker>();
Ady Abraham60e42ea2020-03-09 19:17:31 -0700164
Ady Abraham8cb21882020-08-26 18:22:05 -0700165 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
166 EXPECT_CALL(*vsyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +0100167 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Ady Abraham8cb21882020-08-26 18:22:05 -0700168 EXPECT_CALL(*vsyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
169 mFlinger.setupScheduler(std::move(vsyncController), std::move(vsyncTracker),
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800170 std::move(eventThread), std::move(sfEventThread), /*callback*/ nullptr,
171 /*hasMultipleModes*/ true);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700172}
173
Ady Abraham60e42ea2020-03-09 19:17:31 -0700174namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700175
Ady Abraham60e42ea2020-03-09 19:17:31 -0700176TEST_P(SetFrameRateTest, SetAndGet) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700177 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700178
179 const auto& layerFactory = GetParam();
180
181 auto layer = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
182 layer->setFrameRate(FRAME_RATE_VOTE1);
183 commitTransaction();
184 EXPECT_EQ(FRAME_RATE_VOTE1, layer->getFrameRateForLayerTree());
185}
186
187TEST_P(SetFrameRateTest, SetAndGetParent) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700188 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700189
190 const auto& layerFactory = GetParam();
191
192 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
193 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
194 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
195
196 addChild(parent, child1);
197 addChild(child1, child2);
198
199 child2->setFrameRate(FRAME_RATE_VOTE1);
200 commitTransaction();
201 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
202 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
203 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
204
205 child2->setFrameRate(FRAME_RATE_NO_VOTE);
206 commitTransaction();
207 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
208 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
209 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
210}
211
212TEST_P(SetFrameRateTest, SetAndGetParentAllVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700213 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700214
215 const auto& layerFactory = GetParam();
216
217 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
218 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
219 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
220
221 addChild(parent, child1);
222 addChild(child1, child2);
223
224 child2->setFrameRate(FRAME_RATE_VOTE1);
225 child1->setFrameRate(FRAME_RATE_VOTE2);
226 parent->setFrameRate(FRAME_RATE_VOTE3);
227 commitTransaction();
228 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
229 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
230 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
231
232 child2->setFrameRate(FRAME_RATE_NO_VOTE);
233 commitTransaction();
234 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
235 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700236 EXPECT_EQ(FRAME_RATE_VOTE2, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700237
238 child1->setFrameRate(FRAME_RATE_NO_VOTE);
239 commitTransaction();
240 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700241 EXPECT_EQ(FRAME_RATE_VOTE3, child1->getFrameRateForLayerTree());
242 EXPECT_EQ(FRAME_RATE_VOTE3, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700243
244 parent->setFrameRate(FRAME_RATE_NO_VOTE);
245 commitTransaction();
246 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
247 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
248 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
249}
250
251TEST_P(SetFrameRateTest, SetAndGetChild) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700252 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700253
254 const auto& layerFactory = GetParam();
255
256 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
257 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
258 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
259
260 addChild(parent, child1);
261 addChild(child1, child2);
262
263 parent->setFrameRate(FRAME_RATE_VOTE1);
264 commitTransaction();
265 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700266 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
267 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700268
269 parent->setFrameRate(FRAME_RATE_NO_VOTE);
270 commitTransaction();
271 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
272 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
273 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
274}
275
276TEST_P(SetFrameRateTest, SetAndGetChildAllVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700277 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700278
279 const auto& layerFactory = GetParam();
280
281 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
282 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
283 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
284
285 addChild(parent, child1);
286 addChild(child1, child2);
287
288 child2->setFrameRate(FRAME_RATE_VOTE1);
289 child1->setFrameRate(FRAME_RATE_VOTE2);
290 parent->setFrameRate(FRAME_RATE_VOTE3);
291 commitTransaction();
292 EXPECT_EQ(FRAME_RATE_VOTE3, parent->getFrameRateForLayerTree());
293 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
294 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
295
296 parent->setFrameRate(FRAME_RATE_NO_VOTE);
297 commitTransaction();
298 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
299 EXPECT_EQ(FRAME_RATE_VOTE2, child1->getFrameRateForLayerTree());
300 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
301
302 child1->setFrameRate(FRAME_RATE_NO_VOTE);
303 commitTransaction();
304 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
305 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
306 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
307
308 child2->setFrameRate(FRAME_RATE_NO_VOTE);
309 commitTransaction();
310 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
311 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
312 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
313}
314
315TEST_P(SetFrameRateTest, SetAndGetChildAddAfterVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700316 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700317
318 const auto& layerFactory = GetParam();
319
320 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
321 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
322 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
323
324 addChild(parent, child1);
325
326 parent->setFrameRate(FRAME_RATE_VOTE1);
327 commitTransaction();
328 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700329 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700330 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
331
332 addChild(child1, child2);
333 commitTransaction();
334 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700335 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
336 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700337
338 parent->setFrameRate(FRAME_RATE_NO_VOTE);
339 commitTransaction();
340 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
341 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
342 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
343}
344
345TEST_P(SetFrameRateTest, SetAndGetChildRemoveAfterVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700346 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700347
348 const auto& layerFactory = GetParam();
349
350 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
351 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
352 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
353
354 addChild(parent, child1);
355 addChild(child1, child2);
356
357 parent->setFrameRate(FRAME_RATE_VOTE1);
358 commitTransaction();
359 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700360 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
361 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700362
363 removeChild(child1, child2);
364 commitTransaction();
365 EXPECT_EQ(FRAME_RATE_VOTE1, parent->getFrameRateForLayerTree());
Ady Abrahamf467f892020-07-31 16:01:53 -0700366 EXPECT_EQ(FRAME_RATE_VOTE1, child1->getFrameRateForLayerTree());
Ady Abraham60e42ea2020-03-09 19:17:31 -0700367 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
368
369 parent->setFrameRate(FRAME_RATE_NO_VOTE);
370 commitTransaction();
371 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
372 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
373 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
374}
375
376TEST_P(SetFrameRateTest, SetAndGetParentNotInTree) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700377 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abraham60e42ea2020-03-09 19:17:31 -0700378
379 const auto& layerFactory = GetParam();
380
381 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
382 auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
383 auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
384 auto child2_1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
385
386 addChild(parent, child1);
387 addChild(child1, child2);
388 addChild(child1, child2_1);
389
390 child2->setFrameRate(FRAME_RATE_VOTE1);
391 commitTransaction();
392 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
393 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
394 EXPECT_EQ(FRAME_RATE_VOTE1, child2->getFrameRateForLayerTree());
395 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
396
397 child2->setFrameRate(FRAME_RATE_NO_VOTE);
398 commitTransaction();
399 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
400 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
401 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
402 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2_1->getFrameRateForLayerTree());
403}
404
Ady Abraham60e42ea2020-03-09 19:17:31 -0700405INSTANTIATE_TEST_SUITE_P(PerLayerType, SetFrameRateTest,
Robert Carr80b1b1c2021-09-29 12:44:17 -0700406 testing::Values(std::make_shared<BufferStateLayerFactory>(),
Ady Abraham60e42ea2020-03-09 19:17:31 -0700407 std::make_shared<EffectLayerFactory>()),
408 PrintToStringParamName);
409
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800410TEST_F(SetFrameRateTest, ValidateFrameRate) {
Marin Shalamanovc5986772021-03-16 16:09:49 +0100411 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
412 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
413 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
414 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
415 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
416 ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS, ""));
417 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
418 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
419 EXPECT_TRUE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
420 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, "",
421 /*privileged=*/true));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800422
Marin Shalamanovc5986772021-03-16 16:09:49 +0100423 EXPECT_FALSE(ValidateFrameRate(-1, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
424 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
425 EXPECT_FALSE(ValidateFrameRate(1.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
426 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
427 EXPECT_FALSE(ValidateFrameRate(0.0f / 0.0f, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
428 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800429
Marin Shalamanovc5986772021-03-16 16:09:49 +0100430 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT,
431 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
432
433 // Invalid compatibility
434 EXPECT_FALSE(
435 ValidateFrameRate(60.0f, -1, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
436 EXPECT_FALSE(ValidateFrameRate(60.0f, 2, ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, ""));
437
438 // Invalid change frame rate strategy
439 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, -1, ""));
440 EXPECT_FALSE(ValidateFrameRate(60.0f, ANATIVEWINDOW_FRAME_RATE_EXACT, 2, ""));
Ady Abrahamdd5bfa92021-01-07 17:56:08 -0800441}
442
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800443TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {
444 const auto& layerFactory = GetParam();
445
446 auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
447 if (!parent->isVisible()) {
448 // This is a hack as all the test layers except EffectLayer are not visible,
449 // but since the logic is unified in Layer, it should be fine.
450 return;
451 }
452
453 auto child = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
454 addChild(parent, child);
455
456 parent->setFrameRate(FRAME_RATE_VOTE1);
457 commitTransaction();
458
Ady Abrahambdda8f02021-04-01 16:06:11 -0700459 mFlinger.mutableScheduler()
460 .mutableLayerHistory()
461 ->record(parent.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
462 mFlinger.mutableScheduler()
463 .mutableLayerHistory()
464 ->record(child.get(), 0, 0, LayerHistory::LayerUpdateType::Buffer);
465
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800466 const auto layerHistorySummary =
Ady Abraham3efa3942021-06-24 19:01:25 -0700467 mFlinger.mutableScheduler()
468 .mutableLayerHistory()
469 ->summarize(*mFlinger.mutableScheduler().refreshRateConfigs(), 0);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800470 ASSERT_EQ(2u, layerHistorySummary.size());
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700471 EXPECT_EQ(FRAME_RATE_VOTE1.rate, layerHistorySummary[0].desiredRefreshRate);
472 EXPECT_EQ(FRAME_RATE_VOTE1.rate, layerHistorySummary[1].desiredRefreshRate);
Ady Abraham44e9f3b2021-02-16 15:22:58 -0800473}
474
Ady Abrahama850c182021-08-04 13:04:37 -0700475TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) {
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700476 EXPECT_CALL(*mMessageQueue, scheduleCommit()).Times(1);
Ady Abrahama850c182021-08-04 13:04:37 -0700477
478 const auto& layerFactory = GetParam();
479
480 const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
481 const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
482 const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
483 const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger));
484
485 addChild(parent, child1);
486 addChild(child1, childOfChild1);
487
488 childOfChild1->setFrameRate(FRAME_RATE_VOTE1);
489 commitTransaction();
490 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
491 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
492 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
493 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
494
495 addChild(parent, child2);
496 commitTransaction();
497 EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree());
498 EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree());
499 EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree());
500 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
501
502 childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE);
503 commitTransaction();
504 EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree());
505 EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree());
506 EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree());
507 EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree());
508}
509
Ady Abraham60e42ea2020-03-09 19:17:31 -0700510} // namespace
511} // namespace android