diff options
author | Romain Guy <romainguy@google.com> | 2012-04-23 15:19:07 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2012-04-23 15:19:07 -0700 |
commit | 19f86e831ee0629b24385b0bb51d27ff91961dd2 (patch) | |
tree | 372630e9c4509df9fadcfdb01519f940edd7ac32 | |
parent | b023bf85a080442117b5dae8d402bce60cd0a610 (diff) | |
download | frameworks_base-19f86e831ee0629b24385b0bb51d27ff91961dd2.zip frameworks_base-19f86e831ee0629b24385b0bb51d27ff91961dd2.tar.gz frameworks_base-19f86e831ee0629b24385b0bb51d27ff91961dd2.tar.bz2 |
Invoke onTrimMemory with an EGL context
Bug #6369600
Change-Id: I3ded47c3688ef2f2873495392c35e898357204da
-rw-r--r-- | core/java/android/app/ActivityThread.java | 9 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 35 | ||||
-rw-r--r-- | core/java/android/view/WindowManagerImpl.java | 13 |
3 files changed, 46 insertions, 11 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 1489b2c..e2e791b 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3765,9 +3765,11 @@ public final class ActivityThread { final void handleTrimMemory(int level) { if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Trimming memory to level: " + level); - WindowManagerImpl.getDefault().trimMemory(level); - ArrayList<ComponentCallbacks2> callbacks; + final WindowManagerImpl windowManager = WindowManagerImpl.getDefault(); + windowManager.startTrimMemory(level); + + ArrayList<ComponentCallbacks2> callbacks; synchronized (mPackages) { callbacks = collectComponentCallbacksLocked(true, null); } @@ -3776,7 +3778,8 @@ public final class ActivityThread { for (int i = 0; i < N; i++) { callbacks.get(i).onTrimMemory(level); } - WindowManagerImpl.getDefault().terminateEgl(); + + windowManager.endTrimMemory(); } private void setupGraphicsSupport(LoadedApk info) { diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 5d9505d..1ec754a 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -484,7 +484,28 @@ public abstract class HardwareRenderer { * see {@link android.content.ComponentCallbacks} */ static void trimMemory(int level) { - Gl20Renderer.trimMemory(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) { + Gl20Renderer.startTrimMemory(level); + } + + /** + * Finishes the process of trimming memory. This method will usually + * cleanup special resources used by the memory trimming process. + */ + static void endTrimMemory() { + Gl20Renderer.endTrimMemory(); } /** @@ -1122,12 +1143,15 @@ public abstract class HardwareRenderer { callbacks.onHardwarePostDraw(canvas); canvas.restoreToCount(saveCount); view.mRecreateDisplayList = false; + mFrameCount++; + if (mDebugDirtyRegions) { if (mDebugPaint == null) { mDebugPaint = new Paint(); mDebugPaint.setColor(0x7fff0000); } + if (dirty != null && (mFrameCount & 1) == 0) { canvas.drawRect(dirty, mDebugPaint); } @@ -1446,7 +1470,7 @@ public abstract class HardwareRenderer { return null; } - static void trimMemory(int level) { + static void startTrimMemory(int level) { if (sEgl == null || sEglConfig == null) return; Gl20RendererEglContext managedContext = @@ -1463,9 +1487,12 @@ public abstract class HardwareRenderer { } else if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_MODERATE); } + } - sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, - EGL_NO_CONTEXT); + static void endTrimMemory() { + if (sEgl != null && sEglDisplay != null) { + sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } } private static void usePbufferSurface(EGLContext eglContext) { diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index 52bd860..a0f1041 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -429,8 +429,10 @@ public class WindowManagerImpl implements WindowManager { /** * @param level See {@link android.content.ComponentCallbacks} + * + * @hide */ - public void trimMemory(int level) { + public void startTrimMemory(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. @@ -447,18 +449,21 @@ public class WindowManagerImpl implements WindowManager { } } // Force a full memory flush - HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE); mNeedsEglTerminate = true; + HardwareRenderer.startTrimMemory(ComponentCallbacks2.TRIM_MEMORY_COMPLETE); return; } - HardwareRenderer.trimMemory(level); + + HardwareRenderer.startTrimMemory(level); } } /** * @hide */ - public void terminateEgl() { + public void endTrimMemory() { + HardwareRenderer.endTrimMemory(); + if (mNeedsEglTerminate) { ManagedEGLContext.doTerminate(); mNeedsEglTerminate = false; |