summaryrefslogtreecommitdiff
path: root/core/java/android/view/ViewRootImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
-rw-r--r--core/java/android/view/ViewRootImpl.java40
1 files changed, 30 insertions, 10 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 48f380d87dcc..0506f30d04b8 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3096,13 +3096,28 @@ public final class ViewRootImpl implements ViewParent,
return;
}
- final boolean fullRedrawNeeded = mFullRedrawNeeded;
+ final boolean fullRedrawNeeded = mFullRedrawNeeded || mReportNextDraw;
mFullRedrawNeeded = false;
mIsDrawing = true;
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw");
+
+ boolean usingAsyncReport = false;
+ if (mReportNextDraw && mAttachInfo.mThreadedRenderer != null
+ && mAttachInfo.mThreadedRenderer.isEnabled()) {
+ usingAsyncReport = true;
+ mAttachInfo.mThreadedRenderer.setFrameCompleteCallback((long frameNr) -> {
+ // TODO: Use the frame number
+ pendingDrawFinished();
+ });
+ }
+
try {
- draw(fullRedrawNeeded);
+ boolean canUseAsync = draw(fullRedrawNeeded);
+ if (usingAsyncReport && !canUseAsync) {
+ mAttachInfo.mThreadedRenderer.setFrameCompleteCallback(null);
+ usingAsyncReport = false;
+ }
} finally {
mIsDrawing = false;
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
@@ -3132,7 +3147,6 @@ public final class ViewRootImpl implements ViewParent,
}
if (mAttachInfo.mThreadedRenderer != null) {
- mAttachInfo.mThreadedRenderer.fence();
mAttachInfo.mThreadedRenderer.setStopped(mStopped);
}
@@ -3145,16 +3159,19 @@ public final class ViewRootImpl implements ViewParent,
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
sch.dispatchSurfaceRedrawNeededAsync(mSurfaceHolder, callbacks);
- } else {
+ } else if (!usingAsyncReport) {
+ if (mAttachInfo.mThreadedRenderer != null) {
+ mAttachInfo.mThreadedRenderer.fence();
+ }
pendingDrawFinished();
}
}
}
- private void draw(boolean fullRedrawNeeded) {
+ private boolean draw(boolean fullRedrawNeeded) {
Surface surface = mSurface;
if (!surface.isValid()) {
- return;
+ return false;
}
if (DEBUG_FPS) {
@@ -3203,7 +3220,7 @@ public final class ViewRootImpl implements ViewParent,
if (animating && mScroller != null) {
mScroller.abortAnimation();
}
- return;
+ return false;
}
if (fullRedrawNeeded) {
@@ -3250,6 +3267,7 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mDrawingTime =
mChoreographer.getFrameTimeNanos() / TimeUtils.NANOS_PER_MS;
+ boolean useAsyncReport = false;
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
if (mAttachInfo.mThreadedRenderer != null && mAttachInfo.mThreadedRenderer.isEnabled()) {
// If accessibility focus moved, always invalidate the root.
@@ -3286,6 +3304,7 @@ public final class ViewRootImpl implements ViewParent,
requestDrawWindow();
}
+ useAsyncReport = true;
mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this, mNextRtFrameCallback);
mNextRtFrameCallback = null;
} else {
@@ -3307,17 +3326,17 @@ public final class ViewRootImpl implements ViewParent,
mWidth, mHeight, mAttachInfo, mSurface, surfaceInsets);
} catch (OutOfResourcesException e) {
handleOutOfResourcesException(e);
- return;
+ return false;
}
mFullRedrawNeeded = true;
scheduleTraversals();
- return;
+ return false;
}
if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset,
scalingRequired, dirty, surfaceInsets)) {
- return;
+ return false;
}
}
}
@@ -3326,6 +3345,7 @@ public final class ViewRootImpl implements ViewParent,
mFullRedrawNeeded = true;
scheduleTraversals();
}
+ return useAsyncReport;
}
/**