diff options
| author | Chet Haase <chet@google.com> | 2012-06-06 19:03:58 -0700 |
|---|---|---|
| committer | Chet Haase <chet@google.com> | 2012-06-07 06:25:04 -0700 |
| commit | 44b2fe3fc114ee5f7273c6b0fee2cc999bf244a2 (patch) | |
| tree | 8d54bda8c5b7021be5d923beb641a9efb22dcf30 /core/java | |
| parent | 43fa4c5261a732decae3bbfaea2a00f8bb9b709c (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.java | 11 | ||||
| -rw-r--r-- | core/java/android/view/HardwareCanvas.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 14 |
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 |
