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