blob: 08727f2c17a135053e81b9fffeb1d6f0be5912ac [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
63 std::vector<uint32_t> getTraversalPath(const LayerHierarchy& hierarchy) const {
64 std::vector<uint32_t> layerIds;
65 hierarchy.traverse([&layerIds = layerIds](const LayerHierarchy& hierarchy,
66 const LayerHierarchy::TraversalPath&) -> bool {
67 layerIds.emplace_back(hierarchy.getLayer()->id);
68 return true;
69 });
70 return layerIds;
71 }
72
73 std::vector<uint32_t> getTraversalPathInZOrder(const LayerHierarchy& hierarchy) const {
74 std::vector<uint32_t> layerIds;
75 hierarchy.traverseInZOrder(
76 [&layerIds = layerIds](const LayerHierarchy& hierarchy,
77 const LayerHierarchy::TraversalPath&) -> bool {
78 layerIds.emplace_back(hierarchy.getLayer()->id);
79 return true;
80 });
81 return layerIds;
82 }
83
84 virtual void createRootLayer(uint32_t id) {
85 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
86 mHandles[id] = handle;
87 std::vector<std::unique_ptr<RequestedLayerState>> layers;
88 layers.emplace_back(std::make_unique<RequestedLayerState>(
89 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/nullptr, /*mirror=*/nullptr)));
90 mLifecycleManager.addLayers(std::move(layers));
91 }
92
93 virtual void createLayer(uint32_t id, uint32_t parentId) {
94 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
95 mHandles[id] = handle;
96 std::vector<std::unique_ptr<RequestedLayerState>> layers;
97 layers.emplace_back(std::make_unique<RequestedLayerState>(
98 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/mHandles[parentId],
99 /*mirror=*/nullptr)));
100 mLifecycleManager.addLayers(std::move(layers));
101 }
102
103 void reparentLayer(uint32_t id, uint32_t newParentId) {
104 std::vector<TransactionState> transactions;
105 transactions.emplace_back();
106 transactions.back().states.push_back({});
107
108 if (newParentId == UNASSIGNED_LAYER_ID) {
109 transactions.back().states.front().state.parentSurfaceControlForChild = nullptr;
110 } else {
111 auto parentHandle = mHandles[newParentId];
112 transactions.back().states.front().state.parentSurfaceControlForChild =
113 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(), parentHandle,
114 static_cast<int32_t>(newParentId), "Test");
115 }
116 transactions.back().states.front().state.what = layer_state_t::eReparent;
117 transactions.back().states.front().state.surface = mHandles[id];
118 mLifecycleManager.applyTransactions(transactions);
119 }
120
121 void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
122 std::vector<TransactionState> transactions;
123 transactions.emplace_back();
124 transactions.back().states.push_back({});
125
126 if (relativeParentId == UNASSIGNED_LAYER_ID) {
127 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
128 } else {
129 auto parentHandle = mHandles[relativeParentId];
130 transactions.back().states.front().state.relativeLayerSurfaceControl =
131 sp<SurfaceControl>::make(SurfaceComposerClient::getDefault(), parentHandle,
132 static_cast<int32_t>(relativeParentId), "test");
133 transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
134 }
135 transactions.back().states.front().state.surface = mHandles[id];
136 mLifecycleManager.applyTransactions(transactions);
137 }
138
139 virtual void mirrorLayer(uint32_t id, uint32_t parent, uint32_t layerToMirror) {
140 auto parentHandle = (parent == UNASSIGNED_LAYER_ID) ? nullptr : mHandles[parent];
141 auto mirrorHandle =
142 (layerToMirror == UNASSIGNED_LAYER_ID) ? nullptr : mHandles[layerToMirror];
143
144 sp<LayerHandle> handle = sp<LayerHandle>::make(id);
145 mHandles[id] = handle;
146 std::vector<std::unique_ptr<RequestedLayerState>> layers;
147 layers.emplace_back(std::make_unique<RequestedLayerState>(
148 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentHandle,
149 /*mirror=*/mHandles[layerToMirror])));
150 mLifecycleManager.addLayers(std::move(layers));
151 }
152
153 void updateBackgroundColor(uint32_t id, half alpha) {
154 std::vector<TransactionState> transactions;
155 transactions.emplace_back();
156 transactions.back().states.push_back({});
157 transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
158 transactions.back().states.front().state.bgColorAlpha = alpha;
159 transactions.back().states.front().state.surface = mHandles[id];
160 mLifecycleManager.applyTransactions(transactions);
161 }
162
163 void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({id}); }
164
165 void updateAndVerify(LayerHierarchyBuilder& hierarchyBuilder) {
166 if (mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy)) {
167 hierarchyBuilder.update(mLifecycleManager.getLayers(),
168 mLifecycleManager.getDestroyedLayers());
169 }
170 mLifecycleManager.commitChanges();
171
172 // rebuild layer hierarchy from scratch and verify that it matches the updated state.
173 LayerHierarchyBuilder newBuilder(mLifecycleManager.getLayers());
174 EXPECT_EQ(getTraversalPath(hierarchyBuilder.getHierarchy()),
175 getTraversalPath(newBuilder.getHierarchy()));
176 EXPECT_EQ(getTraversalPathInZOrder(hierarchyBuilder.getHierarchy()),
177 getTraversalPathInZOrder(newBuilder.getHierarchy()));
178 EXPECT_FALSE(
179 mLifecycleManager.getGlobalChanges().test(RequestedLayerState::Changes::Hierarchy));
180 }
181
182 void setZ(uint32_t id, int32_t z) {
183 std::vector<TransactionState> transactions;
184 transactions.emplace_back();
185 transactions.back().states.push_back({});
186
187 transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
188 transactions.back().states.front().state.surface = mHandles[id];
189 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
190 transactions.back().states.front().state.z = z;
191 mLifecycleManager.applyTransactions(transactions);
192 }
193
194 void setCrop(uint32_t id, const Rect& crop) {
195 std::vector<TransactionState> transactions;
196 transactions.emplace_back();
197 transactions.back().states.push_back({});
198
199 transactions.back().states.front().state.what = layer_state_t::eCropChanged;
200 transactions.back().states.front().state.surface = mHandles[id];
201 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
202 transactions.back().states.front().state.crop = crop;
203 mLifecycleManager.applyTransactions(transactions);
204 }
205
206 void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
207 std::vector<TransactionState> transactions;
208 transactions.emplace_back();
209 transactions.back().states.push_back({});
210
211 transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
212 transactions.back().states.front().state.flags = flags;
213 transactions.back().states.front().state.mask = mask;
214 transactions.back().states.front().state.surface = mHandles[id];
215 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
216 mLifecycleManager.applyTransactions(transactions);
217 }
218
219 void setAlpha(uint32_t id, float alpha) {
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::eAlphaChanged;
225 transactions.back().states.front().state.surface = mHandles[id];
226 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
227 transactions.back().states.front().state.color.a = static_cast<half>(alpha);
228 mLifecycleManager.applyTransactions(transactions);
229 }
230
231 void hideLayer(uint32_t id) {
232 setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
233 }
234
235 void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
236
237 void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
238 std::vector<TransactionState> transactions;
239 transactions.emplace_back();
240 transactions.back().states.push_back({});
241 transactions.back().states.front().state.what = layer_state_t::eColorChanged;
242 transactions.back().states.front().state.color.rgb = rgb;
243 transactions.back().states.front().state.surface = mHandles[id];
244 transactions.back().states.front().state.layerId = static_cast<int32_t>(id);
245 mLifecycleManager.applyTransactions(transactions);
246 }
247
248 LayerLifecycleManager mLifecycleManager;
249 std::unordered_map<uint32_t, sp<LayerHandle>> mHandles;
250};
251
252} // namespace android::surfaceflinger::frontend