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

Commit 10c60e45 authored by chaviw's avatar chaviw
Browse files

Fix some blast sync issues in VRI

1. If a relayout requested blast sync but we canceled the draw and
schedule it for later, the next draw won't use blast sync. This change
makes sure we use blast sync on the next performTraversal

2. Remove mReportDrawToWm and always send transaction to WMS to apply.
This is because there could be multiple report draws in a row and we'd
unset the flag after the first and not send the other transactions to
WMS

Test: Screen rotation no flicker with rounded corners
Change-Id: I8bf3881dfcdd2e54f0ec78f9fb695c76385f4228
parent cf37df74
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -533,10 +533,11 @@ public final class ViewRootImpl implements ViewParent,

    boolean mReportNextDraw;
    /**
     * Set if the reportDraw was requested from WM. If just a local report draw was invoked, there's
     * no need to report back to system server and can just apply immediately on the client.
     * Set whether the draw should use blast sync. This is in case the draw is canceled,
     * but will be rescheduled. We still want the next draw to be sync.
     */
    boolean mReportDrawToWm;
    boolean mNextDrawUseBlastSync;

    boolean mFullRedrawNeeded;
    boolean mNewSurfaceNeeded;
    boolean mForceNextWindowRelayout;
@@ -2761,7 +2762,7 @@ public final class ViewRootImpl implements ViewParent,
            }
        }
        final boolean wasReportNextDraw = mReportNextDraw;
        boolean useBlastSync = false;
        boolean useBlastSync = mNextDrawUseBlastSync;

        if (mFirst || windowShouldResize || viewVisibilityChanged || params != null
                || mForceNextWindowRelayout) {
@@ -3292,9 +3293,11 @@ public final class ViewRootImpl implements ViewParent,
                mPendingTransitions.clear();
            }
            performDraw(useBlastSync);
            mNextDrawUseBlastSync = false;
        } else {
            if (isViewVisible) {
                // Try again
                mNextDrawUseBlastSync = useBlastSync;
                scheduleTraversals();
            } else {
                if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
@@ -3984,17 +3987,8 @@ public final class ViewRootImpl implements ViewParent,
        }
        mDrawsNeededToReport = 0;

        if (!mReportDrawToWm) {
            if (DEBUG_BLAST) {
                Log.d(mTag, "No need to report finishDrawing. Apply immediately");
            }
            mSurfaceChangedTransaction.apply();
            return;
        }

        try {
            mWindowSession.finishDrawing(mWindow, mSurfaceChangedTransaction);
            mReportDrawToWm = false;
        } catch (RemoteException e) {
            Log.e(mTag, "Unable to report draw finished", e);
            mSurfaceChangedTransaction.apply();
@@ -9604,7 +9598,6 @@ public final class ViewRootImpl implements ViewParent,
        if (mReportNextDraw == false) {
            drawPending();
        }
        mReportDrawToWm = true;
        mReportNextDraw = true;
    }