diff options
| author | 2023-05-11 15:46:37 +0000 | |
|---|---|---|
| committer | 2023-05-11 15:46:37 +0000 | |
| commit | 12cda385cfc6650da2b65455e4ce75fea5fe5871 (patch) | |
| tree | b229c1590424024b17b9f25e99ae8ce2b49ad8f7 /services/surfaceflinger/Layer.cpp | |
| parent | a04c0f68ee7623c59f1900b40fa9b464dbfd061a (diff) | |
| parent | 3be61905f09f265de9732eed00985e324540e5b8 (diff) | |
Merge "[sf] Properly update clones of clones" into udc-dev
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index a8214662c6..49532e0f15 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -254,7 +254,8 @@ Layer::~Layer() { mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount(); } if (mHadClonedChild) { - mFlinger->mNumClones--; + auto& roots = mFlinger->mLayerMirrorRoots; + roots.erase(std::remove(roots.begin(), roots.end(), this), roots.end()); } if (hasTrustedPresentationListener()) { mFlinger->mNumTrustedPresentationListeners--; @@ -1649,8 +1650,8 @@ void Layer::getFrameStats(FrameStats* outStats) const { void Layer::dumpOffscreenDebugInfo(std::string& result) const { std::string hasBuffer = hasBufferOrSidebandStream() ? " (contains buffer)" : ""; - StringAppendF(&result, "Layer %s%s pid:%d uid:%d\n", getName().c_str(), hasBuffer.c_str(), - mOwnerPid, mOwnerUid); + StringAppendF(&result, "Layer %s%s pid:%d uid:%d%s\n", getName().c_str(), hasBuffer.c_str(), + mOwnerPid, mOwnerUid, isHandleAlive() ? " handleAlive" : ""); } void Layer::onDisconnect() { @@ -2594,7 +2595,7 @@ void Layer::updateCloneBufferInfo() { mDrawingState.inputInfo = tmpInputInfo; } -void Layer::updateMirrorInfo() { +bool Layer::updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates) { 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 @@ -2602,7 +2603,7 @@ void Layer::updateMirrorInfo() { // 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; + return true; } std::map<sp<Layer>, sp<Layer>> clonedLayersMap; @@ -2617,6 +2618,13 @@ void Layer::updateMirrorInfo() { 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) { @@ -2764,7 +2772,7 @@ bool Layer::isInternalDisplayOverlay() const { void Layer::setClonedChild(const sp<Layer>& clonedChild) { mClonedChild = clonedChild; mHadClonedChild = true; - mFlinger->mNumClones++; + mFlinger->mLayerMirrorRoots.push_back(this); } bool Layer::setDropInputMode(gui::DropInputMode mode) { |