diff options
| author | 2016-06-18 02:07:04 +0000 | |
|---|---|---|
| committer | 2016-06-18 02:07:05 +0000 | |
| commit | d11b5e6661ba922cf7b4e02cf72373ea634bb8fe (patch) | |
| tree | bd5c536903d87f8b3aa3a7c7509e7a70b6e0e572 /libs/hwui/RenderNode.cpp | |
| parent | fc275d244e5827641b45f444557bec202ac5560a (diff) | |
| parent | 34bf49e4de4c1994b5d9c19166606bc9b7ad1b9c (diff) | |
Merge "DO NOT MERGE Move SurfaceView offscreen if the app stops drawing it" into nyc-dev
Diffstat (limited to 'libs/hwui/RenderNode.cpp')
| -rw-r--r-- | libs/hwui/RenderNode.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index be2dab98e911..d48d54438ae9 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -464,7 +464,7 @@ void RenderNode::applyLayerPropertiesToLayer(TreeInfo& info) { } #endif -void RenderNode::syncDisplayList(TreeObserver* observer) { +void RenderNode::syncDisplayList(TreeInfo* info) { // Make sure we inc first so that we don't fluctuate between 0 and 1, // which would thrash the layer cache if (mStagingDisplayList) { @@ -472,7 +472,7 @@ void RenderNode::syncDisplayList(TreeObserver* observer) { child->renderNode->incParentRefCount(); } } - deleteDisplayList(observer); + deleteDisplayList(info ? info->observer : nullptr, info); mDisplayList = mStagingDisplayList; mStagingDisplayList = nullptr; if (mDisplayList) { @@ -491,15 +491,15 @@ void RenderNode::pushStagingDisplayListChanges(TreeInfo& info) { // Damage with the old display list first then the new one to catch any // changes in isRenderable or, in the future, bounds damageSelf(info); - syncDisplayList(info.observer); + syncDisplayList(&info); damageSelf(info); } } -void RenderNode::deleteDisplayList(TreeObserver* observer) { +void RenderNode::deleteDisplayList(TreeObserver* observer, TreeInfo* info) { if (mDisplayList) { for (auto&& child : mDisplayList->getChildren()) { - child->renderNode->decParentRefCount(observer); + child->renderNode->decParentRefCount(observer, info); } } delete mDisplayList; @@ -531,35 +531,38 @@ void RenderNode::prepareSubTree(TreeInfo& info, bool functorsNeedLayer, DisplayL } } -void RenderNode::destroyHardwareResources(TreeObserver* observer) { +void RenderNode::destroyHardwareResources(TreeObserver* observer, TreeInfo* info) { if (mLayer) { destroyLayer(mLayer); mLayer = nullptr; } if (mDisplayList) { for (auto&& child : mDisplayList->getChildren()) { - child->renderNode->destroyHardwareResources(observer); + child->renderNode->destroyHardwareResources(observer, info); } if (mNeedsDisplayListSync) { // Next prepare tree we are going to push a new display list, so we can // drop our current one now - deleteDisplayList(observer); + deleteDisplayList(observer, info); } } } -void RenderNode::decParentRefCount(TreeObserver* observer) { +void RenderNode::decParentRefCount(TreeObserver* observer, TreeInfo* info) { LOG_ALWAYS_FATAL_IF(!mParentCount, "already 0!"); mParentCount--; if (!mParentCount) { if (observer) { observer->onMaybeRemovedFromTree(this); } + if (CC_UNLIKELY(mPositionListener.get())) { + mPositionListener->onPositionLost(*this, info); + } // If a child of ours is being attached to our parent then this will incorrectly // destroy its hardware resources. However, this situation is highly unlikely // and the failure is "just" that the layer is re-created, so this should // be safe enough - destroyHardwareResources(observer); + destroyHardwareResources(observer, info); } } |