summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/view/GLES20Canvas.java15
-rw-r--r--core/java/android/view/GLES20RenderLayer.java2
-rw-r--r--core/java/android/view/GLES20TextureLayer.java2
-rw-r--r--core/java/android/view/HardwareCanvas.java16
-rw-r--r--core/java/android/view/HardwareLayer.java2
-rw-r--r--core/java/android/view/HardwareRenderer.java16
-rw-r--r--core/java/android/view/View.java5
-rw-r--r--core/java/android/view/ViewRootImpl.java6
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp12
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 },