diff options
| -rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 4 | ||||
| -rw-r--r-- | libs/hwui/RenderNode.cpp | 9 |
3 files changed, 10 insertions, 5 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 57d1bebe23a6..fa4564ee7f08 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -127,6 +127,8 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void destroyHardwareResources(View view) { destroyResources(view); + // mRootNode belongs to us and not a view, so we need to destroy it + mRootNode.destroyDisplayListData(); nDestroyHardwareResources(mNativeProxy); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 3b2e1d155371..0ee9e068c69a 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -13625,9 +13625,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ protected void destroyHardwareResources() { - // Intentionally empty. RenderNode's lifecycle is now fully managed - // by the hardware renderer. - // However some subclasses (eg, WebView, TextureView) still need this signal + resetDisplayList(); } /** diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 89105ea19fbd..3cf625fc08eb 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -211,7 +211,8 @@ void RenderNode::prepareTreeImpl(TreeInfo& info) { // This will also release the hardware layer if we have one as // isRenderable() will return false, thus causing pushLayerUpdate // to recycle the hardware layer - setStagingDisplayList(NULL); + LOG_ALWAYS_FATAL_IF(mStagingDisplayListData || (mDisplayListData && !mNeedsDisplayListDataSync), + "View.destroyHardwareResources wasn't called!"); break; } @@ -260,7 +261,11 @@ void RenderNode::pushStagingDisplayListChanges(TreeInfo& info) { mNeedsDisplayListDataSync = false; // Do a push pass on the old tree to handle freeing DisplayListData // that are no longer used - TreeInfo oldTreeInfo(TreeInfo::MODE_MAYBE_DETACHING, info); + TreeInfo::TraversalMode mode = TreeInfo::MODE_MAYBE_DETACHING; + if (CC_UNLIKELY(info.mode == TreeInfo::MODE_DESTROY_RESOURCES)) { + mode = TreeInfo::MODE_DESTROY_RESOURCES; + } + TreeInfo oldTreeInfo(mode, info); prepareSubTree(oldTreeInfo, mDisplayListData); delete mDisplayListData; mDisplayListData = mStagingDisplayListData; |