Loading services/surfaceflinger/Layer.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -2523,6 +2523,14 @@ bool Layer::getTransformToDisplayInverse() const { return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); } size_t Layer::getChildrenCount() const { size_t count = 0; for (const sp<Layer>& child : mCurrentChildren) { count += 1 + child->getChildrenCount(); } return count; } void Layer::addChild(const sp<Layer>& layer) { mCurrentChildren.add(layer); layer->setParent(this); Loading services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -519,6 +519,7 @@ public: const LayerVector::Visitor& visitor); void traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor); size_t getChildrenCount() const; void addChild(const sp<Layer>& layer); // Returns index if removed, or negative value otherwise // for symmetry with Vector::remove Loading services/surfaceflinger/SurfaceFlinger.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -2656,8 +2656,13 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, if (parent == nullptr) { mCurrentState.layersSortedByZ.add(lbc); } else { if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) { ALOGE("addClientLayer called with a removed parent"); return NAME_NOT_FOUND; } parent->addChild(lbc); } mGraphicBufferProducerList.add(IInterface::asBinder(gbc)); mLayersAdded = true; mNumLayers++; Loading @@ -2676,6 +2681,17 @@ status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { const ssize_t index = (p != nullptr) ? p->removeChild(layer) : mCurrentState.layersSortedByZ.remove(layer); if (p != nullptr) { sp<Layer> ancestor = p; while (ancestor->getParent() != nullptr) { ancestor = ancestor->getParent(); } if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) { ALOGE("removeLayer called with a layer whose parent has been removed"); return NAME_NOT_FOUND; } } // As a matter of normal operation, the LayerCleaner will produce a second // attempt to remove the surface. The Layer will be kept alive in mDrawingState // so we will succeed in promoting it, but it's already been removed Loading @@ -2692,7 +2708,7 @@ status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { mLayersPendingRemoval.add(layer); mLayersRemoved = true; mNumLayers--; mNumLayers -= 1 + layer->getChildrenCount(); setTransactionFlags(eTransactionNeeded); return NO_ERROR; } Loading Loading
services/surfaceflinger/Layer.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -2523,6 +2523,14 @@ bool Layer::getTransformToDisplayInverse() const { return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); } size_t Layer::getChildrenCount() const { size_t count = 0; for (const sp<Layer>& child : mCurrentChildren) { count += 1 + child->getChildrenCount(); } return count; } void Layer::addChild(const sp<Layer>& layer) { mCurrentChildren.add(layer); layer->setParent(this); Loading
services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -519,6 +519,7 @@ public: const LayerVector::Visitor& visitor); void traverseInZOrder(LayerVector::StateSet stateSet, const LayerVector::Visitor& visitor); size_t getChildrenCount() const; void addChild(const sp<Layer>& layer); // Returns index if removed, or negative value otherwise // for symmetry with Vector::remove Loading
services/surfaceflinger/SurfaceFlinger.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -2656,8 +2656,13 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, if (parent == nullptr) { mCurrentState.layersSortedByZ.add(lbc); } else { if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) { ALOGE("addClientLayer called with a removed parent"); return NAME_NOT_FOUND; } parent->addChild(lbc); } mGraphicBufferProducerList.add(IInterface::asBinder(gbc)); mLayersAdded = true; mNumLayers++; Loading @@ -2676,6 +2681,17 @@ status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { const ssize_t index = (p != nullptr) ? p->removeChild(layer) : mCurrentState.layersSortedByZ.remove(layer); if (p != nullptr) { sp<Layer> ancestor = p; while (ancestor->getParent() != nullptr) { ancestor = ancestor->getParent(); } if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) { ALOGE("removeLayer called with a layer whose parent has been removed"); return NAME_NOT_FOUND; } } // As a matter of normal operation, the LayerCleaner will produce a second // attempt to remove the surface. The Layer will be kept alive in mDrawingState // so we will succeed in promoting it, but it's already been removed Loading @@ -2692,7 +2708,7 @@ status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) { mLayersPendingRemoval.add(layer); mLayersRemoved = true; mNumLayers--; mNumLayers -= 1 + layer->getChildrenCount(); setTransactionFlags(eTransactionNeeded); return NO_ERROR; } Loading