diff options
Diffstat (limited to 'core/java/android/view')
-rw-r--r-- | core/java/android/view/DisplayList.java | 34 | ||||
-rw-r--r-- | core/java/android/view/GLRenderer.java | 6 | ||||
-rw-r--r-- | core/java/android/view/HardwareLayer.java | 2 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 2 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 6 | ||||
-rw-r--r-- | core/java/android/view/View.java | 5 |
6 files changed, 35 insertions, 20 deletions
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index 0ae36c1..be6f401 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -122,9 +122,6 @@ import android.graphics.Path; * @hide */ public class DisplayList { - private boolean mValid; - private final long mNativeDisplayList; - /** * Flag used when calling * {@link HardwareCanvas#drawDisplayList(DisplayList, android.graphics.Rect, int)} @@ -175,6 +172,10 @@ public class DisplayList { */ public static final int STATUS_DREW = 0x4; + private boolean mValid; + private final long mNativeDisplayList; + private HardwareRenderer mRenderer; + private DisplayList(String name) { mNativeDisplayList = nCreate(); nSetDisplayListName(mNativeDisplayList, name); @@ -233,7 +234,13 @@ public class DisplayList { GLES20RecordingCanvas canvas = (GLES20RecordingCanvas) endCanvas; canvas.onPostDraw(); long displayListData = canvas.finishRecording(); - renderer.swapDisplayListData(mNativeDisplayList, displayListData); + if (renderer != mRenderer) { + // If we are changing renderers first destroy with the old + // renderer, then set with the new one + destroyDisplayListData(); + } + mRenderer = renderer; + setDisplayListData(displayListData); canvas.recycle(); mValid = true; } @@ -245,14 +252,22 @@ public class DisplayList { * * @hide */ - public void destroyDisplayListData(HardwareRenderer renderer) { - if (renderer == null) { - throw new IllegalArgumentException("Cannot destroyDisplayListData with a null renderer"); - } - renderer.swapDisplayListData(mNativeDisplayList, 0); + public void destroyDisplayListData() { + if (!mValid) return; + + setDisplayListData(0); + mRenderer = null; mValid = false; } + private void setDisplayListData(long newData) { + if (mRenderer != null) { + mRenderer.setDisplayListData(mNativeDisplayList, newData); + } else { + throw new IllegalStateException("Trying to set data without a renderer! data=" + newData); + } + } + /** * Returns whether the display list is currently usable. If this returns false, * the display list should be re-recorded prior to replaying it. @@ -907,6 +922,7 @@ public class DisplayList { @Override protected void finalize() throws Throwable { try { + destroyDisplayListData(); nDestroyDisplayList(mNativeDisplayList); } finally { super.finalize(); diff --git a/core/java/android/view/GLRenderer.java b/core/java/android/view/GLRenderer.java index c90e4b0..81f778d 100644 --- a/core/java/android/view/GLRenderer.java +++ b/core/java/android/view/GLRenderer.java @@ -1196,10 +1196,10 @@ public class GLRenderer extends HardwareRenderer { } } - void swapDisplayListData(long displayList, long newData) { - nSwapDisplayListData(displayList, newData); + void setDisplayListData(long displayList, long newData) { + nSetDisplayListData(displayList, newData); } - private static native void nSwapDisplayListData(long displayList, long newData); + private static native void nSetDisplayListData(long displayList, long newData); private DisplayList buildDisplayList(View view, HardwareCanvas canvas) { if (mDrawDelta <= 0) { diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index c526dd2..46e2690 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -88,7 +88,7 @@ final class HardwareLayer { } if (mDisplayList != null) { - mDisplayList.destroyDisplayListData(mRenderer); + mDisplayList.destroyDisplayListData(); mDisplayList = null; } if (mRenderer != null) { diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index bcc28e3..34efcf5 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -562,7 +562,7 @@ public abstract class HardwareRenderer { mRequested = requested; } - abstract void swapDisplayListData(long displayList, long newData); + abstract void setDisplayListData(long displayList, long newData); /** * Describes a series of frames that should be drawn on screen as a graph. diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 3dcfbb3..a1fb123 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -148,8 +148,8 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override - void swapDisplayListData(long displayList, long newData) { - nSwapDisplayListData(mNativeProxy, displayList, newData); + void setDisplayListData(long displayList, long newData) { + nSetDisplayListData(mNativeProxy, displayList, newData); } @Override @@ -257,7 +257,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height); - private static native void nSwapDisplayListData(long nativeProxy, long displayList, + private static native void nSetDisplayListData(long nativeProxy, long displayList, long newData); private static native void nDrawDisplayList(long nativeProxy, long displayList, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 9b45f97..904ec44 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -14062,13 +14062,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private void resetDisplayList() { - HardwareRenderer renderer = getHardwareRenderer(); if (mDisplayList != null && mDisplayList.isValid()) { - mDisplayList.destroyDisplayListData(renderer); + mDisplayList.destroyDisplayListData(); } if (mBackgroundDisplayList != null && mBackgroundDisplayList.isValid()) { - mBackgroundDisplayList.destroyDisplayListData(renderer); + mBackgroundDisplayList.destroyDisplayListData(); } } |