From ab82b008f1f5660de9bedf0e9e319cb55151baf1 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Mon, 12 Apr 2021 15:47:39 -0700 Subject: [PATCH] Honor the BlastSync request from WM until a frame is drawn If the client cancels a draw via preDraw, we will cancel the blast sync request. This breaks the screen decoration logic which uses the predaw handlers to cancel the draw, change the layout of the window and then redaw the window when the display orientation changes. Fixes: 183171989 Test: enable cutout and rotate screen, check screen decorations are positioned correctly Test: go/wm-smoke Change-Id: I7f802730b69842216b065a4a521a2737e692b82d --- core/java/android/view/ViewRootImpl.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 8348a5c65feab..8c9c6bd8feebd 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -722,6 +722,13 @@ public final class ViewRootImpl implements ViewParent, */ private boolean mNextDrawUseBlastSync = false; + /** + * Wait for the blast sync transaction complete callback before drawing and queuing up more + * frames. This will prevent out of order buffers submissions when WM has requested to + * synchronize with the client. + */ + private boolean mWaitForBlastSyncComplete = false; + /** * Keeps track of whether a traverse was triggered while the UI thread was paused. This can * occur when the client is waiting on another process to submit the transaction that @@ -2463,7 +2470,7 @@ public final class ViewRootImpl implements ViewParent, // // When the callback is invoked, it will trigger a traversal request if // mRequestedTraverseWhilePaused is set so there's no need to attempt a retry here. - if (mNextDrawUseBlastSync) { + if (mWaitForBlastSyncComplete) { if (DEBUG_BLAST) { Log.w(mTag, "Can't perform draw while waiting for a transaction complete"); } @@ -3244,10 +3251,6 @@ public final class ViewRootImpl implements ViewParent, pendingDrawFinished(); } } - - // We were unable to draw this traversal. Unset this flag since we'll block without - // ever being able to draw again - mNextDrawUseBlastSync = false; } if (mAttachInfo.mContentCaptureEvents != null) { @@ -3990,7 +3993,7 @@ public final class ViewRootImpl implements ViewParent, + " reportNextDraw=" + reportNextDraw + " hasBlurUpdates=" + hasBlurUpdates); } - + mWaitForBlastSyncComplete = nextDrawUseBlastSync; final BackgroundBlurDrawable.BlurRegion[] blurRegionsForFrame = needsCallbackForBlur ? mBlurRegionAggregator.getBlurRegionsCopyForRT() : null; @@ -4025,6 +4028,7 @@ public final class ViewRootImpl implements ViewParent, } mHandler.postAtFrontOfQueue(() -> { mNextDrawUseBlastSync = false; + mWaitForBlastSyncComplete = false; if (DEBUG_BLAST) { Log.d(mTag, "Scheduling a traversal=" + mRequestedTraverseWhilePaused + " due to a previous skipped traversal.");