Loading services/surfaceflinger/Layer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -254,6 +254,7 @@ void Layer::addToCurrentState() { if (mRemovedFromDrawingState) { mRemovedFromDrawingState = false; mFlinger->mScheduler->registerLayer(this); mFlinger->removeFromOffscreenLayers(this); } for (const auto& child : mCurrentChildren) { Loading services/surfaceflinger/SurfaceFlinger.cpp +6 −13 Original line number Diff line number Diff line Loading @@ -3254,17 +3254,6 @@ void SurfaceFlinger::commitTransactionLocked() { } } // TODO(b/163019109): See if this traversal is needed at all... if (!mOffscreenLayers.empty()) { mDrawingState.traverse([&](Layer* layer) { // If the layer can be reached when traversing mDrawingState, then the layer is no // longer offscreen. Remove the layer from the offscreenLayer set. if (mOffscreenLayers.count(layer)) { mOffscreenLayers.erase(layer); } }); } commitOffscreenLayers(); mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); } Loading Loading @@ -6623,7 +6612,7 @@ void SurfaceFlinger::onLayerFirstRef(Layer* layer) { void SurfaceFlinger::onLayerDestroyed(Layer* layer) { mNumLayers--; removeFromOffscreenLayers(layer); removeHierarchyFromOffscreenLayers(layer); if (!layer->isRemovedFromCurrentState()) { mScheduler->deregisterLayer(layer); } Loading @@ -6636,13 +6625,17 @@ void SurfaceFlinger::onLayerDestroyed(Layer* layer) { // from dangling children layers such that they are not reachable from the // Drawing state nor the offscreen layer list // See b/141111965 void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { void SurfaceFlinger::removeHierarchyFromOffscreenLayers(Layer* layer) { for (auto& child : layer->getCurrentChildren()) { mOffscreenLayers.emplace(child.get()); } mOffscreenLayers.erase(layer); } void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { mOffscreenLayers.erase(layer); } status_t SurfaceFlinger::setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor, float lightPosY, float lightPosZ, float lightRadius) { Loading services/surfaceflinger/SurfaceFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,7 @@ public: void onLayerFirstRef(Layer*); void onLayerDestroyed(Layer*); void removeHierarchyFromOffscreenLayers(Layer* layer); void removeFromOffscreenLayers(Layer* layer); TransactionCallbackInvoker& getTransactionCallbackInvoker() { Loading Loading
services/surfaceflinger/Layer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -254,6 +254,7 @@ void Layer::addToCurrentState() { if (mRemovedFromDrawingState) { mRemovedFromDrawingState = false; mFlinger->mScheduler->registerLayer(this); mFlinger->removeFromOffscreenLayers(this); } for (const auto& child : mCurrentChildren) { Loading
services/surfaceflinger/SurfaceFlinger.cpp +6 −13 Original line number Diff line number Diff line Loading @@ -3254,17 +3254,6 @@ void SurfaceFlinger::commitTransactionLocked() { } } // TODO(b/163019109): See if this traversal is needed at all... if (!mOffscreenLayers.empty()) { mDrawingState.traverse([&](Layer* layer) { // If the layer can be reached when traversing mDrawingState, then the layer is no // longer offscreen. Remove the layer from the offscreenLayer set. if (mOffscreenLayers.count(layer)) { mOffscreenLayers.erase(layer); } }); } commitOffscreenLayers(); mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); } Loading Loading @@ -6623,7 +6612,7 @@ void SurfaceFlinger::onLayerFirstRef(Layer* layer) { void SurfaceFlinger::onLayerDestroyed(Layer* layer) { mNumLayers--; removeFromOffscreenLayers(layer); removeHierarchyFromOffscreenLayers(layer); if (!layer->isRemovedFromCurrentState()) { mScheduler->deregisterLayer(layer); } Loading @@ -6636,13 +6625,17 @@ void SurfaceFlinger::onLayerDestroyed(Layer* layer) { // from dangling children layers such that they are not reachable from the // Drawing state nor the offscreen layer list // See b/141111965 void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { void SurfaceFlinger::removeHierarchyFromOffscreenLayers(Layer* layer) { for (auto& child : layer->getCurrentChildren()) { mOffscreenLayers.emplace(child.get()); } mOffscreenLayers.erase(layer); } void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { mOffscreenLayers.erase(layer); } status_t SurfaceFlinger::setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor, float lightPosY, float lightPosZ, float lightRadius) { Loading
services/surfaceflinger/SurfaceFlinger.h +1 −0 Original line number Diff line number Diff line Loading @@ -313,6 +313,7 @@ public: void onLayerFirstRef(Layer*); void onLayerDestroyed(Layer*); void removeHierarchyFromOffscreenLayers(Layer* layer); void removeFromOffscreenLayers(Layer* layer); TransactionCallbackInvoker& getTransactionCallbackInvoker() { Loading