From 10c60e45e8d1148af578d77f2fa837c8d75a7567 Mon Sep 17 00:00:00 2001 From: chaviw Date: Wed, 8 Dec 2021 12:29:27 -0600 Subject: [PATCH] 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 --- core/java/android/view/ViewRootImpl.java | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index c76245b34c0d4..75d5ecfa24094 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -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; }