diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 6 | ||||
| -rw-r--r-- | core/java/android/view/HardwareCanvas.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 14 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 10 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 18 |
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; } } } |
