diff options
author | John Reck <jreck@google.com> | 2014-07-01 14:21:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-06-30 22:27:39 +0000 |
commit | d907e5b1efeae51c302fd502f42a06bd16d6cae3 (patch) | |
tree | 7d2c73f6e9ca8e44cca05d6cac35226279b8c78c /core/java/android/view | |
parent | 1928aabc090f11f2a08d62ff3133619786d78ae4 (diff) | |
parent | f47a594f5250b1914c36423ee6b371f0b8db09d0 (diff) | |
download | frameworks_base-d907e5b1efeae51c302fd502f42a06bd16d6cae3.zip frameworks_base-d907e5b1efeae51c302fd502f42a06bd16d6cae3.tar.gz frameworks_base-d907e5b1efeae51c302fd502f42a06bd16d6cae3.tar.bz2 |
Merge "Fix onTrimMemory for HardwareRenderer"
Diffstat (limited to 'core/java/android/view')
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 25 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 40 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 21 | ||||
-rw-r--r-- | core/java/android/view/View.java | 4 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 14 | ||||
-rw-r--r-- | core/java/android/view/WindowManagerGlobal.java | 46 |
6 files changed, 48 insertions, 102 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index dcd9ba9..d7d3c72 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -203,31 +203,6 @@ class GLES20Canvas extends HardwareCanvas { private static native int nCallDrawGLFunction(long renderer, long drawGLFunction); /////////////////////////////////////////////////////////////////////////// - // Memory - /////////////////////////////////////////////////////////////////////////// - - /** - * Must match Caches::FlushMode values - * - * @see #flushCaches(int) - */ - static final int FLUSH_CACHES_LAYERS = 0; - - /** - * Must match Caches::FlushMode values - * - * @see #flushCaches(int) - */ - static final int FLUSH_CACHES_MODERATE = 1; - - /** - * Must match Caches::FlushMode values - * - * @see #flushCaches(int) - */ - static final int FLUSH_CACHES_FULL = 2; - - /////////////////////////////////////////////////////////////////////////// // Display list /////////////////////////////////////////////////////////////////////////// diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index e9bdcae..d69d01d 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -18,8 +18,6 @@ package android.view; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Rect; -import android.graphics.SurfaceTexture; import android.util.DisplayMetrics; import android.view.Surface.OutOfResourcesException; @@ -200,10 +198,8 @@ public abstract class HardwareRenderer { /** * Destroys the hardware rendering context. - * - * @param full If true, destroys all associated resources. */ - abstract void destroy(boolean full); + abstract void destroy(); /** * Initializes the hardware renderer for the specified surface. @@ -435,28 +431,7 @@ public abstract class HardwareRenderer { * see {@link android.content.ComponentCallbacks} */ static void trimMemory(int level) { - startTrimMemory(level); - endTrimMemory(); - } - - /** - * Starts the process of trimming memory. Usually this call will setup - * hardware rendering context and reclaim memory.Extra cleanup might - * be required by calling {@link #endTrimMemory()}. - * - * @param level Hint about the amount of memory that should be trimmed, - * see {@link android.content.ComponentCallbacks} - */ - static void startTrimMemory(int level) { - ThreadedRenderer.startTrimMemory(level); - } - - /** - * Finishes the process of trimming memory. This method will usually - * cleanup special resources used by the memory trimming process. - */ - static void endTrimMemory() { - ThreadedRenderer.endTrimMemory(); + ThreadedRenderer.trimMemory(level); } /** @@ -503,8 +478,15 @@ public abstract class HardwareRenderer { abstract void fence(); /** + * Prevents any further drawing until draw() is called. This is a signal + * that the contents of the RenderNode tree are no longer safe to play back. + * In practice this usually means that there are Functor pointers in the + * display list that are no longer valid. + */ + abstract void stopDrawing(); + + /** * Called by {@link ViewRootImpl} when a new performTraverals is scheduled. */ - public void notifyFramePending() { - } + abstract void notifyFramePending(); } diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index c3e7a6d..57d1beb 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -90,7 +90,7 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override - void destroy(boolean full) { + void destroy() { mInitialized = false; updateEnabledState(null); nDestroyCanvasAndSurface(mNativeProxy); @@ -127,7 +127,7 @@ public class ThreadedRenderer extends HardwareRenderer { @Override void destroyHardwareResources(View view) { destroyResources(view); - nFlushCaches(mNativeProxy, GLES20Canvas.FLUSH_CACHES_LAYERS); + nDestroyHardwareResources(mNativeProxy); } private static void destroyResources(View view) { @@ -291,6 +291,11 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override + void stopDrawing() { + nStopDrawing(mNativeProxy); + } + + @Override public void notifyFramePending() { nNotifyFramePending(mNativeProxy); } @@ -305,12 +310,8 @@ public class ThreadedRenderer extends HardwareRenderer { } } - static void startTrimMemory(int level) { - // TODO - } - - static void endTrimMemory() { - // TODO + static void trimMemory(int level) { + nTrimMemory(level); } private static class AtlasInitializer { @@ -405,9 +406,11 @@ public class ThreadedRenderer extends HardwareRenderer { private static native void nCancelLayerUpdate(long nativeProxy, long layer); private static native void nDetachSurfaceTexture(long nativeProxy, long layer); - private static native void nFlushCaches(long nativeProxy, int flushMode); + private static native void nDestroyHardwareResources(long nativeProxy); + private static native void nTrimMemory(int level); private static native void nFence(long nativeProxy); + private static native void nStopDrawing(long nativeProxy); private static native void nNotifyFramePending(long nativeProxy); private static native void nDumpProfileInfo(long nativeProxy, FileDescriptor fd); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index d11d17e..d544804 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -13628,7 +13628,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ protected void destroyHardwareResources() { - resetDisplayList(); + // Intentionally empty. RenderNode's lifecycle is now fully managed + // by the hardware renderer. + // However some subclasses (eg, WebView, TextureView) still need this signal } /** diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 4c9d3f9..3219330 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -632,21 +632,17 @@ public final class ViewRootImpl implements ViewParent, void destroyHardwareResources() { if (mAttachInfo.mHardwareRenderer != null) { mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView); - mAttachInfo.mHardwareRenderer.destroy(false); + mAttachInfo.mHardwareRenderer.destroy(); } } - void destroyHardwareLayers() { - // TODO Implement - } - public void detachFunctor(long functor) { // TODO: Make the resize buffer some other way to not need this block mBlockResizeBuffer = true; if (mAttachInfo.mHardwareRenderer != null) { // Fence so that any pending invokeFunctor() messages will be processed // before we return from detachFunctor. - mAttachInfo.mHardwareRenderer.fence(); + mAttachInfo.mHardwareRenderer.stopDrawing(); } } @@ -696,7 +692,7 @@ public final class ViewRootImpl implements ViewParent, if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled && forceHwAccelerated)) { if (mAttachInfo.mHardwareRenderer != null) { - mAttachInfo.mHardwareRenderer.destroy(true); + mAttachInfo.mHardwareRenderer.destroy(); } final boolean translucent = attrs.format != PixelFormat.OPAQUE; @@ -1613,7 +1609,7 @@ public final class ViewRootImpl implements ViewParent, // Our surface is gone if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { - mAttachInfo.mHardwareRenderer.destroy(true); + mAttachInfo.mHardwareRenderer.destroy(); } } else if (surfaceGenerationId != mSurface.getGenerationId() && mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) { @@ -5436,7 +5432,7 @@ public final class ViewRootImpl implements ViewParent, if (mView != null) { hardwareRenderer.destroyHardwareResources(mView); } - hardwareRenderer.destroy(true); + hardwareRenderer.destroy(); hardwareRenderer.setRequested(false); attachInfo.mHardwareRenderer = null; diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index 0ebf2e1..74bc186 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -20,7 +20,6 @@ import android.animation.ValueAnimator; import android.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.res.Configuration; -import android.opengl.ManagedEGLContext; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -114,7 +113,6 @@ public final class WindowManagerGlobal { private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private final ArraySet<View> mDyingViews = new ArraySet<View>(); - private boolean mNeedsEglTerminate; private Runnable mSystemPropertyUpdater; @@ -377,13 +375,22 @@ public final class WindowManagerGlobal { return index; } - public void startTrimMemory(int level) { + public static boolean shouldDestroyEglContext(int trimLevel) { + // On low-end gfx devices we trim when memory is moderate; + // on high-end devices we do this when low. + if (trimLevel >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) { + return true; + } + if (trimLevel >= ComponentCallbacks2.TRIM_MEMORY_MODERATE + && !ActivityManager.isHighEndGfx()) { + return true; + } + return false; + } + + public void trimMemory(int level) { if (HardwareRenderer.isAvailable()) { - // On low-end gfx devices we trim when memory is moderate; - // on high-end devices we do this when low. - if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE - || (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE - && !ActivityManager.isHighEndGfx())) { + if (shouldDestroyEglContext(level)) { // Destroy all hardware surfaces and resources associated to // known windows synchronized (mLock) { @@ -392,29 +399,10 @@ public final class WindowManagerGlobal { } } // Force a full memory flush - mNeedsEglTerminate = true; - HardwareRenderer.startTrimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE); - return; + level = ComponentCallbacks2.TRIM_MEMORY_COMPLETE; } - HardwareRenderer.startTrimMemory(level); - } - } - - public void endTrimMemory() { - HardwareRenderer.endTrimMemory(); - - if (mNeedsEglTerminate) { - ManagedEGLContext.doTerminate(); - mNeedsEglTerminate = false; - } - } - - public void trimLocalMemory() { - synchronized (mLock) { - for (int i = mRoots.size() - 1; i >= 0; --i) { - mRoots.get(i).destroyHardwareLayers(); - } + HardwareRenderer.trimMemory(level); } } |