1 /*
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 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
19 #undef LOG_TAG
20 #define LOG_TAG "SurfaceFlinger"
21
22 #include "LayerLifecycleManager.h"
23 #include "Client.h" // temporarily needed for LayerCreationArgs
24 #include "LayerLog.h"
25 #include "SwapErase.h"
26
27 namespace android::surfaceflinger::frontend {
28
29 using namespace ftl::flag_operators;
30
31 namespace {
32 // Returns true if the layer is root of a display and can be mirrored by mirroringLayer
canMirrorRootLayer(RequestedLayerState & mirroringLayer,RequestedLayerState & rootLayer)33 bool canMirrorRootLayer(RequestedLayerState& mirroringLayer, RequestedLayerState& rootLayer) {
34 return rootLayer.isRoot() && rootLayer.layerStack == mirroringLayer.layerStackToMirror &&
35 rootLayer.id != mirroringLayer.id;
36 }
37 } // namespace
38
addLayers(std::vector<std::unique_ptr<RequestedLayerState>> newLayers)39 void LayerLifecycleManager::addLayers(std::vector<std::unique_ptr<RequestedLayerState>> newLayers) {
40 if (newLayers.empty()) {
41 return;
42 }
43
44 mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
45 for (auto& newLayer : newLayers) {
46 RequestedLayerState& layer = *newLayer.get();
47 auto [it, inserted] = mIdToLayer.try_emplace(layer.id, References{.owner = layer});
48 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(!inserted,
49 "Duplicate layer id found. New layer: %s Existing layer: "
50 "%s",
51 layer.getDebugString().c_str(),
52 it->second.owner.getDebugString().c_str());
53 mAddedLayers.push_back(newLayer.get());
54 mChangedLayers.push_back(newLayer.get());
55 layer.parentId = linkLayer(layer.parentId, layer.id);
56 layer.relativeParentId = linkLayer(layer.relativeParentId, layer.id);
57 if (layer.layerStackToMirror != ui::INVALID_LAYER_STACK) {
58 // Set mirror layer's default layer stack to -1 so it doesn't end up rendered on a
59 // display accidentally.
60 layer.layerStack = ui::INVALID_LAYER_STACK;
61
62 // if this layer is mirroring a display, then walk though all the existing root layers
63 // for the layer stack and add them as children to be mirrored.
64 mDisplayMirroringLayers.emplace_back(layer.id);
65 for (auto& rootLayer : mLayers) {
66 if (canMirrorRootLayer(layer, *rootLayer)) {
67 layer.mirrorIds.emplace_back(rootLayer->id);
68 linkLayer(rootLayer->id, layer.id);
69 }
70 }
71 } else {
72 // Check if we are mirroring a single layer, and if so add it to the list of children
73 // to be mirrored.
74 layer.layerIdToMirror = linkLayer(layer.layerIdToMirror, layer.id);
75 if (!FlagManager::getInstance().detached_mirror()) {
76 if (layer.layerIdToMirror != UNASSIGNED_LAYER_ID) {
77 layer.mirrorIds.emplace_back(layer.layerIdToMirror);
78 }
79 }
80 }
81 layer.touchCropId = linkLayer(layer.touchCropId, layer.id);
82 if (layer.isRoot()) {
83 updateDisplayMirrorLayers(layer);
84 }
85 LLOGV(layer.id, "%s", layer.getDebugString().c_str());
86 mLayers.emplace_back(std::move(newLayer));
87 }
88 }
89
onHandlesDestroyed(const std::vector<std::pair<uint32_t,std::string>> & destroyedHandles,bool ignoreUnknownHandles)90 void LayerLifecycleManager::onHandlesDestroyed(
91 const std::vector<std::pair<uint32_t, std::string /* debugName */>>& destroyedHandles,
92 bool ignoreUnknownHandles) {
93 std::vector<uint32_t> layersToBeDestroyed;
94 for (const auto& [layerId, name] : destroyedHandles) {
95 auto it = mIdToLayer.find(layerId);
96 if (it == mIdToLayer.end()) {
97 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(!ignoreUnknownHandles, "%s Layerid not found %s[%d]",
98 __func__, name.c_str(), layerId);
99 continue;
100 }
101 RequestedLayerState& layer = it->second.owner;
102 LLOGV(layer.id, "%s", layer.getDebugString().c_str());
103 layer.handleAlive = false;
104 if (!layer.canBeDestroyed()) {
105 continue;
106 }
107 layer.changes |= RequestedLayerState::Changes::Destroyed;
108 layersToBeDestroyed.emplace_back(layerId);
109 }
110
111 if (layersToBeDestroyed.empty()) {
112 return;
113 }
114
115 mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
116 for (size_t i = 0; i < layersToBeDestroyed.size(); i++) {
117 uint32_t layerId = layersToBeDestroyed[i];
118 auto it = mIdToLayer.find(layerId);
119 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(it == mIdToLayer.end(), "%s Layer with id %d not found",
120 __func__, layerId);
121
122 RequestedLayerState& layer = it->second.owner;
123
124 layer.parentId = unlinkLayer(layer.parentId, layer.id);
125 layer.relativeParentId = unlinkLayer(layer.relativeParentId, layer.id);
126 if (layer.layerStackToMirror != ui::INVALID_LAYER_STACK) {
127 layer.mirrorIds = unlinkLayers(layer.mirrorIds, layer.id);
128 swapErase(mDisplayMirroringLayers, layer.id);
129 } else {
130 layer.layerIdToMirror = unlinkLayer(layer.layerIdToMirror, layer.id);
131 layer.mirrorIds.clear();
132 }
133
134 layer.touchCropId = unlinkLayer(layer.touchCropId, layer.id);
135
136 auto& references = it->second.references;
137 for (uint32_t linkedLayerId : references) {
138 RequestedLayerState* linkedLayer = getLayerFromId(linkedLayerId);
139 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(!linkedLayer,
140 "%s Layerid reference %d not found for %d", __func__,
141 linkedLayerId, layer.id);
142 if (linkedLayer->parentId == layer.id) {
143 linkedLayer->parentId = UNASSIGNED_LAYER_ID;
144 if (linkedLayer->canBeDestroyed()) {
145 linkedLayer->changes |= RequestedLayerState::Changes::Destroyed;
146 layersToBeDestroyed.emplace_back(linkedLayer->id);
147 }
148 }
149 if (linkedLayer->relativeParentId == layer.id) {
150 linkedLayer->relativeParentId = UNASSIGNED_LAYER_ID;
151 }
152 if (swapErase(linkedLayer->mirrorIds, layer.id)) {
153 linkedLayer->changes |= RequestedLayerState::Changes::Mirror;
154 }
155 if (linkedLayer->layerIdToMirror == layer.id) {
156 linkedLayer->layerIdToMirror = UNASSIGNED_LAYER_ID;
157 linkedLayer->changes |= RequestedLayerState::Changes::Mirror;
158 }
159 if (linkedLayer->touchCropId == layer.id) {
160 linkedLayer->touchCropId = UNASSIGNED_LAYER_ID;
161 }
162 }
163 mIdToLayer.erase(it);
164 }
165
166 auto it = mLayers.begin();
167 while (it != mLayers.end()) {
168 RequestedLayerState* layer = it->get();
169 if (layer->changes.test(RequestedLayerState::Changes::Destroyed)) {
170 LLOGV(layer->id, "destroyed %s", layer->getDebugStringShort().c_str());
171 std::iter_swap(it, mLayers.end() - 1);
172 mDestroyedLayers.emplace_back(std::move(mLayers.back()));
173 if (it == mLayers.end() - 1) {
174 it = mLayers.erase(mLayers.end() - 1);
175 } else {
176 mLayers.erase(mLayers.end() - 1);
177 }
178 } else {
179 it++;
180 }
181 }
182 }
183
applyTransactions(const std::vector<TransactionState> & transactions,bool ignoreUnknownLayers)184 void LayerLifecycleManager::applyTransactions(const std::vector<TransactionState>& transactions,
185 bool ignoreUnknownLayers) {
186 for (const auto& transaction : transactions) {
187 for (const auto& resolvedComposerState : transaction.states) {
188 const auto& clientState = resolvedComposerState.state;
189 uint32_t layerId = resolvedComposerState.layerId;
190 if (layerId == UNASSIGNED_LAYER_ID) {
191 ALOGW("%s Handle %p is not valid", __func__, clientState.surface.get());
192 continue;
193 }
194
195 RequestedLayerState* layer = getLayerFromId(layerId);
196 if (layer == nullptr) {
197 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(!ignoreUnknownLayers,
198 "%s Layer with layerid=%d not found", __func__,
199 layerId);
200 continue;
201 }
202
203 LLOG_ALWAYS_FATAL_WITH_TRACE_IF(!layer->handleAlive,
204 "%s Layer's with layerid=%d) is not alive. Possible "
205 "out of "
206 "order LayerLifecycleManager updates",
207 __func__, layerId);
208
209 if (layer->changes.get() == 0) {
210 mChangedLayers.push_back(layer);
211 }
212
213 if (transaction.flags & ISurfaceComposer::eAnimation) {
214 layer->changes |= RequestedLayerState::Changes::Animation;
215 }
216
217 uint32_t oldParentId = layer->parentId;
218 uint32_t oldRelativeParentId = layer->relativeParentId;
219 uint32_t oldTouchCropId = layer->touchCropId;
220 layer->merge(resolvedComposerState);
221
222 if (layer->what & layer_state_t::eBackgroundColorChanged) {
223 if (layer->bgColorLayerId == UNASSIGNED_LAYER_ID && layer->bgColor.a != 0) {
224 LayerCreationArgs
225 backgroundLayerArgs(LayerCreationArgs::getInternalLayerId(
226 LayerCreationArgs::sInternalSequence++),
227 /*internalLayer=*/true);
228 backgroundLayerArgs.parentId = layer->id;
229 backgroundLayerArgs.name = layer->name + "BackgroundColorLayer";
230 backgroundLayerArgs.flags = ISurfaceComposerClient::eFXSurfaceEffect;
231 std::vector<std::unique_ptr<RequestedLayerState>> newLayers;
232 newLayers.emplace_back(
233 std::make_unique<RequestedLayerState>(backgroundLayerArgs));
234 RequestedLayerState* backgroundLayer = newLayers.back().get();
235 backgroundLayer->bgColorLayer = true;
236 backgroundLayer->handleAlive = false;
237 backgroundLayer->parentId = layer->id;
238 backgroundLayer->z = std::numeric_limits<int32_t>::min();
239 backgroundLayer->color = layer->bgColor;
240 backgroundLayer->dataspace = layer->bgColorDataspace;
241 layer->bgColorLayerId = backgroundLayer->id;
242 addLayers({std::move(newLayers)});
243 } else if (layer->bgColorLayerId != UNASSIGNED_LAYER_ID && layer->bgColor.a == 0) {
244 RequestedLayerState* bgColorLayer = getLayerFromId(layer->bgColorLayerId);
245 layer->bgColorLayerId = UNASSIGNED_LAYER_ID;
246 bgColorLayer->parentId = unlinkLayer(bgColorLayer->parentId, bgColorLayer->id);
247 onHandlesDestroyed({{bgColorLayer->id, bgColorLayer->debugName}});
248 } else if (layer->bgColorLayerId != UNASSIGNED_LAYER_ID) {
249 RequestedLayerState* bgColorLayer = getLayerFromId(layer->bgColorLayerId);
250 bgColorLayer->color = layer->bgColor;
251 bgColorLayer->dataspace = layer->bgColorDataspace;
252 bgColorLayer->what |= layer_state_t::eColorChanged |
253 layer_state_t::eDataspaceChanged | layer_state_t::eAlphaChanged;
254 bgColorLayer->changes |= RequestedLayerState::Changes::Content;
255 mChangedLayers.push_back(bgColorLayer);
256 mGlobalChanges |= RequestedLayerState::Changes::Content;
257 }
258 }
259
260 if (oldParentId != layer->parentId) {
261 unlinkLayer(oldParentId, layer->id);
262 layer->parentId = linkLayer(layer->parentId, layer->id);
263 if (oldParentId == UNASSIGNED_LAYER_ID) {
264 updateDisplayMirrorLayers(*layer);
265 }
266 }
267 if (layer->what & layer_state_t::eLayerStackChanged && layer->isRoot()) {
268 updateDisplayMirrorLayers(*layer);
269 }
270 if (oldRelativeParentId != layer->relativeParentId) {
271 unlinkLayer(oldRelativeParentId, layer->id);
272 layer->relativeParentId = linkLayer(layer->relativeParentId, layer->id);
273 }
274 if (oldTouchCropId != layer->touchCropId) {
275 unlinkLayer(oldTouchCropId, layer->id);
276 layer->touchCropId = linkLayer(layer->touchCropId, layer->id);
277 }
278
279 mGlobalChanges |= layer->changes;
280 }
281 }
282 }
283
commitChanges()284 void LayerLifecycleManager::commitChanges() {
285 for (auto layer : mAddedLayers) {
286 for (auto& listener : mListeners) {
287 listener->onLayerAdded(*layer);
288 }
289 }
290 mAddedLayers.clear();
291
292 for (auto& layer : mLayers) {
293 layer->clearChanges();
294 }
295
296 for (auto& destroyedLayer : mDestroyedLayers) {
297 for (auto& listener : mListeners) {
298 listener->onLayerDestroyed(*destroyedLayer);
299 }
300 }
301 mDestroyedLayers.clear();
302 mChangedLayers.clear();
303 mGlobalChanges.clear();
304 }
305
addLifecycleListener(std::shared_ptr<ILifecycleListener> listener)306 void LayerLifecycleManager::addLifecycleListener(std::shared_ptr<ILifecycleListener> listener) {
307 mListeners.emplace_back(std::move(listener));
308 }
309
removeLifecycleListener(std::shared_ptr<ILifecycleListener> listener)310 void LayerLifecycleManager::removeLifecycleListener(std::shared_ptr<ILifecycleListener> listener) {
311 swapErase(mListeners, listener);
312 }
313
getLayers() const314 const std::vector<std::unique_ptr<RequestedLayerState>>& LayerLifecycleManager::getLayers() const {
315 return mLayers;
316 }
317
getDestroyedLayers() const318 const std::vector<std::unique_ptr<RequestedLayerState>>& LayerLifecycleManager::getDestroyedLayers()
319 const {
320 return mDestroyedLayers;
321 }
322
getChangedLayers() const323 const std::vector<RequestedLayerState*>& LayerLifecycleManager::getChangedLayers() const {
324 return mChangedLayers;
325 }
326
getGlobalChanges() const327 const ftl::Flags<RequestedLayerState::Changes> LayerLifecycleManager::getGlobalChanges() const {
328 return mGlobalChanges;
329 }
330
getLayerFromId(uint32_t id) const331 const RequestedLayerState* LayerLifecycleManager::getLayerFromId(uint32_t id) const {
332 if (id == UNASSIGNED_LAYER_ID) {
333 return nullptr;
334 }
335 auto it = mIdToLayer.find(id);
336 if (it == mIdToLayer.end()) {
337 return nullptr;
338 }
339 return &it->second.owner;
340 }
341
getLayerFromId(uint32_t id)342 RequestedLayerState* LayerLifecycleManager::getLayerFromId(uint32_t id) {
343 if (id == UNASSIGNED_LAYER_ID) {
344 return nullptr;
345 }
346 auto it = mIdToLayer.find(id);
347 if (it == mIdToLayer.end()) {
348 return nullptr;
349 }
350 return &it->second.owner;
351 }
352
getLinkedLayersFromId(uint32_t id)353 std::vector<uint32_t>* LayerLifecycleManager::getLinkedLayersFromId(uint32_t id) {
354 if (id == UNASSIGNED_LAYER_ID) {
355 return nullptr;
356 }
357 auto it = mIdToLayer.find(id);
358 if (it == mIdToLayer.end()) {
359 return nullptr;
360 }
361 return &it->second.references;
362 }
363
linkLayer(uint32_t layerId,uint32_t layerToLink)364 uint32_t LayerLifecycleManager::linkLayer(uint32_t layerId, uint32_t layerToLink) {
365 if (layerId == UNASSIGNED_LAYER_ID) {
366 return UNASSIGNED_LAYER_ID;
367 }
368
369 std::vector<uint32_t>* linkedLayers = getLinkedLayersFromId(layerId);
370 if (!linkedLayers) {
371 ALOGV("Could not find layer id %d to link %d. Parent is probably destroyed", layerId,
372 layerToLink);
373 return UNASSIGNED_LAYER_ID;
374 }
375 linkedLayers->emplace_back(layerToLink);
376 return layerId;
377 }
378
unlinkLayer(uint32_t layerId,uint32_t linkedLayer)379 uint32_t LayerLifecycleManager::unlinkLayer(uint32_t layerId, uint32_t linkedLayer) {
380 std::vector<uint32_t>* linkedLayers = getLinkedLayersFromId(layerId);
381 if (!linkedLayers) {
382 return UNASSIGNED_LAYER_ID;
383 }
384 swapErase(*linkedLayers, linkedLayer);
385 return UNASSIGNED_LAYER_ID;
386 }
387
unlinkLayers(const std::vector<uint32_t> & layerIds,uint32_t linkedLayer)388 std::vector<uint32_t> LayerLifecycleManager::unlinkLayers(const std::vector<uint32_t>& layerIds,
389 uint32_t linkedLayer) {
390 for (uint32_t layerId : layerIds) {
391 unlinkLayer(layerId, linkedLayer);
392 }
393 return {};
394 }
395
getDebugString() const396 std::string LayerLifecycleManager::References::getDebugString() const {
397 std::string debugInfo = owner.name + "[" + std::to_string(owner.id) + "] refs:";
398 std::for_each(references.begin(), references.end(),
399 [&debugInfo = debugInfo](const uint32_t& reference) mutable {
400 debugInfo += std::to_string(reference) + ",";
401 });
402 return debugInfo;
403 }
404
fixRelativeZLoop(uint32_t relativeRootId)405 void LayerLifecycleManager::fixRelativeZLoop(uint32_t relativeRootId) {
406 auto it = mIdToLayer.find(relativeRootId);
407 if (it == mIdToLayer.end()) {
408 return;
409 }
410 RequestedLayerState& layer = it->second.owner;
411 layer.relativeParentId = unlinkLayer(layer.relativeParentId, layer.id);
412 layer.changes |=
413 RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::RelativeParent;
414 mGlobalChanges |= RequestedLayerState::Changes::Hierarchy;
415 }
416
417 // Some layers mirror the entire display stack. Since we don't have a single root layer per display
418 // we have to track all these layers and update what they mirror when the list of root layers
419 // on a display changes. This function walks through the list of display mirroring layers
420 // and updates its list of layers that its mirroring. This function should be called when a new
421 // root layer is added, removed or moved to another display.
updateDisplayMirrorLayers(RequestedLayerState & rootLayer)422 void LayerLifecycleManager::updateDisplayMirrorLayers(RequestedLayerState& rootLayer) {
423 for (uint32_t mirroringLayerId : mDisplayMirroringLayers) {
424 RequestedLayerState* mirrorLayer = getLayerFromId(mirroringLayerId);
425 bool canBeMirrored = canMirrorRootLayer(*mirrorLayer, rootLayer);
426 bool currentlyMirrored =
427 std::find(mirrorLayer->mirrorIds.begin(), mirrorLayer->mirrorIds.end(),
428 rootLayer.id) != mirrorLayer->mirrorIds.end();
429
430 if (canBeMirrored && !currentlyMirrored) {
431 mirrorLayer->mirrorIds.emplace_back(rootLayer.id);
432 linkLayer(rootLayer.id, mirrorLayer->id);
433 mirrorLayer->changes |= RequestedLayerState::Changes::Mirror;
434 } else if (!canBeMirrored && currentlyMirrored) {
435 swapErase(mirrorLayer->mirrorIds, rootLayer.id);
436 unlinkLayer(rootLayer.id, mirrorLayer->id);
437 mirrorLayer->changes |= RequestedLayerState::Changes::Mirror;
438 }
439 }
440 }
441
isLayerSecure(uint32_t layerId) const442 bool LayerLifecycleManager::isLayerSecure(uint32_t layerId) const {
443 if (layerId == UNASSIGNED_LAYER_ID) {
444 return false;
445 }
446
447 if (getLayerFromId(layerId)->flags & layer_state_t::eLayerSecure) {
448 return true;
449 }
450 return isLayerSecure(getLayerFromId(layerId)->parentId);
451 }
452
453 } // namespace android::surfaceflinger::frontend
454