summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/GLES20Canvas.java6
-rw-r--r--core/java/android/view/HardwareCanvas.java9
-rw-r--r--core/java/android/view/HardwareRenderer.java14
-rw-r--r--core/java/android/view/View.java10
-rw-r--r--core/java/android/view/ViewRootImpl.java18
5 files changed, 53 insertions, 4 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 88539f211be1..e5a626350d87 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -163,6 +163,11 @@ class GLES20Canvas extends HardwareCanvas {
}
@Override
+ void flushLayerUpdates() {
+ nFlushLayerUpdates(mRenderer);
+ }
+
+ @Override
void clearLayerUpdates() {
nClearLayerUpdates(mRenderer);
}
@@ -184,6 +189,7 @@ class GLES20Canvas extends HardwareCanvas {
static native boolean nCopyLayer(int layerId, int bitmap);
private static native void nClearLayerUpdates(int renderer);
+ private static native void nFlushLayerUpdates(int renderer);
private static native void nPushLayerUpdate(int renderer, int layer);
///////////////////////////////////////////////////////////////////////////
diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java
index 0dfed69934a4..88b0986bd3b5 100644
--- a/core/java/android/view/HardwareCanvas.java
+++ b/core/java/android/view/HardwareCanvas.java
@@ -202,6 +202,15 @@ public abstract class HardwareCanvas extends Canvas {
abstract void pushLayerUpdate(HardwareLayer layer);
/**
+ * Immediately executes all enqueued layer updates.
+ *
+ * @see #pushLayerUpdate(HardwareLayer)
+ *
+ * @hide
+ */
+ abstract void flushLayerUpdates();
+
+ /**
* Removes all enqueued layer updates.
*
* @see #pushLayerUpdate(HardwareLayer)
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index c07b18770899..4bbf1a614a84 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -449,10 +449,19 @@ public abstract class HardwareRenderer {
* as soon as possible.
*
* @param layer The hardware layer that needs an update
+ *
+ * @see #flushLayerUpdates()
*/
abstract void pushLayerUpdate(HardwareLayer layer);
/**
+ * Forces all enqueued layer updates to be executed immediately.
+ *
+ * @see #pushLayerUpdate(HardwareLayer)
+ */
+ abstract void flushLayerUpdates();
+
+ /**
* Interface used to receive callbacks whenever a view is drawn by
* a hardware renderer instance.
*/
@@ -2124,6 +2133,11 @@ public abstract class HardwareRenderer {
}
@Override
+ void flushLayerUpdates() {
+ mGlCanvas.flushLayerUpdates();
+ }
+
+ @Override
public DisplayList createDisplayList(String name) {
return new GLES20DisplayList(name);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index e860dcaab2e4..192492bb12c6 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -12615,16 +12615,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void buildLayer() {
if (mLayerType == LAYER_TYPE_NONE) return;
- if (mAttachInfo == null) {
+ final AttachInfo attachInfo = mAttachInfo;
+ if (attachInfo == null) {
throw new IllegalStateException("This view must be attached to a window first");
}
switch (mLayerType) {
case LAYER_TYPE_HARDWARE:
- if (mAttachInfo.mHardwareRenderer != null &&
- mAttachInfo.mHardwareRenderer.isEnabled() &&
- mAttachInfo.mHardwareRenderer.validate()) {
+ if (attachInfo.mHardwareRenderer != null &&
+ attachInfo.mHardwareRenderer.isEnabled() &&
+ attachInfo.mHardwareRenderer.validate()) {
getHardwareLayer();
+ attachInfo.mViewRootImpl.dispatchFlushHardwareLayerUpdates();
}
break;
case LAYER_TYPE_SOFTWARE:
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 60d8a75c749c..c28eb98776dd 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -640,6 +640,18 @@ public final class ViewRootImpl implements ViewParent,
}
}
+ void flushHardwareLayerUpdates() {
+ if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled() &&
+ mAttachInfo.mHardwareRenderer.validate()) {
+ mAttachInfo.mHardwareRenderer.flushLayerUpdates();
+ }
+ }
+
+ void dispatchFlushHardwareLayerUpdates() {
+ mHandler.removeMessages(MSG_FLUSH_LAYER_UPDATES);
+ mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_FLUSH_LAYER_UPDATES));
+ }
+
public boolean attachFunctor(int functor) {
//noinspection SimplifiableIfStatement
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
@@ -2900,6 +2912,7 @@ public final class ViewRootImpl implements ViewParent,
private final static int MSG_DISPATCH_DONE_ANIMATING = 22;
private final static int MSG_INVALIDATE_WORLD = 23;
private final static int MSG_WINDOW_MOVED = 24;
+ private final static int MSG_FLUSH_LAYER_UPDATES = 25;
final class ViewRootHandler extends Handler {
@Override
@@ -2949,6 +2962,8 @@ public final class ViewRootImpl implements ViewParent,
return "MSG_DISPATCH_DONE_ANIMATING";
case MSG_WINDOW_MOVED:
return "MSG_WINDOW_MOVED";
+ case MSG_FLUSH_LAYER_UPDATES:
+ return "MSG_FLUSH_LAYER_UPDATES";
}
return super.getMessageName(message);
}
@@ -3171,6 +3186,9 @@ public final class ViewRootImpl implements ViewParent,
invalidateWorld(mView);
}
} break;
+ case MSG_FLUSH_LAYER_UPDATES: {
+ flushHardwareLayerUpdates();
+ } break;
}
}
}