Loading services/surfaceflinger/Layer.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -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--; Loading Loading @@ -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() { Loading Loading @@ -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 Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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) { Loading services/surfaceflinger/Layer.h +1 −1 Original line number Diff line number Diff line Loading @@ -652,7 +652,7 @@ public: gui::WindowInfo::Type getWindowType() const { return mWindowType; } void updateMirrorInfo(); bool updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates); /* * doTransaction - process the transaction. This is a good place to figure Loading services/surfaceflinger/LayerRenderArea.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,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(); }); } Loading services/surfaceflinger/SurfaceFlinger.cpp +31 −8 Original line number Diff line number Diff line Loading @@ -4025,8 +4025,24 @@ void SurfaceFlinger::doCommitTransactions() { } commitOffscreenLayers(); if (mNumClones > 0) { mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); 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->isRemovedFromCurrentState()) { continue; } if (cloneRoot->updateMirrorInfo(pendingUpdates)) { } else { needsUpdating.push_back(cloneRoot); } } for (Layer* cloneRoot : needsUpdating) { cloneRoot->updateMirrorInfo({}); } } } Loading Loading @@ -4133,7 +4149,7 @@ bool SurfaceFlinger::latchBuffers() { mBootStage = BootStage::BOOTANIMATION; } if (mNumClones > 0) { if (mLayerMirrorRoots.size() > 0) { mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); }); } Loading @@ -4158,8 +4174,8 @@ status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinde leakingParentLayerFound = true; sp<Layer> parent = sp<Layer>::fromExisting(layer); while (parent) { ALOGE("Parent Layer: %s handleIsAlive: %s", parent->getName().c_str(), std::to_string(parent->isHandleAlive()).c_str()); ALOGE("Parent Layer: %s%s", parent->getName().c_str(), (parent->isHandleAlive() ? "handleAlive" : "")); parent = parent->getParent(); } // Sample up to 100 layers Loading @@ -4174,21 +4190,28 @@ status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinde } }); ALOGE("Dumping random sampling of on-screen layers: "); int numLayers = 0; mDrawingState.traverse([&](Layer* layer) { numLayers++; }); ALOGE("Dumping random sampling of on-screen layers total(%u):", numLayers); mDrawingState.traverse([&](Layer* layer) { // Aim to dump about 200 layers to avoid totally trashing // logcat. On the other hand, if there really are 4096 layers // something has gone totally wrong its probably the most // useful information in logcat. if (rand() % 20 == 13) { ALOGE("Layer: %s", layer->getName().c_str()); ALOGE("Layer: %s%s", layer->getName().c_str(), (layer->isHandleAlive() ? "handleAlive" : "")); std::this_thread::sleep_for(std::chrono::milliseconds(5)); } }); ALOGE("Dumping random sampling of off-screen layers total(%zu): ", mOffscreenLayers.size()); for (Layer* offscreenLayer : mOffscreenLayers) { if (rand() % 20 == 13) { ALOGE("Offscreen-layer: %s", offscreenLayer->getName().c_str()); ALOGE("Offscreen-layer: %s%s", offscreenLayer->getName().c_str(), (offscreenLayer->isHandleAlive() ? "handleAlive" : "")); std::this_thread::sleep_for(std::chrono::milliseconds(5)); } } })); Loading services/surfaceflinger/SurfaceFlinger.h +1 −2 Original line number Diff line number Diff line Loading @@ -296,8 +296,7 @@ public: // the client can no longer modify this layer directly. void onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32_t layerId); // TODO: Remove atomic if move dtor to main thread CL lands std::atomic<uint32_t> mNumClones; std::vector<Layer*> mLayerMirrorRoots; TransactionCallbackInvoker& getTransactionCallbackInvoker() { return mTransactionCallbackInvoker; Loading Loading
services/surfaceflinger/Layer.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -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--; Loading Loading @@ -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() { Loading Loading @@ -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 Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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) { Loading
services/surfaceflinger/Layer.h +1 −1 Original line number Diff line number Diff line Loading @@ -652,7 +652,7 @@ public: gui::WindowInfo::Type getWindowType() const { return mWindowType; } void updateMirrorInfo(); bool updateMirrorInfo(const std::deque<Layer*>& cloneRootsPendingUpdates); /* * doTransaction - process the transaction. This is a good place to figure Loading
services/surfaceflinger/LayerRenderArea.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,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(); }); } Loading
services/surfaceflinger/SurfaceFlinger.cpp +31 −8 Original line number Diff line number Diff line Loading @@ -4025,8 +4025,24 @@ void SurfaceFlinger::doCommitTransactions() { } commitOffscreenLayers(); if (mNumClones > 0) { mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); 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->isRemovedFromCurrentState()) { continue; } if (cloneRoot->updateMirrorInfo(pendingUpdates)) { } else { needsUpdating.push_back(cloneRoot); } } for (Layer* cloneRoot : needsUpdating) { cloneRoot->updateMirrorInfo({}); } } } Loading Loading @@ -4133,7 +4149,7 @@ bool SurfaceFlinger::latchBuffers() { mBootStage = BootStage::BOOTANIMATION; } if (mNumClones > 0) { if (mLayerMirrorRoots.size() > 0) { mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); }); } Loading @@ -4158,8 +4174,8 @@ status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinde leakingParentLayerFound = true; sp<Layer> parent = sp<Layer>::fromExisting(layer); while (parent) { ALOGE("Parent Layer: %s handleIsAlive: %s", parent->getName().c_str(), std::to_string(parent->isHandleAlive()).c_str()); ALOGE("Parent Layer: %s%s", parent->getName().c_str(), (parent->isHandleAlive() ? "handleAlive" : "")); parent = parent->getParent(); } // Sample up to 100 layers Loading @@ -4174,21 +4190,28 @@ status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinde } }); ALOGE("Dumping random sampling of on-screen layers: "); int numLayers = 0; mDrawingState.traverse([&](Layer* layer) { numLayers++; }); ALOGE("Dumping random sampling of on-screen layers total(%u):", numLayers); mDrawingState.traverse([&](Layer* layer) { // Aim to dump about 200 layers to avoid totally trashing // logcat. On the other hand, if there really are 4096 layers // something has gone totally wrong its probably the most // useful information in logcat. if (rand() % 20 == 13) { ALOGE("Layer: %s", layer->getName().c_str()); ALOGE("Layer: %s%s", layer->getName().c_str(), (layer->isHandleAlive() ? "handleAlive" : "")); std::this_thread::sleep_for(std::chrono::milliseconds(5)); } }); ALOGE("Dumping random sampling of off-screen layers total(%zu): ", mOffscreenLayers.size()); for (Layer* offscreenLayer : mOffscreenLayers) { if (rand() % 20 == 13) { ALOGE("Offscreen-layer: %s", offscreenLayer->getName().c_str()); ALOGE("Offscreen-layer: %s%s", offscreenLayer->getName().c_str(), (offscreenLayer->isHandleAlive() ? "handleAlive" : "")); std::this_thread::sleep_for(std::chrono::milliseconds(5)); } } })); Loading
services/surfaceflinger/SurfaceFlinger.h +1 −2 Original line number Diff line number Diff line Loading @@ -296,8 +296,7 @@ public: // the client can no longer modify this layer directly. void onHandleDestroyed(BBinder* handle, sp<Layer>& layer, uint32_t layerId); // TODO: Remove atomic if move dtor to main thread CL lands std::atomic<uint32_t> mNumClones; std::vector<Layer*> mLayerMirrorRoots; TransactionCallbackInvoker& getTransactionCallbackInvoker() { return mTransactionCallbackInvoker; Loading