Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab82b008 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

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
parent 9a5967ff
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -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.");