summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-04-23 15:19:07 -0700
committerRomain Guy <romainguy@google.com>2012-04-23 15:19:07 -0700
commit19f86e831ee0629b24385b0bb51d27ff91961dd2 (patch)
tree372630e9c4509df9fadcfdb01519f940edd7ac32
parentb023bf85a080442117b5dae8d402bce60cd0a610 (diff)
downloadframeworks_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.java9
-rw-r--r--core/java/android/view/HardwareRenderer.java35
-rw-r--r--core/java/android/view/WindowManagerImpl.java13
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;