diff options
Diffstat (limited to 'core')
-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 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 12 |
9 files changed, 70 insertions, 6 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 032ff7b..c703aaf 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 fcfc8e1..44d4719 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 b0ee2aa..797c734 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 777552a..eeae3ed 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 d798e73..d6868ca 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 ef5dc56..e0e8de3 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 13de538..31bbc6a 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 27fd374..6bb8697 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()) { diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 2ff886e..b91eb28 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -843,6 +843,16 @@ static jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz, return LayerRenderer::copyLayer(layer, bitmap); } +static void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer, Layer* layer) { + renderer->pushLayerUpdate(layer); +} + +static void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz, + OpenGLRenderer* renderer) { + renderer->clearLayerUpdates(); +} + #endif // USE_OPENGL_RENDERER // ---------------------------------------------------------------------------- @@ -1006,6 +1016,8 @@ static JNINativeMethod gMethods[] = { { "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred }, { "nDrawLayer", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawLayer }, { "nCopyLayer", "(II)Z", (void*) android_view_GLES20Canvas_copyLayer }, + { "nClearLayerUpdates", "(I)V", (void*) android_view_GLES20Canvas_clearLayerUpdates }, + { "nPushLayerUpdate", "(II)V", (void*) android_view_GLES20Canvas_pushLayerUpdate }, { "nSetTextureLayerTransform", "(II)V", (void*) android_view_GLES20Canvas_setTextureLayerTransform }, |