summaryrefslogtreecommitdiffstats
path: root/core/java/android/view
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2014-07-01 14:21:39 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-06-30 22:27:39 +0000
commitd907e5b1efeae51c302fd502f42a06bd16d6cae3 (patch)
tree7d2c73f6e9ca8e44cca05d6cac35226279b8c78c /core/java/android/view
parent1928aabc090f11f2a08d62ff3133619786d78ae4 (diff)
parentf47a594f5250b1914c36423ee6b371f0b8db09d0 (diff)
downloadframeworks_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.java25
-rw-r--r--core/java/android/view/HardwareRenderer.java40
-rw-r--r--core/java/android/view/ThreadedRenderer.java21
-rw-r--r--core/java/android/view/View.java4
-rw-r--r--core/java/android/view/ViewRootImpl.java14
-rw-r--r--core/java/android/view/WindowManagerGlobal.java46
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);
}
}