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