From 10054666cb5e8ff20207b72402c7ebf6f518e0a3 Mon Sep 17 00:00:00 2001 From: chaviw Date: Mon, 25 Oct 2021 18:04:09 -0500 Subject: [PATCH] Only allow one relayout with sync per sync request If a new relayout occurs while in a sync, VRI will attempt another sync. This is not intended so only allow one relayout request during a sync to actually use blast sync Test: Presubmit with shell transitions Change-Id: Ic1211add59374ce82081bc88f6b2dfdd367438e3 Bug: 200285149 --- .../core/java/com/android/server/wm/WindowManagerService.java | 4 +++- services/core/java/com/android/server/wm/WindowState.java | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c4a518395eeae..92a14b5fb4828 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2515,9 +2515,11 @@ public class WindowManagerService extends IWindowManager.Stub } win.mInRelayout = false; - if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE) { + if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE + && win.mNextRelayoutUseSync) { win.prepareDrawHandlers(); win.markRedrawForSyncReported(); + win.mNextRelayoutUseSync = false; result |= RELAYOUT_RES_BLAST_SYNC; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a5f812f15ad54..f177e138f0a5f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -367,6 +367,7 @@ class WindowState extends WindowContainer implements WindowManagerP private boolean mDragResizingChangeReported = true; private int mResizeMode; private boolean mRedrawForSyncReported; + boolean mNextRelayoutUseSync; /** * {@code true} when the client was still drawing for sync when the sync-set was finished or @@ -5914,6 +5915,7 @@ class WindowState extends WindowContainer implements WindowManagerP // to draw even if the children draw first or don't need to sync, so we start // in WAITING state rather than READY. mSyncState = SYNC_STATE_WAITING_FOR_DRAW; + mNextRelayoutUseSync = true; requestRedrawForSync(); return true; } @@ -6095,6 +6097,7 @@ class WindowState extends WindowContainer implements WindowManagerP */ void applyWithNextDraw(Consumer consumer) { mPendingDrawHandlers.add(consumer); + mNextRelayoutUseSync = true; requestRedrawForSync(); mWmService.mH.sendNewMessageDelayed(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this,