diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/DisplayList.java | 7 | ||||
| -rw-r--r-- | core/java/android/view/GLES20DisplayList.java | 8 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 6 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 3 |
4 files changed, 24 insertions, 0 deletions
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index a42e156..5e34a36 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -332,4 +332,11 @@ public abstract class DisplayList { * @see View#offsetTopAndBottom(int) */ public abstract void offsetTopBottom(int offset); + + /** + * Reset native resources. This is called when cleaning up the state of DisplayLists + * during destruction of hardware resources, to ensure that we do not hold onto + * obsolete resources after related resources are gone. + */ + public abstract void reset(); } diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index 3bdd5c0..e9bd0c4 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -87,6 +87,13 @@ class GLES20DisplayList extends DisplayList { } @Override + public void reset() { + if (hasNativeDisplayList()) { + nReset(mFinalizer.mNativeDisplayList); + } + } + + @Override public boolean isValid() { return mValid; } @@ -294,6 +301,7 @@ class GLES20DisplayList extends DisplayList { } } + private static native void nReset(int displayList); private static native void nOffsetTopBottom(int displayList, int offset); private static native void nOffsetLeftRight(int displayList, int offset); private static native void nSetLeftTopRightBottom(int displayList, int left, int top, diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 28763b3..99987bf 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -1508,6 +1508,9 @@ public abstract class HardwareRenderer { @Override void destroyLayers(View view) { if (view != null && isEnabled() && checkCurrent() != SURFACE_STATE_ERROR) { + if (mCanvas != null) { + mCanvas.clearLayerUpdates(); + } destroyHardwareLayer(view); GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_LAYERS); } @@ -1556,6 +1559,9 @@ public abstract class HardwareRenderer { safelyRun(new Runnable() { @Override public void run() { + if (mCanvas != null) { + mCanvas.clearLayerUpdates(); + } destroyResources(view); GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_LAYERS); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6eca8fd..4b6f4ea 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12394,6 +12394,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mHardwareLayer.destroy(); mHardwareLayer = null; + if (mDisplayList != null) { + mDisplayList.reset(); + } invalidate(true); invalidateParentCaches(); } |
