diff options
Diffstat (limited to 'core/java/android/view/ViewRootImpl.java')
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 40 |
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; } /** |
