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