diff options
| author | Romain Guy <romainguy@google.com> | 2012-09-21 10:50:12 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-09-21 10:50:12 -0700 |
| commit | 3f7c246f3ea85af9fb98cba37387bb55658d4614 (patch) | |
| tree | dc609eab1943a9ec83bc58cc0701496ba3340f31 /core/java | |
| parent | 45b07b9427cc736bf4fd5658ef2f30884ba4d9a4 (diff) | |
| parent | 11cb642756093a4af901b1525375b1eb2b5c3e2b (diff) | |
Merge "Update layers in a single batch at the beginning of a frame Bug #7186819" into jb-mr1-dev
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 15 | ||||
| -rw-r--r-- | core/java/android/view/GLES20RenderLayer.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/GLES20TextureLayer.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/HardwareCanvas.java | 16 | ||||
| -rw-r--r-- | core/java/android/view/HardwareLayer.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 16 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 6 |
8 files changed, 58 insertions, 6 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 032ff7bcd2e4..c703aaf88b50 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -147,7 +147,17 @@ class GLES20Canvas extends HardwareCanvas { /////////////////////////////////////////////////////////////////////////// // Hardware layers /////////////////////////////////////////////////////////////////////////// - + + @Override + void pushLayerUpdate(HardwareLayer layer) { + nPushLayerUpdate(mRenderer, ((GLES20RenderLayer) layer).mLayer); + } + + @Override + void clearLayerUpdates() { + nClearLayerUpdates(mRenderer); + } + static native int nCreateTextureLayer(boolean opaque, int[] layerInfo); static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo); static native boolean nResizeLayer(int layerId, int width, int height, int[] layerInfo); @@ -163,6 +173,9 @@ class GLES20Canvas extends HardwareCanvas { int left, int top, int right, int bottom); static native boolean nCopyLayer(int layerId, int bitmap); + private static native void nClearLayerUpdates(int renderer); + private static native void nPushLayerUpdate(int renderer, int layer); + /////////////////////////////////////////////////////////////////////////// // Canvas management /////////////////////////////////////////////////////////////////////////// diff --git a/core/java/android/view/GLES20RenderLayer.java b/core/java/android/view/GLES20RenderLayer.java index fcfc8e1b5e73..44d4719bcfba 100644 --- a/core/java/android/view/GLES20RenderLayer.java +++ b/core/java/android/view/GLES20RenderLayer.java @@ -110,7 +110,7 @@ class GLES20RenderLayer extends GLES20Layer { } @Override - void redraw(DisplayList displayList, Rect dirtyRect) { + void redrawLater(DisplayList displayList, Rect dirtyRect) { GLES20Canvas.nUpdateRenderLayer(mLayer, mCanvas.getRenderer(), ((GLES20DisplayList) displayList).getNativeDisplayList(), dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom); diff --git a/core/java/android/view/GLES20TextureLayer.java b/core/java/android/view/GLES20TextureLayer.java index b0ee2aa384d8..797c7342c947 100644 --- a/core/java/android/view/GLES20TextureLayer.java +++ b/core/java/android/view/GLES20TextureLayer.java @@ -98,6 +98,6 @@ class GLES20TextureLayer extends GLES20Layer { } @Override - void redraw(DisplayList displayList, Rect dirtyRect) { + void redrawLater(DisplayList displayList, Rect dirtyRect) { } } diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index 777552a23b5a..eeae3ed84165 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -132,4 +132,20 @@ public abstract class HardwareCanvas extends Canvas { * @see #detachFunctor(int) */ abstract void attachFunctor(int functor); + + /** + * Indicates that the specified layer must be updated as soon as possible. + * + * @param layer The layer to update + * + * @see #clearLayerUpdates() + */ + abstract void pushLayerUpdate(HardwareLayer layer); + + /** + * Removes all enqueued layer updates. + * + * @see #pushLayerUpdate(HardwareLayer) + */ + abstract void clearLayerUpdates(); } diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index d798e73b6b28..d6868ca16f9a 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -203,5 +203,5 @@ abstract class HardwareLayer { * execute in this layer * @param dirtyRect The dirty region of the layer that needs to be redrawn */ - abstract void redraw(DisplayList displayList, Rect dirtyRect); + abstract void redrawLater(DisplayList displayList, Rect dirtyRect); } diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index ef5dc561a7d4..e0e8de3b68e8 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -370,6 +370,14 @@ public abstract class HardwareRenderer { private static native void nDisableVsync(); /** + * Indicates that the specified hardware layer needs to be updated + * as soon as possible. + * + * @param layer The hardware layer that needs an update + */ + abstract void pushLayerUpdate(HardwareLayer layer); + + /** * Interface used to receive callbacks whenever a view is drawn by * a hardware renderer instance. */ @@ -1154,8 +1162,9 @@ public abstract class HardwareRenderer { getDisplayListStartTime = System.nanoTime(); } - DisplayList displayList; + canvas.clearLayerUpdates(); + DisplayList displayList; Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); try { displayList = view.getDisplayList(); @@ -1452,6 +1461,11 @@ public abstract class HardwareRenderer { } @Override + void pushLayerUpdate(HardwareLayer layer) { + mGlCanvas.pushLayerUpdate(layer); + } + + @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 13de538ef00a..31bbc6a03b04 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12286,9 +12286,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (!mHardwareLayer.isValid()) { return null; } + mHardwareLayer.setLayerPaint(mLayerPaint); + mHardwareLayer.redrawLater(getHardwareLayerDisplayList(mHardwareLayer), mLocalDirtyRect); + ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot != null) viewRoot.pushHardwareLayerUpdate(mHardwareLayer); - mHardwareLayer.redraw(getHardwareLayerDisplayList(mHardwareLayer), mLocalDirtyRect); mLocalDirtyRect.setEmpty(); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 27fd3746db74..6bb869700433 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -653,6 +653,12 @@ public final class ViewRootImpl implements ViewParent, } } + void pushHardwareLayerUpdate(HardwareLayer layer) { + if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { + mAttachInfo.mHardwareRenderer.pushLayerUpdate(layer); + } + } + public boolean attachFunctor(int functor) { //noinspection SimplifiableIfStatement if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { |
