blob: 67e624922c7adc2d8424afcb0c23f5633c4af4d1 [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) {
Vishnu Naira0292282023-12-16 14:32:00 -0800179 hierarchyBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000180 mLifecycleManager.commitChanges();
181
182 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
Vishnu Naira0292282023-12-16 14:32:00 -0800183 LayerHierarchyBuilder newBuilder;
184 newBuilder.update(mLifecycleManager);
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000185 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
186 getTraversalPath(newBuilder.getHierarchy()));
187 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
188 getTraversalPathInZOrder(newBuilder.getHierarchy()));
189 EXPECT_FALSE(
190 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
191 }
192
Vishnu Nair1391de22023-03-05 19:56:14 -0800193 std::vector<TransactionState> setZTransaction(uint32_t id, int32_t z) {
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000194 std::vector<TransactionState> transactions;
195 transactions.emplace_back();
196 transactions.back().states.push_back({});
197
198 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800199 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000200 transactions.back().states.front().state.z = z;
Vishnu Nair1391de22023-03-05 19:56:14 -0800201 return transactions;
202 }
203
204 void setZ(uint32_t id, int32_t z) {
205 mLifecycleManager.applyTransactions(setZTransaction(id, z));
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000206 }
207
208 void setCrop(uint32_t id, const Rect& crop) {
209 std::vector<TransactionState> transactions;
210 transactions.emplace_back();
211 transactions.back().states.push_back({});
212
213 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800214 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000215 transactions.back().states.front().state.crop = crop;
216 mLifecycleManager.applyTransactions(transactions);
217 }
218
219 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
220 std::vector<TransactionState> transactions;
221 transactions.emplace_back();
222 transactions.back().states.push_back({});
223
224 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
225 transactions.back().states.front().state.flags = flags;
226 transactions.back().states.front().state.mask = mask;
Vishnu Nair1391de22023-03-05 19:56:14 -0800227 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000228 mLifecycleManager.applyTransactions(transactions);
229 }
230
231 void setAlpha(uint32_t id, float alpha) {
232 std::vector<TransactionState> transactions;
233 transactions.emplace_back();
234 transactions.back().states.push_back({});
235
236 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800237 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000238 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
239 mLifecycleManager.applyTransactions(transactions);
240 }
241
242 void hideLayer(uint32_t id) {
243 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
244 }
245
246 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
247
248 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
249 std::vector<TransactionState> transactions;
250 transactions.emplace_back();
251 transactions.back().states.push_back({});
252 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
253 transactions.back().states.front().state.color.rgb = rgb;
Vishnu Nair1391de22023-03-05 19:56:14 -0800254 transactions.back().states.front().layerId = id;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000255 mLifecycleManager.applyTransactions(transactions);
256 }
257
Vishnu Naircfb2d252023-01-19 04:44:02 +0000258 void setLayerStack(uint32_t id, int32_t layerStack) {
259 std::vector<TransactionState> transactions;
260 transactions.emplace_back();
261 transactions.back().states.push_back({});
262
263 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800264 transactions.back().states.front().layerId = id;
Vishnu Naircfb2d252023-01-19 04:44:02 +0000265 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
266 mLifecycleManager.applyTransactions(transactions);
267 }
268
Vishnu Nair92990e22023-02-24 20:01:05 +0000269 void setTouchableRegion(uint32_t id, Region region) {
270 std::vector<TransactionState> transactions;
271 transactions.emplace_back();
272 transactions.back().states.push_back({});
273
274 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
Vishnu Nair1391de22023-03-05 19:56:14 -0800275 transactions.back().states.front().layerId = id;
Vishnu Nair92990e22023-02-24 20:01:05 +0000276 transactions.back().states.front().state.windowInfoHandle =
277 sp<gui::WindowInfoHandle>::make();
278 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
279 inputInfo->touchableRegion = region;
280 inputInfo->token = sp<BBinder>::make();
281 mLifecycleManager.applyTransactions(transactions);
282 }
283
Vishnu Nair29354ec2023-03-28 18:51:28 -0700284 void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
285 bool replaceTouchableRegionWithCrop) {
286 std::vector<TransactionState> transactions;
287 transactions.emplace_back();
288 transactions.back().states.push_back({});
289
290 transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
291 transactions.back().states.front().layerId = id;
292 transactions.back().states.front().state.windowInfoHandle =
293 sp<gui::WindowInfoHandle>::make();
294 auto inputInfo = transactions.back().states.front().state.windowInfoHandle->editInfo();
295 inputInfo->touchableRegion = region;
296 inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
297 transactions.back().states.front().touchCropId = touchCropId;
298
299 inputInfo->token = sp<BBinder>::make();
300 mLifecycleManager.applyTransactions(transactions);
301 }
302
Vishnu Nair444f3952023-04-11 13:01:02 -0700303 void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
304 std::vector<TransactionState> transactions;
305 transactions.emplace_back();
306 transactions.back().states.push_back({});
307
308 transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
309 transactions.back().states.front().layerId = id;
310 transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
311 mLifecycleManager.applyTransactions(transactions);
312 }
313
Vishnu Nair3d8565a2023-06-30 07:23:24 +0000314 void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
315 std::vector<TransactionState> transactions;
316 transactions.emplace_back();
317 transactions.back().states.push_back({});
318
319 transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
320 transactions.back().states.front().layerId = id;
321 transactions.back().states.front().state.frameRateSelectionPriority = priority;
322 mLifecycleManager.applyTransactions(transactions);
323 }
324
Vishnu Nair52d56fd2023-07-20 17:02:43 +0000325 void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
326 int8_t changeFrameRateStrategy) {
327 std::vector<TransactionState> transactions;
328 transactions.emplace_back();
329 transactions.back().states.push_back({});
330
331 transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
332 transactions.back().states.front().layerId = id;
333 transactions.back().states.front().state.frameRate = frameRate;
334 transactions.back().states.front().state.frameRateCompatibility = compatibility;
335 transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
336 mLifecycleManager.applyTransactions(transactions);
337 }
338
Rachel Leece6e0042023-06-27 11:22:54 -0700339 void setFrameRateCategory(uint32_t id, int8_t frameRateCategory) {
340 std::vector<TransactionState> transactions;
341 transactions.emplace_back();
342 transactions.back().states.push_back({});
343
344 transactions.back().states.front().state.what = layer_state_t::eFrameRateCategoryChanged;
345 transactions.back().states.front().layerId = id;
346 transactions.back().states.front().state.frameRateCategory = frameRateCategory;
347 mLifecycleManager.applyTransactions(transactions);
348 }
349
Rachel Lee58cc90d2023-09-05 18:50:20 -0700350 void setFrameRateSelectionStrategy(uint32_t id, int8_t strategy) {
351 std::vector<TransactionState> transactions;
352 transactions.emplace_back();
353 transactions.back().states.push_back({});
354
355 transactions.back().states.front().state.what =
356 layer_state_t::eFrameRateSelectionStrategyChanged;
357 transactions.back().states.front().layerId = id;
358 transactions.back().states.front().state.frameRateSelectionStrategy = strategy;
359 mLifecycleManager.applyTransactions(transactions);
360 }
361
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700362 void setDefaultFrameRateCompatibility(uint32_t id, int8_t defaultFrameRateCompatibility) {
363 std::vector<TransactionState> transactions;
364 transactions.emplace_back();
365 transactions.back().states.push_back({});
366
367 transactions.back().states.front().state.what =
368 layer_state_t::eDefaultFrameRateCompatibilityChanged;
369 transactions.back().states.front().layerId = id;
370 transactions.back().states.front().state.defaultFrameRateCompatibility =
371 defaultFrameRateCompatibility;
372 mLifecycleManager.applyTransactions(transactions);
373 }
374
Vishnu Nair0808ae62023-08-07 21:42:42 -0700375 void setRoundedCorners(uint32_t id, float radius) {
376 std::vector<TransactionState> transactions;
377 transactions.emplace_back();
378 transactions.back().states.push_back({});
379
380 transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
381 transactions.back().states.front().layerId = id;
382 transactions.back().states.front().state.cornerRadius = radius;
383 mLifecycleManager.applyTransactions(transactions);
384 }
385
386 void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
387 std::vector<TransactionState> transactions;
388 transactions.emplace_back();
389 transactions.back().states.push_back({});
390
391 transactions.back().states.front().state.what = layer_state_t::eBufferChanged;
392 transactions.back().states.front().layerId = id;
393 transactions.back().states.front().externalTexture = texture;
394 transactions.back().states.front().state.bufferData =
395 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
396 texture->getHeight(), texture->getPixelFormat(),
397 texture->getUsage());
398 mLifecycleManager.applyTransactions(transactions);
399 }
400
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700401 void setBuffer(uint32_t id) {
402 static uint64_t sBufferId = 1;
403 setBuffer(id,
404 std::make_shared<renderengine::mock::
405 FakeExternalTexture>(1U /*width*/, 1U /*height*/,
406 sBufferId++,
407 HAL_PIXEL_FORMAT_RGBA_8888,
408 GRALLOC_USAGE_PROTECTED /*usage*/));
409 }
410
Chavi Weingarten07597342023-09-14 21:10:59 +0000411 void setBufferCrop(uint32_t id, const Rect& bufferCrop) {
412 std::vector<TransactionState> transactions;
413 transactions.emplace_back();
414 transactions.back().states.push_back({});
415
416 transactions.back().states.front().state.what = layer_state_t::eBufferCropChanged;
417 transactions.back().states.front().layerId = id;
418 transactions.back().states.front().state.bufferCrop = bufferCrop;
419 mLifecycleManager.applyTransactions(transactions);
420 }
421
Arthur Hung69f95222023-10-04 07:39:02 +0000422 void setDamageRegion(uint32_t id, const Region& damageRegion) {
423 std::vector<TransactionState> transactions;
424 transactions.emplace_back();
425 transactions.back().states.push_back({});
426
427 transactions.back().states.front().state.what = layer_state_t::eSurfaceDamageRegionChanged;
428 transactions.back().states.front().layerId = id;
429 transactions.back().states.front().state.surfaceDamageRegion = damageRegion;
430 mLifecycleManager.applyTransactions(transactions);
431 }
432
Vishnu Nair3996ee32023-08-14 04:32:31 +0000433 void setDataspace(uint32_t id, ui::Dataspace dataspace) {
434 std::vector<TransactionState> transactions;
435 transactions.emplace_back();
436 transactions.back().states.push_back({});
437
438 transactions.back().states.front().state.what = layer_state_t::eDataspaceChanged;
439 transactions.back().states.front().layerId = id;
440 transactions.back().states.front().state.dataspace = dataspace;
441 mLifecycleManager.applyTransactions(transactions);
442 }
443
Arthur Hung69f95222023-10-04 07:39:02 +0000444 void setMatrix(uint32_t id, float dsdx, float dtdx, float dtdy, float dsdy) {
445 layer_state_t::matrix22_t matrix{dsdx, dtdx, dtdy, dsdy};
446
447 std::vector<TransactionState> transactions;
448 transactions.emplace_back();
449 transactions.back().states.push_back({});
450
451 transactions.back().states.front().state.what = layer_state_t::eMatrixChanged;
452 transactions.back().states.front().layerId = id;
453 transactions.back().states.front().state.matrix = matrix;
454 mLifecycleManager.applyTransactions(transactions);
455 }
456
Vishnu Nairbefd3e22023-10-05 17:48:31 +0000457 void setShadowRadius(uint32_t id, float shadowRadius) {
458 std::vector<TransactionState> transactions;
459 transactions.emplace_back();
460 transactions.back().states.push_back({});
461
462 transactions.back().states.front().state.what = layer_state_t::eShadowRadiusChanged;
463 transactions.back().states.front().layerId = id;
464 transactions.back().states.front().state.shadowRadius = shadowRadius;
465 mLifecycleManager.applyTransactions(transactions);
466 }
467
Chavi Weingartenb74093a2023-10-11 20:29:59 +0000468 void setTrustedOverlay(uint32_t id, bool isTrustedOverlay) {
469 std::vector<TransactionState> transactions;
470 transactions.emplace_back();
471 transactions.back().states.push_back({});
472
473 transactions.back().states.front().state.what = layer_state_t::eTrustedOverlayChanged;
474 transactions.back().states.front().layerId = id;
475 transactions.back().states.front().state.isTrustedOverlay = isTrustedOverlay;
476 mLifecycleManager.applyTransactions(transactions);
477 }
478
Vishnu Nairf13c8982023-12-02 11:26:09 -0800479 void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) {
480 std::vector<TransactionState> transactions;
481 transactions.emplace_back();
482 transactions.back().states.push_back({});
483
484 transactions.back().states.front().state.what = layer_state_t::eDropInputModeChanged;
485 transactions.back().states.front().layerId = id;
486 transactions.back().states.front().state.dropInputMode = dropInputMode;
487 mLifecycleManager.applyTransactions(transactions);
488 }
489
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000490 LayerLifecycleManager mLifecycleManager;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000491};
492
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700493class LayerSnapshotTestBase : public LayerHierarchyTestBase {
494protected:
495 LayerSnapshotTestBase() : LayerHierarchyTestBase() {}
496
497 void createRootLayer(uint32_t id) override {
498 LayerHierarchyTestBase::createRootLayer(id);
499 setColor(id);
500 }
501
502 void createLayer(uint32_t id, uint32_t parentId) override {
503 LayerHierarchyTestBase::createLayer(id, parentId);
504 setColor(parentId);
505 }
506
507 void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) override {
508 LayerHierarchyTestBase::mirrorLayer(id, parent, layerToMirror);
509 setColor(id);
510 }
511
512 void update(LayerSnapshotBuilder& snapshotBuilder) {
Vishnu Naira0292282023-12-16 14:32:00 -0800513 mHierarchyBuilder.update(mLifecycleManager);
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700514 LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(),
515 .layerLifecycleManager = mLifecycleManager,
516 .includeMetadata = false,
517 .displays = mFrontEndDisplayInfos,
518 .displayChanges = mHasDisplayChanges,
519 .globalShadowSettings = globalShadowSettings,
520 .supportsBlur = true,
521 .supportedLayerGenericMetadata = {},
522 .genericLayerMetadataKeyMap = {}};
523 snapshotBuilder.update(args);
524
525 mLifecycleManager.commitChanges();
526 }
527
Vishnu Naira0292282023-12-16 14:32:00 -0800528 LayerHierarchyBuilder mHierarchyBuilder;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700529
530 DisplayInfos mFrontEndDisplayInfos;
531 bool mHasDisplayChanges = false;
532
Vishnu Naird9e4f462023-10-06 04:05:45 +0000533 ShadowSettings globalShadowSettings;
Vishnu Nair47b7bb42023-09-29 16:27:33 -0700534};
535
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000536} // namespace android::surfaceflinger::frontend