Loading services/surfaceflinger/Layer.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -833,6 +833,14 @@ bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relati return false; } if (CC_UNLIKELY(relative->usingRelativeZ(LayerVector::StateSet::Drawing)) && (relative->mDrawingState.zOrderRelativeOf == this)) { ALOGE("Detected relative layer loop between %s and %s", mName.c_str(), relative->mName.c_str()); ALOGE("Ignoring new call to set relative layer"); return false; } mFlinger->mSomeChildrenChanged = true; mDrawingState.sequence++; Loading Loading @@ -1990,6 +1998,18 @@ void Layer::prepareShadowClientComposition(LayerFE::LayerSettings& caster, } } bool Layer::findInHierarchy(const sp<Layer>& l) { if (l == this) { return true; } for (auto& child : mDrawingChildren) { if (child->findInHierarchy(l)) { return true; } } return false; } void Layer::commitChildList() { for (size_t i = 0; i < mCurrentChildren.size(); i++) { const auto& child = mCurrentChildren[i]; Loading @@ -1997,6 +2017,17 @@ void Layer::commitChildList() { } mDrawingChildren = mCurrentChildren; mDrawingParent = mCurrentParent; if (CC_UNLIKELY(usingRelativeZ(LayerVector::StateSet::Drawing))) { auto zOrderRelativeOf = mDrawingState.zOrderRelativeOf.promote(); if (zOrderRelativeOf == nullptr) return; if (findInHierarchy(zOrderRelativeOf)) { ALOGE("Detected Z ordering loop between %s and %s", mName.c_str(), zOrderRelativeOf->mName.c_str()); ALOGE("Severing rel Z loop, potentially dangerous"); mDrawingState.isRelativeOf = false; zOrderRelativeOf->removeZOrderRelative(this); } } } Loading services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -1138,6 +1138,7 @@ private: bool mIsAtRoot = false; uint32_t mLayerCreationFlags; bool findInHierarchy(const sp<Layer>&); }; std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate); Loading Loading
services/surfaceflinger/Layer.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -833,6 +833,14 @@ bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relati return false; } if (CC_UNLIKELY(relative->usingRelativeZ(LayerVector::StateSet::Drawing)) && (relative->mDrawingState.zOrderRelativeOf == this)) { ALOGE("Detected relative layer loop between %s and %s", mName.c_str(), relative->mName.c_str()); ALOGE("Ignoring new call to set relative layer"); return false; } mFlinger->mSomeChildrenChanged = true; mDrawingState.sequence++; Loading Loading @@ -1990,6 +1998,18 @@ void Layer::prepareShadowClientComposition(LayerFE::LayerSettings& caster, } } bool Layer::findInHierarchy(const sp<Layer>& l) { if (l == this) { return true; } for (auto& child : mDrawingChildren) { if (child->findInHierarchy(l)) { return true; } } return false; } void Layer::commitChildList() { for (size_t i = 0; i < mCurrentChildren.size(); i++) { const auto& child = mCurrentChildren[i]; Loading @@ -1997,6 +2017,17 @@ void Layer::commitChildList() { } mDrawingChildren = mCurrentChildren; mDrawingParent = mCurrentParent; if (CC_UNLIKELY(usingRelativeZ(LayerVector::StateSet::Drawing))) { auto zOrderRelativeOf = mDrawingState.zOrderRelativeOf.promote(); if (zOrderRelativeOf == nullptr) return; if (findInHierarchy(zOrderRelativeOf)) { ALOGE("Detected Z ordering loop between %s and %s", mName.c_str(), zOrderRelativeOf->mName.c_str()); ALOGE("Severing rel Z loop, potentially dangerous"); mDrawingState.isRelativeOf = false; zOrderRelativeOf->removeZOrderRelative(this); } } } Loading
services/surfaceflinger/Layer.h +1 −0 Original line number Diff line number Diff line Loading @@ -1138,6 +1138,7 @@ private: bool mIsAtRoot = false; uint32_t mLayerCreationFlags; bool findInHierarchy(const sp<Layer>&); }; std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate); Loading