summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-09-21 10:50:12 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-09-21 10:50:12 -0700
commit3f7c246f3ea85af9fb98cba37387bb55658d4614 (patch)
treedc609eab1943a9ec83bc58cc0701496ba3340f31 /core/java
parent45b07b9427cc736bf4fd5658ef2f30884ba4d9a4 (diff)
parent11cb642756093a4af901b1525375b1eb2b5c3e2b (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.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
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()) {