diff options
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 16 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/LayerRenderArea.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 19 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 |
5 files changed, 11 insertions, 31 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index bbf855154c..9e40d7f136 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -254,8 +254,7 @@ Layer::~Layer() { mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount(); } if (mHadClonedChild) { - auto& roots = mFlinger->mLayerMirrorRoots; - roots.erase(std::remove(roots.begin(), roots.end(), this), roots.end()); + mFlinger->mNumClones--; } if (hasTrustedPresentationListener()) { mFlinger->mNumTrustedPresentationListeners--; @@ -2592,7 +2591,7 @@ void Layer::updateCloneBufferInfo() { mDrawingState.inputInfo = tmpInputInfo; } -bool Layer::updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates) { +void Layer::updateMirrorInfo() { if (mClonedChild == nullptr || !mClonedChild->isClonedFromAlive()) { // If mClonedChild is null, there is nothing to mirror. If isClonedFromAlive returns false, // it means that there is a clone, but the layer it was cloned from has been destroyed. In @@ -2600,7 +2599,7 @@ bool Layer::updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates) // destroyed. The root, this layer, will still be around since the client can continue // to hold a reference, but no cloned layers will be displayed. mClonedChild = nullptr; - return true; + return; } std::map<sp<Layer>, sp<Layer>> clonedLayersMap; @@ -2615,13 +2614,6 @@ bool Layer::updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates) mClonedChild->updateClonedDrawingState(clonedLayersMap); mClonedChild->updateClonedChildren(sp<Layer>::fromExisting(this), clonedLayersMap); mClonedChild->updateClonedRelatives(clonedLayersMap); - - for (Layer* root : cloneRootsPendingUpdates) { - if (clonedLayersMap.find(sp<Layer>::fromExisting(root)) != clonedLayersMap.end()) { - return false; - } - } - return true; } void Layer::updateClonedDrawingState(std::map<sp<Layer>, sp<Layer>>& clonedLayersMap) { @@ -2769,7 +2761,7 @@ bool Layer::isInternalDisplayOverlay() const { void Layer::setClonedChild(const sp<Layer>& clonedChild) { mClonedChild = clonedChild; mHadClonedChild = true; - mFlinger->mLayerMirrorRoots.push_back(this); + mFlinger->mNumClones++; } bool Layer::setDropInputMode(gui::DropInputMode mode) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 41228c757b..b37fa153e9 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -651,7 +651,7 @@ public: gui::WindowInfo::Type getWindowType() const { return mWindowType; } - bool updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates); + void updateMirrorInfo(); /* * doTransaction - process the transaction. This is a good place to figure diff --git a/services/surfaceflinger/LayerRenderArea.cpp b/services/surfaceflinger/LayerRenderArea.cpp index fd56d7a69f..1b8ff28a76 100644 --- a/services/surfaceflinger/LayerRenderArea.cpp +++ b/services/surfaceflinger/LayerRenderArea.cpp @@ -84,7 +84,7 @@ void LayerRenderArea::render(std::function<void()> drawLayers) { // If layer is offscreen, update mirroring info if it exists if (mLayer->isRemovedFromCurrentState()) { mLayer->traverse(LayerVector::StateSet::Drawing, - [&](Layer* layer) { layer->updateMirrorInfo({}); }); + [&](Layer* layer) { layer->updateMirrorInfo(); }); mLayer->traverse(LayerVector::StateSet::Drawing, [&](Layer* layer) { layer->updateCloneBufferInfo(); }); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e20b4cb0aa..48b41448a1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4007,21 +4007,8 @@ void SurfaceFlinger::doCommitTransactions() { } commitOffscreenLayers(); - if (mLayerMirrorRoots.size() > 0) { - std::deque<Layer*> pendingUpdates; - pendingUpdates.insert(pendingUpdates.end(), mLayerMirrorRoots.begin(), - mLayerMirrorRoots.end()); - std::vector<Layer*> needsUpdating; - for (Layer* cloneRoot : mLayerMirrorRoots) { - pendingUpdates.pop_front(); - if (cloneRoot->updateMirrorInfo(pendingUpdates)) { - } else { - needsUpdating.push_back(cloneRoot); - } - } - for (Layer* cloneRoot : needsUpdating) { - cloneRoot->updateMirrorInfo({}); - } + if (mNumClones > 0) { + mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); } } @@ -4128,7 +4115,7 @@ bool SurfaceFlinger::latchBuffers() { mBootStage = BootStage::BOOTANIMATION; } - if (mLayerMirrorRoots.size() > 0) { + if (mNumClones > 0) { mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); }); } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 6855562ad7..fffd63a515 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -296,7 +296,8 @@ public: // the client can no longer modify this layer directly. void onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32_t layerId); - std::vector<Layer*> mLayerMirrorRoots; + // TODO: Remove atomic if move dtor to main thread CL lands + std::atomic<uint32_t> mNumClones; TransactionCallbackInvoker& getTransactionCallbackInvoker() { return mTransactionCallbackInvoker; |