summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorChet Haase <chet@google.com>2012-06-06 19:03:58 -0700
committerChet Haase <chet@google.com>2012-06-07 06:25:04 -0700
commit44b2fe3fc114ee5f7273c6b0fee2cc999bf244a2 (patch)
tree8d54bda8c5b7021be5d923beb641a9efb22dcf30 /core/java
parent43fa4c5261a732decae3bbfaea2a00f8bb9b709c (diff)
Track canvas clearing for swap buffers logic.
A previous fix made it necessary for a frame to render something to GL in order to cause a call to eglSwapBuffers(). Besides the calls being tracked as part of issuing a DisplayList, there is also a potential call to clear the canvas (via glClear()) on non-opaque surfaces. This call is also good to track, since a surface that gets cleared without any other drawing operations is worth flipping to the screen (to erase old contents on that surface). This fix tracks the status of the pre-draw operations to find out whether glClear() was called and then sets the drawing status appropriately. Issue #6606422 QuickContact dismissal is janky again (Tracking) Change-Id: I5fcaccfdc9293dd46b83f2fc279730a5d2740ebf
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/view/GLES20Canvas.java11
-rw-r--r--core/java/android/view/HardwareCanvas.java9
-rw-r--r--core/java/android/view/HardwareRenderer.java14
3 files changed, 18 insertions, 16 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 1631fb34fea5..055aee3e8440 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -215,16 +215,17 @@ class GLES20Canvas extends HardwareCanvas {
private static native void nSetViewport(int renderer, int width, int height);
@Override
- public void onPreDraw(Rect dirty) {
+ public int onPreDraw(Rect dirty) {
if (dirty != null) {
- nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom, mOpaque);
+ return nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom,
+ mOpaque);
} else {
- nPrepare(mRenderer, mOpaque);
+ return nPrepare(mRenderer, mOpaque);
}
}
- private static native void nPrepare(int renderer, boolean opaque);
- private static native void nPrepareDirty(int renderer, int left, int top, int right, int bottom,
+ private static native int nPrepare(int renderer, boolean opaque);
+ private static native int nPrepareDirty(int renderer, int left, int top, int right, int bottom,
boolean opaque);
@Override
diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java
index ee2dd5928f2c..777552a23b5a 100644
--- a/core/java/android/view/HardwareCanvas.java
+++ b/core/java/android/view/HardwareCanvas.java
@@ -41,8 +41,10 @@ public abstract class HardwareCanvas extends Canvas {
* Invoked before any drawing operation is performed in this canvas.
*
* @param dirty The dirty rectangle to update, can be null.
+ * @return {@link DisplayList#STATUS_DREW} if anything was drawn (such as a call to clear
+ * the canvas).
*/
- public abstract void onPreDraw(Rect dirty);
+ public abstract int onPreDraw(Rect dirty);
/**
* Invoked after all drawing operation have been performed.
@@ -58,8 +60,9 @@ public abstract class HardwareCanvas extends Canvas {
* @param flags Optional flags about drawing, see {@link DisplayList} for
* the possible flags.
*
- * @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW} or
- * {@link DisplayList#STATUS_INVOKE}
+ * @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW}, or
+ * {@link DisplayList#STATUS_INVOKE}, or'd with {@link DisplayList#STATUS_DREW}
+ * if anything was drawn.
*/
public abstract int drawDisplayList(DisplayList displayList, Rect dirty, int flags);
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 7e86ea3a542e..0ae6b56df6fe 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -1042,8 +1042,8 @@ public abstract class HardwareRenderer {
return mGl != null && mCanvas != null;
}
- void onPreDraw(Rect dirty) {
-
+ int onPreDraw(Rect dirty) {
+ return DisplayList.STATUS_DONE;
}
void onPostDraw() {
@@ -1102,9 +1102,7 @@ public abstract class HardwareRenderer {
}
}
- onPreDraw(dirty);
-
- int status = DisplayList.STATUS_DONE;
+ int status = onPreDraw(dirty);
int saveCount = canvas.save();
callbacks.onHardwarePreDraw(canvas);
@@ -1138,7 +1136,7 @@ public abstract class HardwareRenderer {
drawDisplayListStartTime = System.nanoTime();
}
- status = canvas.drawDisplayList(displayList, mRedrawClip,
+ status |= canvas.drawDisplayList(displayList, mRedrawClip,
DisplayList.FLAG_CLIP_CHILDREN);
if (mProfileEnabled) {
@@ -1372,8 +1370,8 @@ public abstract class HardwareRenderer {
}
@Override
- void onPreDraw(Rect dirty) {
- mGlCanvas.onPreDraw(dirty);
+ int onPreDraw(Rect dirty) {
+ return mGlCanvas.onPreDraw(dirty);
}
@Override