Skip to content

Commit 11cb642

Browse files
author
Romain Guy
committed
Update layers in a single batch at the beginning of a frame
Bug #7186819 Change-Id: Ice5926dfedfb3be3a3064e65008dafa2852407da
1 parent 3e87eaf commit 11cb642

13 files changed

+191
-50
lines changed

core/java/android/view/GLES20Canvas.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,17 @@ protected void finalize() throws Throwable {
147147
///////////////////////////////////////////////////////////////////////////
148148
// Hardware layers
149149
///////////////////////////////////////////////////////////////////////////
150-
150+
151+
@Override
152+
void pushLayerUpdate(HardwareLayer layer) {
153+
nPushLayerUpdate(mRenderer, ((GLES20RenderLayer) layer).mLayer);
154+
}
155+
156+
@Override
157+
void clearLayerUpdates() {
158+
nClearLayerUpdates(mRenderer);
159+
}
160+
151161
static native int nCreateTextureLayer(boolean opaque, int[] layerInfo);
152162
static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo);
153163
static native boolean nResizeLayer(int layerId, int width, int height, int[] layerInfo);
@@ -163,6 +173,9 @@ static native void nUpdateRenderLayer(int layerId, int renderer, int displayList
163173
int left, int top, int right, int bottom);
164174
static native boolean nCopyLayer(int layerId, int bitmap);
165175

176+
private static native void nClearLayerUpdates(int renderer);
177+
private static native void nPushLayerUpdate(int renderer, int layer);
178+
166179
///////////////////////////////////////////////////////////////////////////
167180
// Canvas management
168181
///////////////////////////////////////////////////////////////////////////

core/java/android/view/GLES20RenderLayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void setTransform(Matrix matrix) {
110110
}
111111

