summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
author Chia-I Wu <olv@google.com> 2017-08-16 15:57:15 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-08-16 15:57:15 +0000
commit11e66edfad9fe7aa370e99ceeadbafdd7d563f81 (patch)
treea9efeaf88945fd86baa2df4062d8f46e9b2cbb72 /services/surfaceflinger/Layer.cpp
parent19d9cf4dd83107a84ba35b883939ad47b0fd147d (diff)
parentc665702cea06c5c42360b7f66fed1693127e6680 (diff)
Merge "surfaceflinger: fix z-relative layer destruction" into oc-mr1-dev
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rwxr-xr-xservices/surfaceflinger/Layer.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 4edde14069..038ece2e05 100755
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -202,9 +202,11 @@ Layer::~Layer() {
mFrameTracker.logAndResetStats(mName);
#ifdef USE_HWC2
- ALOGE_IF(!mHwcLayers.empty(),
- "Found stale hardware composer layers when destroying "
- "surface flinger layer");
+ if (!mHwcLayers.empty()) {
+ ALOGE("Found stale hardware composer layers when destroying "
+ "surface flinger layer %s", mName.string());
+ destroyAllHwcLayers();
+ }
#endif
}
@@ -293,20 +295,27 @@ void Layer::onSidebandStreamChanged() {
}
}
-// called with SurfaceFlinger::mStateLock from the drawing thread after
-// the layer has been remove from the current state list (and just before
-// it's removed from the drawing state list)
-void Layer::onRemoved() {
+void Layer::onRemovedFromCurrentState() {
+ // the layer is removed from SF mCurrentState to mLayersPendingRemoval
+
if (mCurrentState.zOrderRelativeOf != nullptr) {
sp<Layer> strongRelative = mCurrentState.zOrderRelativeOf.promote();
if (strongRelative != nullptr) {
strongRelative->removeZOrderRelative(this);
+ mFlinger->setTransactionFlags(eTraversalNeeded);
}
mCurrentState.zOrderRelativeOf = nullptr;
}
- mSurfaceFlingerConsumer->abandon();
+ for (const auto& child : mCurrentChildren) {
+ child->onRemovedFromCurrentState();
+ }
+}
+void Layer::onRemoved() {
+ // the layer is removed from SF mLayersPendingRemoval
+
+ mSurfaceFlingerConsumer->abandon();
#ifdef USE_HWC2
destroyAllHwcLayers();
#endif