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