112112
@Override
113-
void redraw(DisplayList displayList, Rect dirtyRect) {
113+
void redrawLater(DisplayList displayList, Rect dirtyRect) {
114114
GLES20Canvas.nUpdateRenderLayer(mLayer, mCanvas.getRenderer(),
115115
((GLES20DisplayList) displayList).getNativeDisplayList(),
116116
dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom);

core/java/android/view/GLES20TextureLayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,6 @@ void setTransform(Matrix matrix) {
9898
}
9999

100100
@Override
101-
void redraw(DisplayList displayList, Rect dirtyRect) {
101+
void redrawLater(DisplayList displayList, Rect dirtyRect) {
102102
}
103103
}

core/java/android/view/HardwareCanvas.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,20 @@ public int invokeFunctors(Rect dirty) {
132132
* @see #detachFunctor(int)
133133
*/
134134
abstract void attachFunctor(int functor);
135+
136+
/**
137+
* Indicates that the specified layer must be updated as soon as possible.
138+
*
139+
* @param layer The layer to update
140+
*
141+
* @see #clearLayerUpdates()
142+
*/
143+
abstract void pushLayerUpdate(HardwareLayer layer);
144+
145+
/**
146+
* Removes all enqueued layer updates.
147+
*
148+
* @see #pushLayerUpdate(HardwareLayer)
149+
*/
150+
abstract void clearLayerUpdates();
135151
}

core/java/android/view/HardwareLayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,5 +203,5 @@ void update(int width, int height, boolean isOpaque) {
203203
* execute in this layer
204204
* @param dirtyRect The dirty region of the layer that needs to be redrawn
205205
*/
206-
abstract void redraw(DisplayList displayList, Rect dirtyRect);
206+
abstract void redrawLater(DisplayList displayList, Rect dirtyRect);
207207
}

core/java/android/view/HardwareRenderer.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,14 @@ static void disableVsync() {
369369

370370
private static native void nDisableVsync();
371371

372+
/**
373+
* Indicates that the specified hardware layer needs to be updated
374+
* as soon as possible.
375+
*
376+
* @param layer The hardware layer that needs an update
377+
*/
378+
abstract void pushLayerUpdate(HardwareLayer layer);
379+
372380
/**
373381
* Interface used to receive callbacks whenever a view is drawn by
374382
* a hardware renderer instance.
@@ -1154,8 +1162,9 @@ boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callba
11541162
getDisplayListStartTime = System.nanoTime();
11551163
}
11561164

1157-
DisplayList displayList;
1165+
canvas.clearLayerUpdates();
11581166

1167+
DisplayList displayList;
11591168
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
11601169
try {
11611170
displayList = view.getDisplayList();
@@ -1451,6 +1460,11 @@ void setup(int width, int height) {
14511460
}
14521461
}
14531462

1463+
@Override
1464+
void pushLayerUpdate(HardwareLayer layer) {
1465+
mGlCanvas.pushLayerUpdate(layer);
1466+
}
1467+
14541468
@Override
14551469
public DisplayList createDisplayList(String name) {
14561470
return new GLES20DisplayList(name);

core/java/android/view/View.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12286,9 +12286,12 @@ HardwareLayer getHardwareLayer() {
1228612286
if (!mHardwareLayer.isValid()) {
1228712287
return null;
1228812288
}
12289+
1228912290
mHardwareLayer.setLayerPaint(mLayerPaint);
12291+
mHardwareLayer.redrawLater(getHardwareLayerDisplayList(mHardwareLayer), mLocalDirtyRect);
12292+
ViewRootImpl viewRoot = getViewRootImpl();
12293+
if (viewRoot != null) viewRoot.pushHardwareLayerUpdate(mHardwareLayer);
1229012294

12291-
mHardwareLayer.redraw(getHardwareLayerDisplayList(mHardwareLayer), mLocalDirtyRect);
1229212295
mLocalDirtyRect.setEmpty();
1229312296
}
1229412297

core/java/android/view/ViewRootImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,12 @@ void destroyHardwareLayers() {
653653
}
654654
}
655655

656+
void pushHardwareLayerUpdate(HardwareLayer layer) {
657+
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
658+
mAttachInfo.mHardwareRenderer.pushLayerUpdate(layer);
659+
}
660+
}
661+
656662
public boolean attachFunctor(int functor) {
657663
//noinspection SimplifiableIfStatement
658664
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,16 @@ static jboolean android_view_GLES20Canvas_copyLayer(JNIEnv* env, jobject clazz,
843843
return LayerRenderer::copyLayer(layer, bitmap);
844844
}
845845

846+
static void android_view_GLES20Canvas_pushLayerUpdate(JNIEnv* env, jobject clazz,
847+
OpenGLRenderer* renderer, Layer* layer) {
848+
renderer->pushLayerUpdate(layer);
849+
}
850+
851+
static void android_view_GLES20Canvas_clearLayerUpdates(JNIEnv* env, jobject clazz,
852+
OpenGLRenderer* renderer) {
853+
renderer->clearLayerUpdates();
854+
}
855+
846856
#endif // USE_OPENGL_RENDERER
847857

848858
// ----------------------------------------------------------------------------
@@ -1006,6 +1016,8 @@ static JNINativeMethod gMethods[] = {
10061016
{ "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
10071017
{ "nDrawLayer", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawLayer },
10081018
{ "nCopyLayer", "(II)Z", (void*) android_view_GLES20Canvas_copyLayer },
1019+
{ "nClearLayerUpdates", "(I)V", (void*) android_view_GLES20Canvas_clearLayerUpdates },
1020+
{ "nPushLayerUpdate", "(II)V", (void*) android_view_GLES20Canvas_pushLayerUpdate },
10091021

10101022
{ "nSetTextureLayerTransform", "(II)V", (void*) android_view_GLES20Canvas_setTextureLayerTransform },
10111023

libs/hwui/LayerRenderer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ GLint LayerRenderer::getTargetFbo() {
7878
return mLayer->getFbo();
7979
}
8080

81+
bool LayerRenderer::suppressErrorChecks() {
82+
return true;
83+
}
84+
8185
///////////////////////////////////////////////////////////////////////////////
8286
// Dirty region tracking
8387
///////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)