blob: 48f8923415c296d5d5c0cf6aa10f9b08ac771335 [file] [log] [blame]
Vishnu Nair8fc721b2022-12-22 20:06:32 +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 Nair0808ae62023-08-07 21:42:42 -070020#include <gui/fake/BufferData.h>
Vishnu Nair47b7bb42023-09-29 16:27:33 -070021#include <renderengine/mock/FakeExternalTexture.h>
Vishnu Naird9e4f462023-10-06 04:05:45 +000022#include <ui/ShadowSettings.h>
Vishnu Nair0808ae62023-08-07 21:42:42 -070023
Vishnu Nair1391de22023-03-05 19:56:14 -080024#include "Client.h" // temporarily needed for LayerCreationArgs
25#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000026#include "FrontEnd/LayerHierarchy.h"
27#include "FrontEnd/LayerLifecycleManager.h"
Vishnu Nair47b7bb42023-09-29 16:27:33 -070028#include "FrontEnd/LayerSnapshotBuilder.h"
Vishnu Nair8fc721b2022-12-22 20:06:32 +000029
30namespace android::surfaceflinger::frontend {
31
32class LayerHierarchyTestBase : public testing::Test {
33protected:
34 LayerHierarchyTestBase() {
35 // tree with 3 levels of children
36 // ROOT
37 // ├── 1
38 // │ ├── 11
39 // │ │ └── 111
40 // │ ├── 12
41 // │ │ ├── 121
42 // │ │ └── 122
43 // │ │ └── 1221
44 // │ └── 13
45 // └── 2
46
47 createRootLayer(1);
48 createRootLayer(2);
49 createLayer(11, 1);
50 createLayer(12, 1);
51 createLayer(13, 1);
52 createLayer(111, 11);
53 createLayer(121, 12);
54 createLayer(122, 12);
55 createLayer(1221, 122);
56 }
57
Vishnu Nair1391de22023-03-05 19:56:14 -080058 LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, uint32_t parentId,
59 uint32_t layerIdToMirror) {
60 LayerCreationArgs args(std::make_optional(id));
61 args.name = "testlayer";
Vishnu Nair8fc721b2022-12-22 20:06:32 +000062 args.addToRoot = canBeRoot;
Vishnu Nair1391de22023-03-05 19:56:14 -080063 args.parentId = parentId;
64 args.layerIdToMirror = layerIdToMirror;
Vishnu Nair8fc721b2022-12-22 20:06:32 +000065 return args;
66 }
67
Vishnu Nair1391de22023-03-05 19:56:14 -080068 LayerCreationArgs createDisplayMirrorArgs(uint32_t id, ui::LayerStack layerStackToMirror) {
69 LayerCreationArgs args(std::make_optional(id));
70 args.name = "testlayer";
Vishnu Naira9c43762023-01-27 19:10:25 +000071 args.addToRoot = true;
Vishnu Nair1391de22023-03-05 19:56:14 -080072 args.layerStackToMirror = layerStackToMirror;
Vishnu Naira9c43762023-01-27 19:10:25 +000073 return args;
74 }
75
Vishnu Nair8fc721b2022-12-22 20:06:32 +000076 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
77 std::vector<uint32_t> layerIds;
78 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
79 const LayerHierarchy::TraversalPath&) -> bool {
80 layerIds.emplace_back(hierarchy.getLayer()->id);
81 return true;
82 });
83 return layerIds;
84 }
85
86 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
87 std::vector<uint32_t> layerIds;
88 hierarchy.traverseInZOrder(
89 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
90 const LayerHierarchy::TraversalPath&) -> bool {
91 layerIds.emplace_back(hierarchy.getLayer()->id);
92 return true;
93 });
94 return layerIds;
95 }
96
97 virtual void createRootLayer(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +000098 std::vector<std::unique_ptr<RequestedLayerState>> layers;
99 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800100 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
101 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000102 mLifecycleManager.addLayers(std::move(layers));
103 }
104
Vishnu Naira9c43762023-01-27 19:10:25 +0000105 void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
Vishnu Naira9c43762023-01-27 19:10:25 +0000106 std::vector<std::unique_ptr<RequestedLayerState>> layers;
107 layers.emplace_back(std::make_unique<RequestedLayerState>(
108 createDisplayMirrorArgs(/*id=*/id, layerStack)));
109 mLifecycleManager.addLayers(std::move(layers));
110 }
111
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000112 virtual void createLayer(uint32_t id, uint32_t parentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000113 std::vector<std::unique_ptr<RequestedLayerState>> layers;
114 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800115 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
116 /*mirror=*/UNASSIGNED_LAYER_ID)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000117 mLifecycleManager.addLayers(std::move(layers));
118 }
119
Vishnu Nair1391de22023-03-05 19:56:14 -0800120 std::vector<TransactionState> reparentLayerTransaction(uint32_t id, uint32_t newParentId) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000121 std::vector<TransactionState> transactions;
122 transactions.emplace_back();
123 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800124 transactions.back().states.front().parentId = newParentId;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000125 transactions.back().states.front().state.what = layer_state_t::eReparent;
Vishnu Nair1391de22023-03-05 19:56:14 -0800126 transactions.back().states.front().relativeParentId = UNASSIGNED_LAYER_ID;
127 transactions.back().states.front().layerId = id;
128 return transactions;
129 }
130
131 void reparentLayer(uint32_t id, uint32_t newParentId) {
132 mLifecycleManager.applyTransactions(reparentLayerTransaction(id, newParentId));
133 }
134
135 std::vector<TransactionState> relativeLayerTransaction(uint32_t id, uint32_t relativeParentId) {
136 std::vector<TransactionState> transactions;
137 transactions.emplace_back();
138 transactions.back().states.push_back({});
139 transactions.back().states.front().relativeParentId = relativeParentId;
140 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
141 transactions.back().states.front().layerId = id;
142 return transactions;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000143 }
144
145 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
Vishnu Nair1391de22023-03-05 19:56:14 -0800146 mLifecycleManager.applyTransactions(relativeLayerTransaction(id, relativeParentId));
147 }
148
149 void removeRelativeZ(uint32_t id) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000150 std::vector<TransactionState> transactions;
151 transactions.emplace_back();
152 transactions.back().states.push_back({});
Vishnu Nair1391de22023-03-05 19:56:14 -0800153 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
154 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000155 mLifecycleManager.applyTransactions(transactions);
156 }
157
Vishnu Nair1391de22023-03-05 19:56:14 -0800158 virtual void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000159 std::vector<std::unique_ptr<RequestedLayerState>> layers;
160 layers.emplace_back(std::make_unique<RequestedLayerState>(
Vishnu Nair1391de22023-03-05 19:56:14 -0800161 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
162 /*mirror=*/layerIdToMirror)));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000163 mLifecycleManager.addLayers(std::move(layers));
164 }
165
166 void updateBackgroundColor(uint32_t id, half alpha) {
167 std::vector<TransactionState> transactions;
168 transactions.emplace_back();
169 transactions.back().states.push_back({});
170 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000171 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair1391de22023-03-05 19:56:14 -0800172 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000173 mLifecycleManager.applyTransactions(transactions);
174 }
175
Vishnu Nair606d9d02023-08-19 14:20:18 -0700176 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({{id, "test"}}); }
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000177
178 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
179 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
180 hierarchyBuilder.update(mLifecycleManager.getLayers(),
181 mLifecycleManager.getDestroyedLayers());
182 }
183 mLifecycleManager.commitChanges();
184
185 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
186 LayerHierarchyBuilder newBuilder(mLifecycleManager.getLayers());
187 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
188 getTraversalPath(newBuilder.getHierarchy()));
189 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
190 getTraversalPathInZOrder(newBuilder.getHierarchy()));
191 EXPECT_FALSE(
192 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
193 }
194
Vishnu Nair1391de22023-03-05 19:56:14 -0800195 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000196 std::vector<TransactionState> transactions;
197 transactions.emplace_back();
198 transactions.back().states.push_back({});
199
200 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800201 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000202 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800203 return transactions;
204 }
205
206 void setZ(uint32_t id, int32_t z) {
207 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000208 }
209
210 void setCrop(uint32_t id, const Rect& crop) {
211 std::vector<TransactionState> transactions;
212 transactions.emplace_back();
213 transactions.back().states.push_back({});
214
215 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800216 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000217 transactions.back().states.front().state.crop = crop;
218 mLifecycleManager.applyTransactions(transactions);
219 }
220
221 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
222 std::vector<TransactionState> transactions;
223 transactions.emplace_back();
224 transactions.back().states.push_back({});
225
226 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
227 transactions.back().states.front().state.flags = flags;
228 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800229 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000230 mLifecycleManager.applyTransactions(transactions);
231 }
232
233 void setAlpha(uint32_t id, float alpha) {
234 std::vector<TransactionState> transactions;
235 transactions.emplace_back();
236 transactions.back().states.push_back({});
237
238 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800239 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000240 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
241 mLifecycleManager.applyTransactions(transactions);
242 }
243
244 void hideLayer(uint32_t id) {
245 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
246 }
247
248 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
249
250 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
251 std::vector<TransactionState> transactions;
252 transactions.emplace_back();
253 transactions.back().states.push_back({});
254 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
255 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800256 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000257 mLifecycleManager.applyTransactions(transactions);
258 }
259
Vishnu Naircfb2d252023-01-19 04:44:02 +0000260 void setLayerStack(uint32_t id, int32_t layerStack) {
261 std::vector<TransactionState> transactions;
262 transactions.emplace_back();
263 transactions.back().states.push_back({});
264
265 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800266 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000267 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
268 mLifecycleManager.applyTransactions(transactions);
269 }
270
Vishnu Nair92990e22023-02-24 20:01:05 +0000271 void setTouchableRegion(uint32_t id, Region region) {
272 std::vector<TransactionState> transactions;
273 transactions.emplace_back();
274 transactions.back().states.push_back({});
275
276 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800277 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000278 transactions.back().states.front().state.windowInfoHandle =
279 sp<gui::WindowInfoHandle>::make();
280 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
281 inputInfo->touchableRegion = region;
282 inputInfo->token = sp<BBinder>::make();
283 mLifecycleManager.applyTransactions(transactions);
284 }
285
Vishnu Nair29354ec2023-03-28 18:51:28 -0700286 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
287 bool replaceTouchableRegionWithCrop) {
288 std::vector<TransactionState> transactions;
289 transactions.emplace_back();
290 transactions.back().states.push_back({});
291
292 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
293 transactions.back().states.front().layerId = id;
294 transactions.back().states.front().state.windowInfoHandle =
295 sp<gui::WindowInfoHandle>::make();
296 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
297 inputInfo->touchableRegion = region;
298 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
299 transactions.back().states.front().touchCropId = touchCropId;
300
301 inputInfo->token = sp<BBinder>::make();
302 mLifecycleManager.applyTransactions(transactions);
303 }
304
Vishnu Nair444f3952023-04-11 13:01:02 -0700305 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
306 std::vector<TransactionState> transactions;
307 transactions.emplace_back();
308 transactions.back().states.push_back({});
309
310 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
311 transactions.back().states.front().layerId = id;
312 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
313 mLifecycleManager.applyTransactions(transactions);
314 }
315
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000316 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
317 std::vector<TransactionState> transactions;
318 transactions.emplace_back();
319 transactions.back().states.push_back({});
320
321 transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
322 transactions.back().states.front().layerId = id;
323 transactions.back().states.front().state.frameRateSelectionPriority = priority;
324 mLifecycleManager.applyTransactions(transactions);
325 }
326
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000327 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
328 int8_t changeFrameRateStrategy) {
329 std::vector<TransactionState> transactions;
330 transactions.emplace_back();
331 transactions.back().states.push_back({});
332
333 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
334 transactions.back().states.front().layerId = id;
335 transactions.back().states.front().state.frameRate = frameRate;
336 transactions.back().states.front().state.frameRateCompatibility = compatibility;
337 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
338 mLifecycleManager.applyTransactions(transactions);
339 }
340
Rachel Leece6e0042023-06-27 11:22:54 -0700341 void setFrameRateCategory(uint32_t id, int8_t frameRateCategory) {
342 std::vector<TransactionState> transactions;
343 transactions.emplace_back();
344 transactions.back().states.push_back({});
345
346 transactions.back().states.front().state.what = layer_state_t::eFrameRateCategoryChanged;
347 transactions.back().states.front().layerId = id;
348 transactions.back().states.front().state.frameRateCategory = frameRateCategory;
349 mLifecycleManager.applyTransactions(transactions);
350 }
351
Rachel Lee58cc90d2023-09-05 18:50:20 -0700352 void setFrameRateSelectionStrategy(uint32_t id, int8_t strategy) {
353 std::vector<TransactionState> transactions;
354 transactions.emplace_back();
355 transactions.back().states.push_back({});
356
357 transactions.back().states.front().state.what =
358 layer_state_t::eFrameRateSelectionStrategyChanged;
359 transactions.back().states.front().layerId = id;
360 transactions.back().states.front().state.frameRateSelectionStrategy = strategy;
361 mLifecycleManager.applyTransactions(transactions);
362 }
363
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700364 void setDefaultFrameRateCompatibility(uint32_t id, int8_t defaultFrameRateCompatibility) {
365 std::vector<TransactionState> transactions;
366 transactions.emplace_back();
367 transactions.back().states.push_back({});
368
369 transactions.back().states.front().state.what =
370 layer_state_t::eDefaultFrameRateCompatibilityChanged;
371 transactions.back().states.front().layerId = id;
372 transactions.back().states.front().state.defaultFrameRateCompatibility =
373 defaultFrameRateCompatibility;
374 mLifecycleManager.applyTransactions(transactions);
375 }
376
Vishnu Nair0808ae62023-08-07 21:42:42 -0700377 void setRoundedCorners(uint32_t id, float radius) {
378 std::vector<TransactionState> transactions;
379 transactions.emplace_back();
380 transactions.back().states.push_back({});
381
382 transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
383 transactions.back().states.front().layerId = id;
384 transactions.back().states.front().state.cornerRadius = radius;
385 mLifecycleManager.applyTransactions(transactions);
386 }
387
388 void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
389 std::vector<TransactionState> transactions;
390 transactions.emplace_back();
391 transactions.back().states.push_back({});
392
393 transactions.back().states.front().state.what = layer_state_t::eBufferChanged;
394 transactions.back().states.front().layerId = id;
395 transactions.back().states.front().externalTexture = texture;
396 transactions.back().states.front().state.bufferData =
397 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
398 texture->getHeight(), texture->getPixelFormat(),
399 texture->getUsage());
400 mLifecycleManager.applyTransactions(transactions);
401 }
402
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700403 void setBuffer(uint32_t id) {
404 static uint64_t sBufferId = 1;
405 setBuffer(id,
406 std::make_shared<renderengine::mock::
407 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
408 sBufferId++,
409 HAL_PIXEL_FORMAT_RGBA_8888,
410 GRALLOC_USAGE_PROTECTED /*usage*/));
411 }
412
Chavi Weingarten07597342023-09-14 21:10:59 +0000413 void setBufferCrop(uint32_t id, const Rect& bufferCrop) {
414 std::vector<TransactionState> transactions;
415 transactions.emplace_back();
416 transactions.back().states.push_back({});
417
418 transactions.back().states.front().state.what = layer_state_t::eBufferCropChanged;
419 transactions.back().states.front().layerId = id;
420 transactions.back().states.front().state.bufferCrop = bufferCrop;
421 mLifecycleManager.applyTransactions(transactions);
422 }
423
Arthur Hung69f95222023-10-04 07:39:02 +0000424 void setDamageRegion(uint32_t id, const Region& damageRegion) {
425 std::vector<TransactionState> transactions;
426 transactions.emplace_back();
427 transactions.back().states.push_back({});
428
429 transactions.back().states.front().state.what = layer_state_t::eSurfaceDamageRegionChanged;
430 transactions.back().states.front().layerId = id;
431 transactions.back().states.front().state.surfaceDamageRegion = damageRegion;
432 mLifecycleManager.applyTransactions(transactions);
433 }
434
Vishnu Nair3996ee32023-08-14 04:32:31 +0000435 void setDataspace(uint32_t id, ui::Dataspace dataspace) {
436 std::vector<TransactionState> transactions;
437 transactions.emplace_back();
438 transactions.back().states.push_back({});
439
440 transactions.back().states.front().state.what = layer_state_t::eDataspaceChanged;
441 transactions.back().states.front().layerId = id;
442 transactions.back().states.front().state.dataspace = dataspace;
443 mLifecycleManager.applyTransactions(transactions);
444 }
445
Arthur Hung69f95222023-10-04 07:39:02 +0000446 void setMatrix(uint32_t id, float dsdx, float dtdx, float dtdy, float dsdy) {
447 layer_state_t::matrix22_t matrix{dsdx, dtdx, dtdy, dsdy};
448
449 std::vector<TransactionState> transactions;
450 transactions.emplace_back();
451 transactions.back().states.push_back({});
452
453 transactions.back().states.front().state.what = layer_state_t::eMatrixChanged;
454 transactions.back().states.front().layerId = id;
455 transactions.back().states.front().state.matrix = matrix;
456 mLifecycleManager.applyTransactions(transactions);
457 }
458
Vishnu Nairbefd3e22023-10-05 17:48:31 +0000459 void setShadowRadius(uint32_t id, float shadowRadius) {
460 std::vector<TransactionState> transactions;
461 transactions.emplace_back();
462 transactions.back().states.push_back({});
463
464 transactions.back().states.front().state.what = layer_state_t::eShadowRadiusChanged;
465 transactions.back().states.front().layerId = id;
466 transactions.back().states.front().state.shadowRadius = shadowRadius;
467 mLifecycleManager.applyTransactions(transactions);
468 }
469
Chavi Weingartenb74093a2023-10-11 20:29:59 +0000470 void setTrustedOverlay(uint32_t id, bool isTrustedOverlay) {
471 std::vector<TransactionState> transactions;
472 transactions.emplace_back();
473 transactions.back().states.push_back({});
474
475 transactions.back().states.front().state.what = layer_state_t::eTrustedOverlayChanged;
476 transactions.back().states.front().layerId = id;
477 transactions.back().states.front().state.isTrustedOverlay = isTrustedOverlay;
478 mLifecycleManager.applyTransactions(transactions);
479 }
480
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000481 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000482};
483
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700484class LayerSnapshotTestBase : public LayerHierarchyTestBase {
485protected:
486 LayerSnapshotTestBase() : LayerHierarchyTestBase() {}
487
488 void createRootLayer(uint32_t id) override {
489 LayerHierarchyTestBase::createRootLayer(id);
490 setColor(id);
491 }
492
493 void createLayer(uint32_t id, uint32_t parentId) override {
494 LayerHierarchyTestBase::createLayer(id, parentId);
495 setColor(parentId);
496 }
497
498 void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) override {
499 LayerHierarchyTestBase::mirrorLayer(id, parent, layerToMirror);
500 setColor(id);
501 }
502
503 void update(LayerSnapshotBuilder& snapshotBuilder) {
504 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
505 mHierarchyBuilder.update(mLifecycleManager.getLayers(),
506 mLifecycleManager.getDestroyedLayers());
507 }
508 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
509 .layerLifecycleManager = mLifecycleManager,
510 .includeMetadata = false,
511 .displays = mFrontEndDisplayInfos,
512 .displayChanges = mHasDisplayChanges,
513 .globalShadowSettings = globalShadowSettings,
514 .supportsBlur = true,
515 .supportedLayerGenericMetadata = {},
516 .genericLayerMetadataKeyMap = {}};
517 snapshotBuilder.update(args);
518
519 mLifecycleManager.commitChanges();
520 }
521
522 LayerHierarchyBuilder mHierarchyBuilder{{}};
523
524 DisplayInfos mFrontEndDisplayInfos;
525 bool mHasDisplayChanges = false;
526
Vishnu Naird9e4f462023-10-06 04:05:45 +0000527 ShadowSettings globalShadowSettings;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700528};
529
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000530} // namespace android::surfaceflinger::frontend