blob: 158db752f4e75372336b0e6fe6e3bc6c7e91346c [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
Vishnu Nair2662ebb2023-08-31 23:20:46 +000020#include <renderengine/mock/FakeExternalTexture.h>
21
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000022#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair1391de22023-03-05 19:56:14 -080023#include "LayerHierarchyTest.h"
24#include "TransactionState.h"
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000025
26using namespace android::surfaceflinger;
27
28namespace android::surfaceflinger::frontend {
29
Vishnu Nair2662ebb2023-08-31 23:20:46 +000030using namespace ftl::flag_operators;
31
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000032// To run test:
33/**
34 mp :libsurfaceflinger_unittest && adb sync; adb shell \
35 /data/nativetest/libsurfaceflinger_unittest/libsurfaceflinger_unittest \
36 --gtest_filter="LayerLifecycleManagerTest.*" --gtest_repeat=100 \
37 --gtest_shuffle \
38 --gtest_brief=1
39*/
40class ExpectLayerLifecycleListener : public LayerLifecycleManager::ILifecycleListener {
41public:
42 void onLayerAdded(const RequestedLayerState& layer) override {
Vishnu Nair150065b2023-04-17 19:14:11 -070043 mActualLayersAdded.push_back(layer.id);
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000044 };
45 void onLayerDestroyed(const RequestedLayerState& layer) override {
46 mActualLayersDestroyed.emplace(layer.id);
47 };
48
Vishnu Nair150065b2023-04-17 19:14:11 -070049 void expectLayersAdded(const std::vector<uint32_t>& expectedLayersAdded) {
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000050 EXPECT_EQ(expectedLayersAdded, mActualLayersAdded);
51 mActualLayersAdded.clear();
52 }
53 void expectLayersDestroyed(const std::unordered_set<uint32_t>& expectedLayersDestroyed) {
54 EXPECT_EQ(expectedLayersDestroyed, mActualLayersDestroyed);
55 mActualLayersDestroyed.clear();
56 }
57
Vishnu Nair150065b2023-04-17 19:14:11 -070058 std::vector<uint32_t> mActualLayersAdded;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000059 std::unordered_set<uint32_t> mActualLayersDestroyed;
60};
61
Vishnu Nair1391de22023-03-05 19:56:14 -080062class LayerLifecycleManagerTest : public LayerHierarchyTestBase {
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000063protected:
64 std::unique_ptr<RequestedLayerState> rootLayer(uint32_t id) {
Vishnu Nair1391de22023-03-05 19:56:14 -080065 return std::make_unique<RequestedLayerState>(createArgs(/*id=*/id, /*canBeRoot=*/true,
66 /*parent=*/UNASSIGNED_LAYER_ID,
67 /*mirror=*/UNASSIGNED_LAYER_ID));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000068 }
69
70 std::unique_ptr<RequestedLayerState> childLayer(uint32_t id, uint32_t parentId) {
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000071 return std::make_unique<RequestedLayerState>(createArgs(/*id=*/id, /*canBeRoot=*/false,
Vishnu Nair1391de22023-03-05 19:56:14 -080072 parentId,
73 /*mirror=*/UNASSIGNED_LAYER_ID));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000074 }
75
76 RequestedLayerState* getRequestedLayerState(LayerLifecycleManager& lifecycleManager,
77 uint32_t layerId) {
78 return lifecycleManager.getLayerFromId(layerId);
79 }
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000080};
81
82TEST_F(LayerLifecycleManagerTest, addLayers) {
83 LayerLifecycleManager lifecycleManager;
84 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
85 lifecycleManager.addLifecycleListener(listener);
86 std::vector<std::unique_ptr<RequestedLayerState>> layers;
87 layers.emplace_back(rootLayer(1));
88 layers.emplace_back(rootLayer(2));
89 layers.emplace_back(rootLayer(3));
90 lifecycleManager.addLayers(std::move(layers));
Vishnu Nair606d9d02023-08-19 14:20:18 -070091 lifecycleManager.onHandlesDestroyed({{1, "1"}, {2, "2"}, {3, "3"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +000092 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
93 lifecycleManager.commitChanges();
94 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
95 listener->expectLayersAdded({1, 2, 3});
96 listener->expectLayersDestroyed({1, 2, 3});
97}
98
99TEST_F(LayerLifecycleManagerTest, updateLayerStates) {
100 LayerLifecycleManager lifecycleManager;
101 std::vector<std::unique_ptr<RequestedLayerState>> layers;
102 layers.emplace_back(rootLayer(1));
103 lifecycleManager.addLayers(std::move(layers));
Vishnu Nair1391de22023-03-05 19:56:14 -0800104 lifecycleManager.applyTransactions(setZTransaction(1, 2));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000105
106 auto& managedLayers = lifecycleManager.getLayers();
107 ASSERT_EQ(managedLayers.size(), 1u);
108
109 EXPECT_EQ(managedLayers.front()->z, 2);
110 EXPECT_TRUE(managedLayers.front()->changes.test(RequestedLayerState::Changes::Z));
111
112 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
113 lifecycleManager.commitChanges();
114 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
115 ASSERT_EQ(managedLayers.size(), 1u);
116 EXPECT_FALSE(managedLayers.front()->changes.test(RequestedLayerState::Changes::Z));
117
118 // apply transactions that do not affect the hierarchy
Vishnu Nair1391de22023-03-05 19:56:14 -0800119 std::vector<TransactionState> transactions;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000120 transactions.emplace_back();
121 transactions.back().states.push_back({});
122 transactions.back().states.front().state.backgroundBlurRadius = 22;
123 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800124 transactions.back().states.front().layerId = 1;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000125 lifecycleManager.applyTransactions(transactions);
126 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
127 lifecycleManager.commitChanges();
128 EXPECT_FALSE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
129 EXPECT_EQ(managedLayers.front()->backgroundBlurRadius, 22u);
130}
131
132TEST_F(LayerLifecycleManagerTest, layerWithoutHandleIsDestroyed) {
133 LayerLifecycleManager lifecycleManager;
134 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
135 lifecycleManager.addLifecycleListener(listener);
136 std::vector<std::unique_ptr<RequestedLayerState>> layers;
137 layers.emplace_back(rootLayer(1));
138 layers.emplace_back(rootLayer(2));
139 lifecycleManager.addLayers(std::move(layers));
Vishnu Nair606d9d02023-08-19 14:20:18 -0700140 lifecycleManager.onHandlesDestroyed({{1, "1"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000141 lifecycleManager.commitChanges();
142
143 SCOPED_TRACE("layerWithoutHandleIsDestroyed");
144 listener->expectLayersAdded({1, 2});
145 listener->expectLayersDestroyed({1});
146}
147
148TEST_F(LayerLifecycleManagerTest, rootLayerWithoutHandleIsDestroyed) {
149 LayerLifecycleManager lifecycleManager;
150 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
151 lifecycleManager.addLifecycleListener(listener);
152 std::vector<std::unique_ptr<RequestedLayerState>> layers;
153 layers.emplace_back(rootLayer(1));
154 layers.emplace_back(rootLayer(2));
155 lifecycleManager.addLayers(std::move(layers));
Vishnu Nair606d9d02023-08-19 14:20:18 -0700156 lifecycleManager.onHandlesDestroyed({{1, "1"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000157 lifecycleManager.commitChanges();
158 listener->expectLayersAdded({1, 2});
159 listener->expectLayersDestroyed({1});
160}
161
162TEST_F(LayerLifecycleManagerTest, offscreenLayerIsDestroyed) {
163 LayerLifecycleManager lifecycleManager;
164 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
165 lifecycleManager.addLifecycleListener(listener);
166 std::vector<std::unique_ptr<RequestedLayerState>> layers;
167 layers.emplace_back(rootLayer(1));
168 layers.emplace_back(rootLayer(2));
169 layers.emplace_back(childLayer(3, /*parent*/ 2));
170 lifecycleManager.addLayers(std::move(layers));
171 lifecycleManager.commitChanges();
172 listener->expectLayersAdded({1, 2, 3});
173 listener->expectLayersDestroyed({});
174
Vishnu Nair1391de22023-03-05 19:56:14 -0800175 lifecycleManager.applyTransactions(reparentLayerTransaction(3, UNASSIGNED_LAYER_ID));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000176 lifecycleManager.commitChanges();
177 listener->expectLayersAdded({});
178 listener->expectLayersDestroyed({});
179
Vishnu Nair606d9d02023-08-19 14:20:18 -0700180 lifecycleManager.onHandlesDestroyed({{3, "3"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000181 lifecycleManager.commitChanges();
182 listener->expectLayersAdded({});
183 listener->expectLayersDestroyed({3});
184}
185
186TEST_F(LayerLifecycleManagerTest, offscreenChildLayerWithHandleIsNotDestroyed) {
187 LayerLifecycleManager lifecycleManager;
188 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
189 lifecycleManager.addLifecycleListener(listener);
190 std::vector<std::unique_ptr<RequestedLayerState>> layers;
191 layers.emplace_back(rootLayer(1));
192 layers.emplace_back(rootLayer(2));
193 layers.emplace_back(childLayer(3, /*parent*/ 2));
194 layers.emplace_back(childLayer(4, /*parent*/ 3));
195 lifecycleManager.addLayers(std::move(layers));
196 lifecycleManager.commitChanges();
197 listener->expectLayersAdded({1, 2, 3, 4});
198 listener->expectLayersDestroyed({});
199
Vishnu Nair1391de22023-03-05 19:56:14 -0800200 lifecycleManager.applyTransactions(reparentLayerTransaction(3, UNASSIGNED_LAYER_ID));
Vishnu Nair606d9d02023-08-19 14:20:18 -0700201 lifecycleManager.onHandlesDestroyed({{3, "3"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000202 lifecycleManager.commitChanges();
203 listener->expectLayersAdded({});
204 listener->expectLayersDestroyed({3});
205}
206
207TEST_F(LayerLifecycleManagerTest, offscreenChildLayerWithoutHandleIsDestroyed) {
208 LayerLifecycleManager lifecycleManager;
209 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
210 lifecycleManager.addLifecycleListener(listener);
211 std::vector<std::unique_ptr<RequestedLayerState>> layers;
212 layers.emplace_back(rootLayer(1));
213 layers.emplace_back(rootLayer(2));
214 layers.emplace_back(childLayer(3, /*parent*/ 2));
215 layers.emplace_back(childLayer(4, /*parent*/ 3));
216 lifecycleManager.addLayers(std::move(layers));
217 lifecycleManager.commitChanges();
218 listener->expectLayersAdded({1, 2, 3, 4});
219 listener->expectLayersDestroyed({});
220
Vishnu Nair1391de22023-03-05 19:56:14 -0800221 lifecycleManager.applyTransactions(reparentLayerTransaction(3, UNASSIGNED_LAYER_ID));
Vishnu Nair606d9d02023-08-19 14:20:18 -0700222 lifecycleManager.onHandlesDestroyed({{3, "3"}, {4, "4"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000223 lifecycleManager.commitChanges();
224 listener->expectLayersAdded({});
225 listener->expectLayersDestroyed({3, 4});
226}
227
228TEST_F(LayerLifecycleManagerTest, reparentingDoesNotAffectRelativeZ) {
229 LayerLifecycleManager lifecycleManager;
230 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
231 lifecycleManager.addLifecycleListener(listener);
232 std::vector<std::unique_ptr<RequestedLayerState>> layers;
233 layers.emplace_back(rootLayer(1));
234 layers.emplace_back(rootLayer(2));
235 layers.emplace_back(childLayer(3, /*parent*/ 2));
236 layers.emplace_back(childLayer(4, /*parent*/ 3));
237
238 lifecycleManager.addLayers(std::move(layers));
239 lifecycleManager.commitChanges();
240 listener->expectLayersAdded({1, 2, 3, 4});
241 listener->expectLayersDestroyed({});
242
Vishnu Nair1391de22023-03-05 19:56:14 -0800243 lifecycleManager.applyTransactions(relativeLayerTransaction(4, 1));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000244 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
Vishnu Nair1391de22023-03-05 19:56:14 -0800245 lifecycleManager.applyTransactions(reparentLayerTransaction(4, 2));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000246 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
247
248 lifecycleManager.commitChanges();
249 listener->expectLayersAdded({});
250 listener->expectLayersDestroyed({});
251}
252
253TEST_F(LayerLifecycleManagerTest, reparentingToNullRemovesRelativeZ) {
254 LayerLifecycleManager lifecycleManager;
255 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
256 lifecycleManager.addLifecycleListener(listener);
257 std::vector<std::unique_ptr<RequestedLayerState>> layers;
258 layers.emplace_back(rootLayer(1));
259 layers.emplace_back(rootLayer(2));
260 layers.emplace_back(childLayer(3, /*parent*/ 2));
261 layers.emplace_back(childLayer(4, /*parent*/ 3));
262
263 lifecycleManager.addLayers(std::move(layers));
264 lifecycleManager.commitChanges();
265 listener->expectLayersAdded({1, 2, 3, 4});
266 listener->expectLayersDestroyed({});
267
Vishnu Nair1391de22023-03-05 19:56:14 -0800268 lifecycleManager.applyTransactions(relativeLayerTransaction(4, 1));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000269 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
Vishnu Nair1391de22023-03-05 19:56:14 -0800270 lifecycleManager.applyTransactions(reparentLayerTransaction(4, UNASSIGNED_LAYER_ID));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000271 EXPECT_FALSE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
272
273 lifecycleManager.commitChanges();
274 listener->expectLayersAdded({});
275 listener->expectLayersDestroyed({});
276}
277
278TEST_F(LayerLifecycleManagerTest, setZRemovesRelativeZ) {
279 LayerLifecycleManager lifecycleManager;
280 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
281 lifecycleManager.addLifecycleListener(listener);
282 std::vector<std::unique_ptr<RequestedLayerState>> layers;
283 layers.emplace_back(rootLayer(1));
284 layers.emplace_back(rootLayer(2));
285 layers.emplace_back(childLayer(3, /*parent*/ 2));
286 layers.emplace_back(childLayer(4, /*parent*/ 3));
287
288 lifecycleManager.addLayers(std::move(layers));
289 lifecycleManager.commitChanges();
290 listener->expectLayersAdded({1, 2, 3, 4});
291 listener->expectLayersDestroyed({});
292
Vishnu Nair1391de22023-03-05 19:56:14 -0800293 lifecycleManager.applyTransactions(relativeLayerTransaction(4, 1));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000294 EXPECT_TRUE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
Vishnu Nair1391de22023-03-05 19:56:14 -0800295 lifecycleManager.applyTransactions(setZTransaction(4, 1));
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000296 EXPECT_FALSE(getRequestedLayerState(lifecycleManager, 4)->isRelativeOf);
297
298 lifecycleManager.commitChanges();
299 listener->expectLayersAdded({});
300 listener->expectLayersDestroyed({});
301}
302
303TEST_F(LayerLifecycleManagerTest, canAddBackgroundLayer) {
304 LayerLifecycleManager lifecycleManager;
305 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
306 lifecycleManager.addLifecycleListener(listener);
307
308 std::vector<std::unique_ptr<RequestedLayerState>> layers;
309 layers.emplace_back(rootLayer(1));
310 lifecycleManager.addLayers(std::move(layers));
311
312 std::vector<TransactionState> transactions;
313 transactions.emplace_back();
314 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000315 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000316 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800317 transactions.back().states.front().layerId = 1;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000318 lifecycleManager.applyTransactions(transactions);
319
320 auto& managedLayers = lifecycleManager.getLayers();
321 ASSERT_EQ(managedLayers.size(), 2u);
322
323 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
324 lifecycleManager.commitChanges();
Vishnu Nair150065b2023-04-17 19:14:11 -0700325 ASSERT_EQ(listener->mActualLayersAdded.size(), 2u);
326 auto bgLayerId = listener->mActualLayersAdded[1];
Vishnu Naird47bcee2023-02-24 18:08:51 +0000327 listener->expectLayersAdded({1, bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000328 listener->expectLayersDestroyed({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000329 EXPECT_EQ(getRequestedLayerState(lifecycleManager, bgLayerId)->color.a, 0.5_hf);
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000330}
331
332TEST_F(LayerLifecycleManagerTest, canDestroyBackgroundLayer) {
333 LayerLifecycleManager lifecycleManager;
334 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
335 lifecycleManager.addLifecycleListener(listener);
336
337 std::vector<std::unique_ptr<RequestedLayerState>> layers;
338 layers.emplace_back(rootLayer(1));
339 lifecycleManager.addLayers(std::move(layers));
340
341 std::vector<TransactionState> transactions;
342 transactions.emplace_back();
343 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000344 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000345 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800346 transactions.back().states.front().layerId = 1;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000347 transactions.emplace_back();
348 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000349 transactions.back().states.front().state.bgColor.a = 0;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000350 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800351 transactions.back().states.front().layerId = 1;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000352
353 lifecycleManager.applyTransactions(transactions);
354
355 ASSERT_EQ(lifecycleManager.getLayers().size(), 1u);
356 ASSERT_EQ(lifecycleManager.getDestroyedLayers().size(), 1u);
357
358 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
359 lifecycleManager.commitChanges();
Vishnu Nair150065b2023-04-17 19:14:11 -0700360 ASSERT_EQ(listener->mActualLayersAdded.size(), 2u);
361 auto bgLayerId = listener->mActualLayersAdded[1];
Vishnu Naird47bcee2023-02-24 18:08:51 +0000362 listener->expectLayersAdded({1, bgLayerId});
363 listener->expectLayersDestroyed({bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000364}
365
366TEST_F(LayerLifecycleManagerTest, onParentDestroyDestroysBackgroundLayer) {
367 LayerLifecycleManager lifecycleManager;
368 auto listener = std::make_shared<ExpectLayerLifecycleListener>();
369 lifecycleManager.addLifecycleListener(listener);
370
371 std::vector<std::unique_ptr<RequestedLayerState>> layers;
372 layers.emplace_back(rootLayer(1));
373 lifecycleManager.addLayers(std::move(layers));
374
375 std::vector<TransactionState> transactions;
376 transactions.emplace_back();
377 transactions.back().states.push_back({});
Vishnu Naird47bcee2023-02-24 18:08:51 +0000378 transactions.back().states.front().state.bgColor.a = 0.5;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000379 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800380 transactions.back().states.front().layerId = 1;
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000381 transactions.emplace_back();
382 lifecycleManager.applyTransactions(transactions);
Vishnu Nair606d9d02023-08-19 14:20:18 -0700383 lifecycleManager.onHandlesDestroyed({{1, "1"}});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000384
385 ASSERT_EQ(lifecycleManager.getLayers().size(), 0u);
386 ASSERT_EQ(lifecycleManager.getDestroyedLayers().size(), 2u);
387
388 EXPECT_TRUE(lifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
389 lifecycleManager.commitChanges();
Vishnu Nair150065b2023-04-17 19:14:11 -0700390 ASSERT_EQ(listener->mActualLayersAdded.size(), 2u);
391 auto bgLayerId = listener->mActualLayersAdded[1];
Vishnu Naird47bcee2023-02-24 18:08:51 +0000392 listener->expectLayersAdded({1, bgLayerId});
393 listener->expectLayersDestroyed({1, bgLayerId});
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000394}
395
Vishnu Nair854ce1c2023-08-19 15:00:13 -0700396TEST_F(LayerLifecycleManagerTest, blurSetsVisibilityChangeFlag) {
397 // clear default color on layer so we start with a layer that does not draw anything.
398 setColor(1, {-1.f, -1.f, -1.f});
399 mLifecycleManager.commitChanges();
400
401 // layer has something to draw
402 setBackgroundBlurRadius(1, 2);
403 EXPECT_TRUE(
404 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
405 mLifecycleManager.commitChanges();
406
407 // layer still has something to draw, so visibility shouldn't change
408 setBackgroundBlurRadius(1, 3);
409 EXPECT_FALSE(
410 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
411 mLifecycleManager.commitChanges();
412
413 // layer has nothing to draw
414 setBackgroundBlurRadius(1, 0);
415 EXPECT_TRUE(
416 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
417 mLifecycleManager.commitChanges();
418}
419
420TEST_F(LayerLifecycleManagerTest, colorSetsVisibilityChangeFlag) {
421 // clear default color on layer so we start with a layer that does not draw anything.
422 setColor(1, {-1.f, -1.f, -1.f});
423 mLifecycleManager.commitChanges();
424
425 // layer has something to draw
426 setColor(1, {2.f, 3.f, 4.f});
427 EXPECT_TRUE(
428 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
429 mLifecycleManager.commitChanges();
430
431 // layer still has something to draw, so visibility shouldn't change
432 setColor(1, {0.f, 0.f, 0.f});
433 EXPECT_FALSE(
434 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
435 mLifecycleManager.commitChanges();
436
437 // layer has nothing to draw
438 setColor(1, {-1.f, -1.f, -1.f});
439 EXPECT_TRUE(
440 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
441 mLifecycleManager.commitChanges();
442}
443
Vishnu Nair2662ebb2023-08-31 23:20:46 +0000444TEST_F(LayerLifecycleManagerTest, layerOpacityChangesSetsVisibilityChangeFlag) {
445 // add a default buffer and make the layer opaque
446 setFlags(1, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque);
447 setBuffer(1,
448 std::make_shared<
449 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
450 1ULL /* bufferId */,
451 HAL_PIXEL_FORMAT_RGBA_8888,
452 GRALLOC_USAGE_PROTECTED /*usage*/));
453
454 mLifecycleManager.commitChanges();
455
456 // set new buffer but layer opacity doesn't change
457 setBuffer(1,
458 std::make_shared<
459 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
460 2ULL /* bufferId */,
461 HAL_PIXEL_FORMAT_RGBA_8888,
462 GRALLOC_USAGE_PROTECTED /*usage*/));
463 EXPECT_EQ(mLifecycleManager.getGlobalChanges().get(),
Vishnu Nairdf59f472024-05-17 16:51:33 +0000464 ftl::Flags<RequestedLayerState::Changes>(
465 RequestedLayerState::Changes::Buffer | RequestedLayerState::Changes::Content |
466 RequestedLayerState::Changes::RequiresComposition)
Vishnu Nair2662ebb2023-08-31 23:20:46 +0000467 .get());
468 mLifecycleManager.commitChanges();
469
470 // change layer flags and confirm visibility flag is set
471 setFlags(1, layer_state_t::eLayerOpaque, 0);
472 EXPECT_TRUE(
473 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
474 mLifecycleManager.commitChanges();
475}
476
477TEST_F(LayerLifecycleManagerTest, bufferFormatChangesSetsVisibilityChangeFlag) {
478 // add a default buffer and make the layer opaque
479 setFlags(1, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque);
480 setBuffer(1,
481 std::make_shared<
482 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
483 1ULL /* bufferId */,
484 HAL_PIXEL_FORMAT_RGBA_8888,
485 GRALLOC_USAGE_PROTECTED /*usage*/));
486
487 mLifecycleManager.commitChanges();
488
489 // set new buffer with an opaque buffer format
490 setBuffer(1,
491 std::make_shared<
492 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
493 2ULL /* bufferId */,
494 HAL_PIXEL_FORMAT_RGB_888,
495 GRALLOC_USAGE_PROTECTED /*usage*/));
496 EXPECT_EQ(mLifecycleManager.getGlobalChanges().get(),
Vishnu Nairdf59f472024-05-17 16:51:33 +0000497 ftl::Flags<RequestedLayerState::Changes>(
498 RequestedLayerState::Changes::Buffer | RequestedLayerState::Changes::Content |
499 RequestedLayerState::Changes::VisibleRegion |
500 RequestedLayerState::Changes::Visibility |
501 RequestedLayerState::Changes::RequiresComposition)
Vishnu Nair2662ebb2023-08-31 23:20:46 +0000502 .get());
503 mLifecycleManager.commitChanges();
504}
505
506TEST_F(LayerLifecycleManagerTest, roundedCornerChangesSetsVisibilityChangeFlag) {
507 // add a default buffer and make the layer opaque
508 setFlags(1, layer_state_t::eLayerOpaque, layer_state_t::eLayerOpaque);
509 setBuffer(1,
510 std::make_shared<
511 renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/,
512 1ULL /* bufferId */,
513 HAL_PIXEL_FORMAT_RGBA_8888,
514 GRALLOC_USAGE_PROTECTED /*usage*/));
515
516 mLifecycleManager.commitChanges();
517
518 // add rounded corners which should make the layer translucent
519 setRoundedCorners(1, 5.f);
520 EXPECT_EQ(mLifecycleManager.getGlobalChanges().get(),
521 ftl::Flags<RequestedLayerState::Changes>(
522 RequestedLayerState::Changes::AffectsChildren |
523 RequestedLayerState::Changes::Content |
524 RequestedLayerState::Changes::Geometry |
Vishnu Nairdf59f472024-05-17 16:51:33 +0000525 RequestedLayerState::Changes::VisibleRegion |
526 RequestedLayerState::Changes::RequiresComposition)
Vishnu Nair2662ebb2023-08-31 23:20:46 +0000527 .get());
528 mLifecycleManager.commitChanges();
529}
530
Vishnu Nair93e26b92023-10-16 21:36:51 -0700531// Even when it does not change visible region, we should mark alpha changes as affecting
532// visible region because HWC impl depends on it. writeOutputIndependentGeometryStateToHWC
533// is only called if we are updating geometry.
534TEST_F(LayerLifecycleManagerTest, alphaChangesAlwaysSetsVisibleRegionFlag) {
535 mLifecycleManager.commitChanges();
536 float startingAlpha = 0.5f;
537 setAlpha(1, startingAlpha);
538
539 // this is expected because layer alpha changes from 1 to 0.5, it may no longer be opaque
540 EXPECT_EQ(mLifecycleManager.getGlobalChanges().string(),
541 ftl::Flags<RequestedLayerState::Changes>(
542 RequestedLayerState::Changes::Content |
543 RequestedLayerState::Changes::AffectsChildren |
Vishnu Nairdf59f472024-05-17 16:51:33 +0000544 RequestedLayerState::Changes::VisibleRegion |
545 RequestedLayerState::Changes::RequiresComposition)
Vishnu Nair93e26b92023-10-16 21:36:51 -0700546 .string());
547 EXPECT_EQ(mLifecycleManager.getChangedLayers()[0]->color.a, static_cast<half>(startingAlpha));
548 mLifecycleManager.commitChanges();
549
550 float endingAlpha = 0.2f;
551 setAlpha(1, endingAlpha);
552
553 // this is not expected but we should make sure this behavior does not change
554 EXPECT_EQ(mLifecycleManager.getGlobalChanges().string(),
555 ftl::Flags<RequestedLayerState::Changes>(
556 RequestedLayerState::Changes::Content |
557 RequestedLayerState::Changes::AffectsChildren |
Vishnu Nairdf59f472024-05-17 16:51:33 +0000558 RequestedLayerState::Changes::VisibleRegion |
559 RequestedLayerState::Changes::RequiresComposition)
Vishnu Nair93e26b92023-10-16 21:36:51 -0700560 .string());
561 EXPECT_EQ(mLifecycleManager.getChangedLayers()[0]->color.a, static_cast<half>(endingAlpha));
562 mLifecycleManager.commitChanges();
563
564 EXPECT_EQ(mLifecycleManager.getGlobalChanges().string(),
565 ftl::Flags<RequestedLayerState::Changes>().string());
566}
567
Patrick Williamsd8edec02024-03-11 18:14:48 -0500568TEST_F(LayerLifecycleManagerTest, layerSecureChangesSetsVisibilityChangeFlag) {
569 // add a default buffer and make the layer secure
570 setFlags(1, layer_state_t::eLayerSecure, layer_state_t::eLayerSecure);
571 setBuffer(1,
572 std::make_shared<renderengine::mock::
573 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
574 1ULL /* bufferId */,
575 HAL_PIXEL_FORMAT_RGBA_8888,
576 GRALLOC_USAGE_SW_READ_NEVER /*usage*/));
577
578 mLifecycleManager.commitChanges();
579
580 // set new buffer but layer secure doesn't change
581 setBuffer(1,
582 std::make_shared<renderengine::mock::
583 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
584 2ULL /* bufferId */,
585 HAL_PIXEL_FORMAT_RGBA_8888,
586 GRALLOC_USAGE_SW_READ_NEVER /*usage*/));
587 EXPECT_EQ(mLifecycleManager.getGlobalChanges().get(),
Vishnu Nairdf59f472024-05-17 16:51:33 +0000588 ftl::Flags<RequestedLayerState::Changes>(
589 RequestedLayerState::Changes::Buffer | RequestedLayerState::Changes::Content |
590 RequestedLayerState::Changes::RequiresComposition)
Patrick Williamsd8edec02024-03-11 18:14:48 -0500591 .get());
592 mLifecycleManager.commitChanges();
593
594 // change layer flags and confirm visibility flag is set
595 setFlags(1, layer_state_t::eLayerSecure, 0);
596 EXPECT_TRUE(
597 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Visibility));
598 mLifecycleManager.commitChanges();
599}
600
Vishnu Nairdc4d31b2022-11-17 03:20:58 +0000601} // namespace android::surfaceflinger::frontend