blob: 99c1d23c2be9fe0fa3dba8574131c1fc5ecd5750 [file] [log] [blame]
Vishnu Nairdc4d31b2022-11-17 03:20:58 +00001/*
2 * Copyright 2022 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#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
20#include "FrontEnd/LayerHandle.h"
21#include "FrontEnd/LayerLifecycleManager.h"
22#include "Layer.h"
23#include "gui/SurfaceComposerClient.h"
24
25using namespace android::surfaceflinger;
26
27namespace android::surfaceflinger::frontend {
28
29namespace {
30LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, wp<IBinder> parent, wp<IBinder> mirror) {
31 LayerCreationArgs args(nullptr, nullptr, "testlayer", 0, {}, std::make_optional(id));
32 args.addToRoot = canBeRoot;
33 args.parentHandle = parent;
34 args.mirrorLayerHandle = mirror;
35 return args;
36}
37} // namespace
38
39// To run test:
40/**
41 mp :libsurfaceflinger_unittest && adb sync; adb shell \
42 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
43 --gtest_filter="LayerLifecycleManagerTest.*" --gtest_repeat=100 \
44 --gtest_shuffle \
45 --gtest_brief=1
46*/
47class ExpectLayerLifecycleListener : public LayerLifecycleManager::ILifecycleListener {
48public:
49 void onLayerAdded(const RequestedLayerState& layer) override {
50 mActualLayersAdded.emplace(layer.id);
51 };
52 void onLayerDestroyed(const RequestedLayerState& layer) override {
53 mActualLayersDestroyed.emplace(layer.id);
54 };
55
56 void expectLayersAdded(const std::unordered_set<uint32_t>& expectedLayersAdded) {
57 EXPECT_EQ(expectedLayersAdded, mActualLayersAdded);
58 mActualLayersAdded.clear();
59 }
60 void expectLayersDestroyed(const std::unordered_set<uint32_t>& expectedLayersDestroyed) {
61 EXPECT_EQ(expectedLayersDestroyed, mActualLayersDestroyed);
62 mActualLayersDestroyed.clear();
63 }
64
65 std::unordered_set<uint32_t> mActualLayersAdded;
66 std::unordered_set<uint32_t> mActualLayersDestroyed;
67};
68
69class LayerLifecycleManagerTest : public testing::Test {
70protected:
71 std::unique_ptr<RequestedLayerState> rootLayer(uint32_t id) {
72 return std::make_unique<RequestedLayerState>(
73 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/nullptr, /*mirror=*/nullptr));
74 }
75
76 std::unique_ptr<RequestedLayerState> childLayer(uint32_t id, uint32_t parentId) {
77 mHandles[parentId] = sp<LayerHandle>::make(parentId);
78 return std::make_unique<RequestedLayerState>(createArgs(/*id=*/id, /*canBeRoot=*/false,
79 /*parent=*/mHandles[parentId],
80 /*mirror=*/nullptr));
81 }
82
83 TransactionState reparentLayer(uint32_t id, uint32_t newParentId) {
84 TransactionState transaction;
85 transaction.states.push_back({});
86
87 if (newParentId == UNASSIGNED_LAYER_ID) {
88 transaction.states.front().state.parentSurfaceControlForChild = nullptr;
89 } else {
90 transaction.states.front().state.parentSurfaceControlForChild =
91 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(),
92 sp<LayerHandle>::make(newParentId),
93 static_cast<int32_t>(newParentId), "Test");
94 }
95 transaction.states.front().state.what = layer_state_t::eReparent;
96 transaction.states.front().state.surface = sp<LayerHandle>::make(id);
97 return transaction;
98 }
99
100 TransactionState setLayer(uint32_t id, int32_t z) {
101 TransactionState transaction;
102 transaction.states.push_back({});
103 transaction.states.front().state.z = z;
104 transaction.states.front().state.what = layer_state_t::eLayerChanged;
105 transaction.states.front().state.surface = sp<LayerHandle>::make(id);
106 return transaction;
107 }
108
109 TransactionState makeRelative(uint32_t id, uint32_t relativeParentId) {
110 TransactionState transaction;
111 transaction.states.push_back({});
112
113 if (relativeParentId == UNASSIGNED_LAYER_ID) {
114 transaction.states.front().state.relativeLayerSurfaceControl = nullptr;
115 } else {
116 transaction.states.front().state.relativeLayerSurfaceControl =
117 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(),
118 sp<LayerHandle>::make(relativeParentId),
119 static_cast<int32_t>(relativeParentId), "Test");
120 }
121 transaction.states.front().state.what = layer_state_t::eRelativeLayerChanged;
122 transaction.states.front().state.surface = sp<LayerHandle>::make(id);
123 return transaction;
124 }
125
126 RequestedLayerState* getRequestedLayerState(LayerLifecycleManager& lifecycleManager,
127 uint32_t layerId) {
128 return lifecycleManager.getLayerFromId(layerId);
129 }
130
131 std::unordered_map<uint32_t, sp<LayerHandle>> mHandles;
132};
133
134TEST_F(LayerLifecycleManagerTest, addLayers) {
135 LayerLifecycleManager lifecycleManager;
136 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
137 lifecycleManager.addLifecycleListener(listener);
138 std::vector<std::unique_ptr<RequestedLayerState>> layers;
139 layers.emplace_back(rootLayer(1));
140 layers.emplace_back(rootLayer(2));
141 layers.emplace_back(rootLayer(3));
142 lifecycleManager.addLayers(std::move(layers));
143 lifecycleManager.onHandlesDestroyed({1, 2, 3});
144 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
145 lifecycleManager.commitChanges();
146 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
147 listener->expectLayersAdded({1, 2, 3});
148 listener->expectLayersDestroyed({1, 2, 3});
149}
150
151TEST_F(LayerLifecycleManagerTest, updateLayerStates) {
152 LayerLifecycleManager lifecycleManager;
153 std::vector<std::unique_ptr<RequestedLayerState>> layers;
154 layers.emplace_back(rootLayer(1));
155 lifecycleManager.addLayers(std::move(layers));
156
157 std::vector<TransactionState> transactions;
158 transactions.emplace_back();
159 transactions.back().states.push_back({});
160 transactions.back().states.front().state.z = 2;
161 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
162 sp<LayerHandle> handle = sp<LayerHandle>::make(1u);
163 transactions.back().states.front().state.surface = handle;
164 lifecycleManager.applyTransactions(transactions);
165 transactions.clear();
166
167 auto& managedLayers = lifecycleManager.getLayers();
168 ASSERT_EQ(managedLayers.size(), 1u);
169
170 EXPECT_EQ(managedLayers.front()->z, 2);
171 EXPECT_TRUE(managedLayers.front()->changes.test(RequestedLayerState::Changes::Z));
172
173 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
174 lifecycleManager.commitChanges();
175 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
176 ASSERT_EQ(managedLayers.size(), 1u);
177 EXPECT_FALSE(managedLayers.front()->changes.test(RequestedLayerState::Changes::Z));
178
179 // apply transactions that do not affect the hierarchy
180 transactions.emplace_back();
181 transactions.back().states.push_back({});
182 transactions.back().states.front().state.backgroundBlurRadius = 22;
183 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
184 transactions.back().states.front().state.surface = handle;
185 lifecycleManager.applyTransactions(transactions);
186 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
187 lifecycleManager.commitChanges();
188 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
189 EXPECT_EQ(managedLayers.front()->backgroundBlurRadius, 22u);
190}
191
192TEST_F(LayerLifecycleManagerTest, layerWithoutHandleIsDestroyed) {
193 LayerLifecycleManager lifecycleManager;
194 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
195 lifecycleManager.addLifecycleListener(listener);
196 std::vector<std::unique_ptr<RequestedLayerState>> layers;
197 layers.emplace_back(rootLayer(1));
198 layers.emplace_back(rootLayer(2));
199 lifecycleManager.addLayers(std::move(layers));
200 lifecycleManager.onHandlesDestroyed({1});
201 lifecycleManager.commitChanges();
202
203 SCOPED_TRACE("layerWithoutHandleIsDestroyed");
204 listener->expectLayersAdded({1, 2});
205 listener->expectLayersDestroyed({1});
206}
207
208TEST_F(LayerLifecycleManagerTest, rootLayerWithoutHandleIsDestroyed) {
209 LayerLifecycleManager lifecycleManager;
210 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
211 lifecycleManager.addLifecycleListener(listener);
212 std::vector<std::unique_ptr<RequestedLayerState>> layers;
213 layers.emplace_back(rootLayer(1));
214 layers.emplace_back(rootLayer(2));
215 lifecycleManager.addLayers(std::move(layers));
216 lifecycleManager.onHandlesDestroyed({1});
217 lifecycleManager.commitChanges();
218 listener->expectLayersAdded({1, 2});
219 listener->expectLayersDestroyed({1});
220}
221
222TEST_F(LayerLifecycleManagerTest, offscreenLayerIsDestroyed) {
223 LayerLifecycleManager lifecycleManager;
224 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
225 lifecycleManager.addLifecycleListener(listener);
226 std::vector<std::unique_ptr<RequestedLayerState>> layers;
227 layers.emplace_back(rootLayer(1));
228 layers.emplace_back(rootLayer(2));
229 layers.emplace_back(childLayer(3, /*parent*/ 2));
230 lifecycleManager.addLayers(std::move(layers));
231 lifecycleManager.commitChanges();
232 listener->expectLayersAdded({1, 2, 3});
233 listener->expectLayersDestroyed({});
234
235 lifecycleManager.applyTransactions({reparentLayer(3, UNASSIGNED_LAYER_ID)});
236 lifecycleManager.commitChanges();
237 listener->expectLayersAdded({});
238 listener->expectLayersDestroyed({});
239
240 lifecycleManager.onHandlesDestroyed({3});
241 lifecycleManager.commitChanges();
242 listener->expectLayersAdded({});
243 listener->expectLayersDestroyed({3});
244}
245
246TEST_F(LayerLifecycleManagerTest, offscreenChildLayerWithHandleIsNotDestroyed) {
247 LayerLifecycleManager lifecycleManager;
248 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
249 lifecycleManager.addLifecycleListener(listener);
250 std::vector<std::unique_ptr<RequestedLayerState>> layers;
251 layers.emplace_back(rootLayer(1));
252 layers.emplace_back(rootLayer(2));
253 layers.emplace_back(childLayer(3, /*parent*/ 2));
254 layers.emplace_back(childLayer(4, /*parent*/ 3));
255 lifecycleManager.addLayers(std::move(layers));
256 lifecycleManager.commitChanges();
257 listener->expectLayersAdded({1, 2, 3, 4});
258 listener->expectLayersDestroyed({});
259
260 lifecycleManager.applyTransactions({reparentLayer(3, UNASSIGNED_LAYER_ID)});
261 lifecycleManager.onHandlesDestroyed({3});
262 lifecycleManager.commitChanges();
263 listener->expectLayersAdded({});
264 listener->expectLayersDestroyed({3});
265}
266
267TEST_F(LayerLifecycleManagerTest, offscreenChildLayerWithoutHandleIsDestroyed) {
268 LayerLifecycleManager lifecycleManager;
269 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
270 lifecycleManager.addLifecycleListener(listener);
271 std::vector<std::unique_ptr<RequestedLayerState>> layers;
272 layers.emplace_back(rootLayer(1));
273 layers.emplace_back(rootLayer(2));
274 layers.emplace_back(childLayer(3, /*parent*/ 2));
275 layers.emplace_back(childLayer(4, /*parent*/ 3));
276 lifecycleManager.addLayers(std::move(layers));
277 lifecycleManager.commitChanges();
278 listener->expectLayersAdded({1, 2, 3, 4});
279 listener->expectLayersDestroyed({});
280
281 lifecycleManager.applyTransactions({reparentLayer(3, UNASSIGNED_LAYER_ID)});
282 lifecycleManager.onHandlesDestroyed({3, 4});
283 lifecycleManager.commitChanges();
284 listener->expectLayersAdded({});
285 listener->expectLayersDestroyed({3, 4});
286}
287
288TEST_F(LayerLifecycleManagerTest, reparentingDoesNotAffectRelativeZ) {
289 LayerLifecycleManager lifecycleManager;
290 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
291 lifecycleManager.addLifecycleListener(listener);
292 std::vector<std::unique_ptr<RequestedLayerState>> layers;
293 layers.emplace_back(rootLayer(1));
294 layers.emplace_back(rootLayer(2));
295 layers.emplace_back(childLayer(3, /*parent*/ 2));
296 layers.emplace_back(childLayer(4, /*parent*/ 3));
297
298 lifecycleManager.addLayers(std::move(layers));
299 lifecycleManager.commitChanges();
300 listener->expectLayersAdded({1, 2, 3, 4});
301 listener->expectLayersDestroyed({});
302
303 lifecycleManager.applyTransactions({makeRelative(4, 1)});
304 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
305 lifecycleManager.applyTransactions({reparentLayer(4, 2)});
306 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
307
308 lifecycleManager.commitChanges();
309 listener->expectLayersAdded({});
310 listener->expectLayersDestroyed({});
311}
312
313TEST_F(LayerLifecycleManagerTest, reparentingToNullRemovesRelativeZ) {
314 LayerLifecycleManager lifecycleManager;
315 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
316 lifecycleManager.addLifecycleListener(listener);
317 std::vector<std::unique_ptr<RequestedLayerState>> layers;
318 layers.emplace_back(rootLayer(1));
319 layers.emplace_back(rootLayer(2));
320 layers.emplace_back(childLayer(3, /*parent*/ 2));
321 layers.emplace_back(childLayer(4, /*parent*/ 3));
322
323 lifecycleManager.addLayers(std::move(layers));
324 lifecycleManager.commitChanges();
325 listener->expectLayersAdded({1, 2, 3, 4});
326 listener->expectLayersDestroyed({});
327
328 lifecycleManager.applyTransactions({makeRelative(4, 1)});
329 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
330 lifecycleManager.applyTransactions({reparentLayer(4, UNASSIGNED_LAYER_ID)});
331 EXPECT_FALSE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
332
333 lifecycleManager.commitChanges();
334 listener->expectLayersAdded({});
335 listener->expectLayersDestroyed({});
336}
337
338TEST_F(LayerLifecycleManagerTest, setZRemovesRelativeZ) {
339 LayerLifecycleManager lifecycleManager;
340 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
341 lifecycleManager.addLifecycleListener(listener);
342 std::vector<std::unique_ptr<RequestedLayerState>> layers;
343 layers.emplace_back(rootLayer(1));
344 layers.emplace_back(rootLayer(2));
345 layers.emplace_back(childLayer(3, /*parent*/ 2));
346 layers.emplace_back(childLayer(4, /*parent*/ 3));
347
348 lifecycleManager.addLayers(std::move(layers));
349 lifecycleManager.commitChanges();
350 listener->expectLayersAdded({1, 2, 3, 4});
351 listener->expectLayersDestroyed({});
352
353 lifecycleManager.applyTransactions({makeRelative(4, 1)});
354 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
355 lifecycleManager.applyTransactions({setLayer(4, 1)});
356 EXPECT_FALSE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
357
358 lifecycleManager.commitChanges();
359 listener->expectLayersAdded({});
360 listener->expectLayersDestroyed({});
361}
362
363TEST_F(LayerLifecycleManagerTest, canAddBackgroundLayer) {
364 LayerLifecycleManager lifecycleManager;
365 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
366 lifecycleManager.addLifecycleListener(listener);
367
368 std::vector<std::unique_ptr<RequestedLayerState>> layers;
369 layers.emplace_back(rootLayer(1));
370 lifecycleManager.addLayers(std::move(layers));
371
372 std::vector<TransactionState> transactions;
373 transactions.emplace_back();
374 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000375 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000376 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
377 sp<LayerHandle> handle = sp<LayerHandle>::make(1u);
378 transactions.back().states.front().state.surface = handle;
379 lifecycleManager.applyTransactions(transactions);
380
381 auto& managedLayers = lifecycleManager.getLayers();
382 ASSERT_EQ(managedLayers.size(), 2u);
383
384 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
385 lifecycleManager.commitChanges();
Vishnu Naird47bcee2023-02-24 18:08:51 +0000386 auto bgLayerId = LayerCreationArgs::getInternalLayerId(1);
387 listener->expectLayersAdded({1, bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000388 listener->expectLayersDestroyed({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000389 EXPECT_EQ(getRequestedLayerState(lifecycleManager, bgLayerId)->color.a, 0.5_hf);
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000390}
391
392TEST_F(LayerLifecycleManagerTest, canDestroyBackgroundLayer) {
393 LayerLifecycleManager lifecycleManager;
394 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
395 lifecycleManager.addLifecycleListener(listener);
396
397 std::vector<std::unique_ptr<RequestedLayerState>> layers;
398 layers.emplace_back(rootLayer(1));
399 lifecycleManager.addLayers(std::move(layers));
400
401 std::vector<TransactionState> transactions;
402 transactions.emplace_back();
403 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000404 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000405 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
406 sp<LayerHandle> handle = sp<LayerHandle>::make(1u);
407 transactions.back().states.front().state.surface = handle;
408 transactions.emplace_back();
409 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000410 transactions.back().states.front().state.bgColor.a = 0;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000411 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
412 transactions.back().states.front().state.surface = handle;
413
414 lifecycleManager.applyTransactions(transactions);
415
416 ASSERT_EQ(lifecycleManager.getLayers().size(), 1u);
417 ASSERT_EQ(lifecycleManager.getDestroyedLayers().size(), 1u);
418
419 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
420 lifecycleManager.commitChanges();
Vishnu Naird47bcee2023-02-24 18:08:51 +0000421 auto bgLayerId = LayerCreationArgs::getInternalLayerId(1);
422 listener->expectLayersAdded({1, bgLayerId});
423 listener->expectLayersDestroyed({bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000424}
425
426TEST_F(LayerLifecycleManagerTest, onParentDestroyDestroysBackgroundLayer) {
427 LayerLifecycleManager lifecycleManager;
428 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
429 lifecycleManager.addLifecycleListener(listener);
430
431 std::vector<std::unique_ptr<RequestedLayerState>> layers;
432 layers.emplace_back(rootLayer(1));
433 lifecycleManager.addLayers(std::move(layers));
434
435 std::vector<TransactionState> transactions;
436 transactions.emplace_back();
437 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000438 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000439 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
440 sp<LayerHandle> handle = sp<LayerHandle>::make(1u);
441 transactions.back().states.front().state.surface = handle;
442 transactions.emplace_back();
443 lifecycleManager.applyTransactions(transactions);
444 lifecycleManager.onHandlesDestroyed({1});
445
446 ASSERT_EQ(lifecycleManager.getLayers().size(), 0u);
447 ASSERT_EQ(lifecycleManager.getDestroyedLayers().size(), 2u);
448
449 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
450 lifecycleManager.commitChanges();
Vishnu Naird47bcee2023-02-24 18:08:51 +0000451 auto bgLayerId = LayerCreationArgs::getInternalLayerId(1);
452 listener->expectLayersAdded({1, bgLayerId});
453 listener->expectLayersDestroyed({1, bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000454}
455
456} // namespace android::surfaceflinger::frontend