From a1997201903c44ae3de2ea827e2b801775b8984f Mon Sep 17 00:00:00 2001 From: "henry.uh_chen" Date: Fri, 18 Jul 2014 15:11:18 +0800 Subject: [PATCH] =?UTF-8?q?[View]=20Clear=20Hardware-Layers=20before=20sys?= =?UTF-8?q?tem=20destroys=20HardwareRenderer=E2=80=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptom: Sometimes HardwareLayer display is corrupted. Root Cause: In some cases, ViewRootImpl destroys HardwareRenderer​ without clearing HardwareLayers in the view hirarchy. If the system trims memory fully and kill the glContext at the same time, HardwareLayer may corrupt. Solution: Clear Hardware-Layers before system destroys HardwareRenderer​. Reproduce steps: Modify the cache's trim memory mechanism to make it easier to trim fully, HardwareLayers implemented in app will easily be corrupted. Modification of the cache is not required but make it easier to reproduce. Change-Id: If57c802cdacf8dc37cbbcc199e74f9482834f981 --- core/java/android/view/ViewRootImpl.java | 3 +++ 1 file changed, 3 insertions(+) mode change 100644 => 100755 core/java/android/view/ViewRootImpl.java diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java old mode 100644 new mode 100755 index 5b2a4527aa90d..a946e9ee588bb --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1565,6 +1565,9 @@ public final class ViewRootImpl implements ViewParent, // Our surface is gone if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { + // Destroy hardware layers before hardware renderer is destroyed + mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView); + mAttachInfo.mHardwareRenderer.destroy(true); } } else if (surfaceGenerationId != mSurface.getGenerationId() &&