blob: cdcc6f4eb27d5db6fbea7f84bb0f854b61205650 [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
20#include "FrontEnd/LayerHandle.h"
21#include "FrontEnd/LayerHierarchy.h"
22#include "FrontEnd/LayerLifecycleManager.h"
23#include "Layer.h"
24#include "gui/SurfaceComposerClient.h"
25
26namespace android::surfaceflinger::frontend {
27
28class LayerHierarchyTestBase : public testing::Test {
29protected:
30 LayerHierarchyTestBase() {
31 // tree with 3 levels of children
32 // ROOT
33 // ├── 1
34 // │ ├── 11
35 // │ │ └── 111
36 // │ ├── 12
37 // │ │ ├── 121
38 // │ │ └── 122
39 // │ │ └── 1221
40 // │ └── 13
41 // └── 2
42
43 createRootLayer(1);
44 createRootLayer(2);
45 createLayer(11, 1);
46 createLayer(12, 1);
47 createLayer(13, 1);
48 createLayer(111, 11);
49 createLayer(121, 12);
50 createLayer(122, 12);
51 createLayer(1221, 122);
52 }
53
54 LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, wp<IBinder> parent,
55 wp<IBinder> mirror) {
56 LayerCreationArgs args(nullptr, nullptr, "testlayer", 0, {}, std::make_optional(id));
57 args.addToRoot = canBeRoot;
58 args.parentHandle = parent;
59 args.mirrorLayerHandle = mirror;
60 return args;
61 }
62
Vishnu Naira9c43762023-01-27 19:10:25 +000063 LayerCreationArgs createDisplayMirrorArgs(uint32_t id, ui::LayerStack layerStack) {
64 LayerCreationArgs args(nullptr, nullptr, "testlayer", 0, {}, std::make_optional(id));
65 args.addToRoot = true;
66 args.parentHandle.clear();
67 args.layerStackToMirror = layerStack;
68 return args;
69 }
70
Vishnu Nair8fc721b2022-12-22 20:06:32 +000071 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
72 std::vector<uint32_t> layerIds;
73 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
74 const LayerHierarchy::TraversalPath&) -> bool {
75 layerIds.emplace_back(hierarchy.getLayer()->id);
76 return true;
77 });
78 return layerIds;
79 }
80
81 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
82 std::vector<uint32_t> layerIds;
83 hierarchy.traverseInZOrder(
84 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
85 const LayerHierarchy::TraversalPath&) -> bool {
86 layerIds.emplace_back(hierarchy.getLayer()->id);
87 return true;
88 });
89 return layerIds;
90 }
91
92 virtual void createRootLayer(uint32_t id) {
93 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
94 mHandles[id] = handle;
95 std::vector<std::unique_ptr<RequestedLayerState>> layers;
96 layers.emplace_back(std::make_unique<RequestedLayerState>(
97 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/nullptr, /*mirror=*/nullptr)));
98 mLifecycleManager.addLayers(std::move(layers));
99 }
100
Vishnu Naira9c43762023-01-27 19:10:25 +0000101 void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
102 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
103 mHandles[id] = handle;
104 std::vector<std::unique_ptr<RequestedLayerState>> layers;
105 layers.emplace_back(std::make_unique<RequestedLayerState>(
106 createDisplayMirrorArgs(/*id=*/id, layerStack)));
107 mLifecycleManager.addLayers(std::move(layers));
108 }
109
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000110 virtual void createLayer(uint32_t id, uint32_t parentId) {
111 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
112 mHandles[id] = handle;
113 std::vector<std::unique_ptr<RequestedLayerState>> layers;
114 layers.emplace_back(std::make_unique<RequestedLayerState>(
115 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/mHandles[parentId],
116 /*mirror=*/nullptr)));
117 mLifecycleManager.addLayers(std::move(layers));
118 }
119
120 void reparentLayer(uint32_t id, uint32_t newParentId) {
121 std::vector<TransactionState> transactions;
122 transactions.emplace_back();
123 transactions.back().states.push_back({});
124
125 if (newParentId == UNASSIGNED_LAYER_ID) {
126 transactions.back().states.front().state.parentSurfaceControlForChild = nullptr;
127 } else {
128 auto parentHandle = mHandles[newParentId];
129 transactions.back().states.front().state.parentSurfaceControlForChild =
130 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(), parentHandle,
131 static_cast<int32_t>(newParentId), "Test");
132 }
133 transactions.back().states.front().state.what = layer_state_t::eReparent;
134 transactions.back().states.front().state.surface = mHandles[id];
135 mLifecycleManager.applyTransactions(transactions);
136 }
137
138 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
139 std::vector<TransactionState> transactions;
140 transactions.emplace_back();
141 transactions.back().states.push_back({});
142
143 if (relativeParentId == UNASSIGNED_LAYER_ID) {
144 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
145 } else {
146 auto parentHandle = mHandles[relativeParentId];
147 transactions.back().states.front().state.relativeLayerSurfaceControl =
148 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(), parentHandle,
149 static_cast<int32_t>(relativeParentId), "test");
150 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
151 }
152 transactions.back().states.front().state.surface = mHandles[id];
153 mLifecycleManager.applyTransactions(transactions);
154 }
155
156 virtual void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) {
157 auto parentHandle = (parent == UNASSIGNED_LAYER_ID) ? nullptr : mHandles[parent];
158 auto mirrorHandle =
159 (layerToMirror == UNASSIGNED_LAYER_ID) ? nullptr : mHandles[layerToMirror];
160
161 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
162 mHandles[id] = handle;
163 std::vector<std::unique_ptr<RequestedLayerState>> layers;
164 layers.emplace_back(std::make_unique<RequestedLayerState>(
165 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentHandle,
166 /*mirror=*/mHandles[layerToMirror])));
167 mLifecycleManager.addLayers(std::move(layers));
168 }
169
170 void updateBackgroundColor(uint32_t id, half alpha) {
171 std::vector<TransactionState> transactions;
172 transactions.emplace_back();
173 transactions.back().states.push_back({});
174 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
Vishnu Naird47bcee2023-02-24 18:08:51 +0000175 transactions.back().states.front().state.bgColor.a = alpha;
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000176 transactions.back().states.front().state.surface = mHandles[id];
177 mLifecycleManager.applyTransactions(transactions);
178 }
179
180 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({id}); }
181
182 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
183 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
184 hierarchyBuilder.update(mLifecycleManager.getLayers(),
185 mLifecycleManager.getDestroyedLayers());
186 }
187 mLifecycleManager.commitChanges();
188
189 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
190 LayerHierarchyBuilder newBuilder(mLifecycleManager.getLayers());
191 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
192 getTraversalPath(newBuilder.getHierarchy()));
193 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
194 getTraversalPathInZOrder(newBuilder.getHierarchy()));
195 EXPECT_FALSE(
196 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
197 }
198
199 void setZ(uint32_t id, int32_t z) {
200 std::vector<TransactionState> transactions;
201 transactions.emplace_back();
202 transactions.back().states.push_back({});
203
204 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
205 transactions.back().states.front().state.surface = mHandles[id];
206 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
207 transactions.back().states.front().state.z = z;
208 mLifecycleManager.applyTransactions(transactions);
209 }
210
211 void setCrop(uint32_t id, const Rect& crop) {
212 std::vector<TransactionState> transactions;
213 transactions.emplace_back();
214 transactions.back().states.push_back({});
215
216 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
217 transactions.back().states.front().state.surface = mHandles[id];
218 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
219 transactions.back().states.front().state.crop = crop;
220 mLifecycleManager.applyTransactions(transactions);
221 }
222
223 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
224 std::vector<TransactionState> transactions;
225 transactions.emplace_back();
226 transactions.back().states.push_back({});
227
228 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
229 transactions.back().states.front().state.flags = flags;
230 transactions.back().states.front().state.mask = mask;
231 transactions.back().states.front().state.surface = mHandles[id];
232 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
233 mLifecycleManager.applyTransactions(transactions);
234 }
235
236 void setAlpha(uint32_t id, float alpha) {
237 std::vector<TransactionState> transactions;
238 transactions.emplace_back();
239 transactions.back().states.push_back({});
240
241 transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
242 transactions.back().states.front().state.surface = mHandles[id];
243 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
244 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
245 mLifecycleManager.applyTransactions(transactions);
246 }
247
248 void hideLayer(uint32_t id) {
249 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
250 }
251
252 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
253
254 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
255 std::vector<TransactionState> transactions;
256 transactions.emplace_back();
257 transactions.back().states.push_back({});
258 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
259 transactions.back().states.front().state.color.rgb = rgb;
260 transactions.back().states.front().state.surface = mHandles[id];
261 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
262 mLifecycleManager.applyTransactions(transactions);
263 }
264
Vishnu Naircfb2d252023-01-19 04:44:02 +0000265 void setLayerStack(uint32_t id, int32_t layerStack) {
266 std::vector<TransactionState> transactions;
267 transactions.emplace_back();
268 transactions.back().states.push_back({});
269
270 transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
271 transactions.back().states.front().state.surface = mHandles[id];
272 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
273 transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
274 mLifecycleManager.applyTransactions(transactions);
275 }
276
Vishnu Nair8fc721b2022-12-22 20:06:32 +0000277 LayerLifecycleManager mLifecycleManager;
278 std::unordered_map<uint32_t, sp<LayerHandle>> mHandles;
279};
280
281} // namespace android::surfaceflinger::frontend