Skip to content

Commit 44b2fe3

Browse files
committed
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
1 parent 43fa4c5 commit 44b2fe3

File tree

10 files changed

+39
-33
lines changed

10 files changed

+39
-33
lines changed

core/java/android/view/GLES20Canvas.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,16 +215,17 @@ public void setViewport(int width, int height) {
215215
private static native void nSetViewport(int renderer, int width, int height);
216216

217217
@Override
218-
public void onPreDraw(Rect dirty) {
218+
public int onPreDraw(Rect dirty) {
219219
if (dirty != null) {
220-
nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom, mOpaque);
220+
return nPrepareDirty(mRenderer, dirty.left, dirty.top, dirty.right, dirty.bottom,
221+
mOpaque);
221222
} else {
222-
nPrepare(mRenderer, mOpaque);
223+
return nPrepare(mRenderer, mOpaque);
223224
}
224225
}
225226

226-
private static native void nPrepare(int renderer, boolean opaque);
227-
private static native void nPrepareDirty(int renderer, int left, int top, int right, int bottom,
227+
private static native int nPrepare(int renderer, boolean opaque);
228+
private static native int nPrepareDirty(int renderer, int left, int top, int right, int bottom,
228229
boolean opaque);
229230

230231
@Override

core/java/android/view/HardwareCanvas.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ public void setBitmap(Bitmap bitmap) {
4141
* Invoked before any drawing operation is performed in this canvas.
4242
*
4343
* @param dirty The dirty rectangle to update, can be null.
44+
* @return {@link DisplayList#STATUS_DREW} if anything was drawn (such as a call to clear
45+
* the canvas).
4446
*/
45-
public abstract void onPreDraw(Rect dirty);
47+
public abstract int onPreDraw(Rect dirty);
4648

4749
/**
4850
* Invoked after all drawing operation have been performed.
@@ -58,8 +60,9 @@ public void setBitmap(Bitmap bitmap) {
5860
* @param flags Optional flags about drawing, see {@link DisplayList} for
5961
* the possible flags.
6062
*
61-
* @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW} or
62-
* {@link DisplayList#STATUS_INVOKE}
63+
* @return One of {@link DisplayList#STATUS_DONE}, {@link DisplayList#STATUS_DRAW}, or
64+
* {@link DisplayList#STATUS_INVOKE}, or'd with {@link DisplayList#STATUS_DREW}
65+
* if anything was drawn.
6366
*/
6467
public abstract int drawDisplayList(DisplayList displayList, Rect dirty, int flags);
6568

core/java/android/view/HardwareRenderer.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,8 +1042,8 @@ boolean canDraw() {
10421042
return mGl != null && mCanvas != null;
10431043
}
10441044

1045-
void onPreDraw(Rect dirty) {
1046-
1045+
int onPreDraw(Rect dirty) {
1046+
return DisplayList.STATUS_DONE;
10471047
}
10481048

10491049
void onPostDraw() {
@@ -1102,9 +1102,7 @@ boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callba
11021102
}
11031103
}
11041104

1105-
onPreDraw(dirty);
1106-
1107-
int status = DisplayList.STATUS_DONE;
1105+
int status = onPreDraw(dirty);
11081106
int saveCount = canvas.save();
11091107
callbacks.onHardwarePreDraw(canvas);
11101108

@@ -1138,7 +1136,7 @@ boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callba
11381136
drawDisplayListStartTime = System.nanoTime();
11391137
}
11401138

1141-
status = canvas.drawDisplayList(displayList, mRedrawClip,
1139+
status |= canvas.drawDisplayList(displayList, mRedrawClip,
11421140
DisplayList.FLAG_CLIP_CHILDREN);
11431141

11441142
if (mProfileEnabled) {
@@ -1372,8 +1370,8 @@ boolean canDraw() {
13721370
}
13731371

13741372
@Override
1375-
void onPreDraw(Rect dirty) {
1376-
mGlCanvas.onPreDraw(dirty);
1373+
int onPreDraw(Rect dirty) {
1374+
return mGlCanvas.onPreDraw(dirty);
13771375
}
13781376

13791377
@Override

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,15 @@ static void android_view_GLES20Canvas_setViewport(JNIEnv* env, jobject clazz,
133133
renderer->setViewport(width, height);
134134
}
135135

136-
static void android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
136+
static int android_view_GLES20Canvas_prepare(JNIEnv* env, jobject clazz,
137137
OpenGLRenderer* renderer, jboolean opaque) {
138-
renderer->prepare(opaque);
138+
return renderer->prepare(opaque);
139139
}
140140

141-
static void android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
141+
static int android_view_GLES20Canvas_prepareDirty(JNIEnv* env, jobject clazz,
142142
OpenGLRenderer* renderer, jint left, jint top, jint right, jint bottom,
143143
jboolean opaque) {
144-
renderer->prepareDirty(left, top, right, bottom, opaque);
144+
return renderer->prepareDirty(left, top, right, bottom, opaque);
145145
}
146146

147147
static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz,
@@ -868,8 +868,8 @@ static JNINativeMethod gMethods[] = {
868868
{ "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
869869
{ "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
870870
{ "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
871-
{ "nPrepare", "(IZ)V", (void*) android_view_GLES20Canvas_prepare },
872-
{ "nPrepareDirty", "(IIIIIZ)V", (void*) android_view_GLES20Canvas_prepareDirty },
871+
{ "nPrepare", "(IZ)I", (void*) android_view_GLES20Canvas_prepare },
872+
{ "nPrepareDirty", "(IIIIIZ)I", (void*) android_view_GLES20Canvas_prepareDirty },
873873
{ "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish },
874874

875875
{ "nGetStencilSize", "()I", (void*) android_view_GLES20Canvas_getStencilSize },

libs/hwui/DisplayListRenderer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1368,13 +1368,14 @@ void DisplayListRenderer::setViewport(int width, int height) {
13681368
mHeight = height;
13691369
}
13701370

1371-
void DisplayListRenderer::prepareDirty(float left, float top,
1371+
int DisplayListRenderer::prepareDirty(float left, float top,
13721372
float right, float bottom, bool opaque) {
13731373
mSnapshot = new Snapshot(mFirstSnapshot,
13741374
SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
13751375
mSaveCount = 1;
13761376
mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
13771377
mRestoreSaveCount = -1;
1378+
return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
13781379
}
13791380

13801381
void DisplayListRenderer::finish() {

libs/hwui/DisplayListRenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ class DisplayListRenderer: public OpenGLRenderer {
547547
virtual bool isDeferred();
548548

549549
virtual void setViewport(int width, int height);
550-
virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
550+
virtual int prepareDirty(float left, float top, float right, float bottom, bool opaque);
551551
virtual void finish();
552552

553553
virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty);

libs/hwui/LayerRenderer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ LayerRenderer::LayerRenderer(Layer* layer): mLayer(layer) {
3737
LayerRenderer::~LayerRenderer() {
3838
}
3939

40-
void LayerRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) {
40+
int LayerRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) {
4141
LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->getFbo());
4242

4343
glBindFramebuffer(GL_FRAMEBUFFER, mLayer->getFbo());
@@ -57,9 +57,9 @@ void LayerRenderer::prepareDirty(float left, float top, float right, float botto
5757
mLayer->region.subtractSelf(r);
5858
}
5959

60-
OpenGLRenderer::prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, opaque);
60+
return OpenGLRenderer::prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, opaque);
6161
#else
62-
OpenGLRenderer::prepareDirty(0.0f, 0.0f, width, height, opaque);
62+
return OpenGLRenderer::prepareDirty(0.0f, 0.0f, width, height, opaque);
6363
#endif
6464
}
6565

libs/hwui/LayerRenderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class LayerRenderer: public OpenGLRenderer {
4747
ANDROID_API LayerRenderer(Layer* layer);
4848
virtual ~LayerRenderer();
4949

50-
virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
50+
virtual int prepareDirty(float left, float top, float right, float bottom, bool opaque);
5151
virtual void finish();
5252

5353
virtual bool hasLayer();

libs/hwui/OpenGLRenderer.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ void OpenGLRenderer::setViewport(int width, int height) {
164164
glEnableVertexAttribArray(Program::kBindingPosition);
165165
}
166166

167-
void OpenGLRenderer::prepare(bool opaque) {
168-
prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque);
167+
int OpenGLRenderer::prepare(bool opaque) {
168+
return prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque);
169169
}
170170

171-
void OpenGLRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) {
171+
int OpenGLRenderer::prepareDirty(float left, float top, float right, float bottom, bool opaque) {
172172
mCaches.clearGarbage();
173173

174174
mSnapshot = new Snapshot(mFirstSnapshot,
@@ -184,9 +184,12 @@ void OpenGLRenderer::prepareDirty(float left, float top, float right, float bott
184184
if (!opaque) {
185185
mCaches.setScissor(left, mSnapshot->height - bottom, right - left, bottom - top);
186186
glClear(GL_COLOR_BUFFER_BIT);
187+
return DrawGlInfo::kStatusDrew;
187188
} else {
188189
mCaches.resetScissor();
189190
}
191+
192+
return DrawGlInfo::kStatusDone;
190193
}
191194

192195
void OpenGLRenderer::syncState() {

libs/hwui/OpenGLRenderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class OpenGLRenderer {
6767

6868
virtual void setViewport(int width, int height);
6969

70-
ANDROID_API void prepare(bool opaque);
71-
virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
70+
ANDROID_API int prepare(bool opaque);
71+
virtual int prepareDirty(float left, float top, float right, float bottom, bool opaque);
7272
virtual void finish();
7373

7474
// These two calls must not be recorded in display lists

0 commit comments

Comments
 (0)