From 20620bc01b14b070700eec6b530c34496e0ae3a8 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 1 Mar 2022 16:32:47 -0800 Subject: [PATCH] Replace MainWindowSizeChange transaction with applyWithNextDraw It's legacy code from the days of deferred transactions but still has callers because it's convenient in it's own way. It has some details relating to relayout that could get in the way of our plan to remove it and so we refactor the primitive to make use of the applyWithNextDraw primitive to make it easier to port everything to the async system. Bug: 161810301 Bug: 175861051 Bug: 175861127 Bug: 200285149 Bug: 214315611 Change-Id: I369ff2fc8b4c730c4d31d9c1b89970bd295c32a3 --- .../core/java/com/android/server/wm/Task.java | 24 ++++------ .../com/android/server/wm/WindowState.java | 13 ------ .../server/wm/WindowStateAnimator.java | 46 ------------------- 3 files changed, 8 insertions(+), 75 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 7fe34f47c53ce..923ac41cec772 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -504,13 +504,6 @@ class Task extends TaskFragment { */ boolean mInRemoveTask; - // When non-null, this is a transaction that will get applied on the next frame returned after - // a relayout is requested from the client. While this is only valid on a leaf task; since the - // transaction can effect an ancestor task, this also needs to keep track of the ancestor task - // that this transaction manipulates because deferUntilFrame acts on individual surfaces. - SurfaceControl.Transaction mMainWindowSizeChangeTransaction; - Task mMainWindowSizeChangeTask; - private final AnimatingActivityRegistry mAnimatingActivityRegistry = new AnimatingActivityRegistry(); @@ -4390,17 +4383,16 @@ class Task extends TaskFragment { leaf.setMainWindowSizeChangeTransaction(t, origin); return; } - mMainWindowSizeChangeTransaction = t; - mMainWindowSizeChangeTask = t == null ? null : origin; + final WindowState w = getTopVisibleAppMainWindow(); + if (w != null) { + w.applyWithNextDraw((d) -> { + d.merge(t); + }); + } else { + t.apply(); + } } - SurfaceControl.Transaction getMainWindowSizeChangeTransaction() { - return mMainWindowSizeChangeTransaction; - } - - Task getMainWindowSizeChangeTask() { - return mMainWindowSizeChangeTask; - } void setActivityWindowingMode(int windowingMode) { PooledConsumer c = PooledLambda.obtainConsumer(ActivityRecord::setWindowingMode, diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 8ee6feb26a53e..c346f4f8b1128 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5987,15 +5987,6 @@ class WindowState extends WindowContainer implements WindowManagerP finishDrawing(null); mWmService.mH.removeMessages(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this); if (!useBLASTSync()) return; - - final Task task = getTask(); - if (task != null) { - final SurfaceControl.Transaction t = task.getMainWindowSizeChangeTransaction(); - if (t != null) { - mSyncTransaction.merge(t); - } - task.setMainWindowSizeChangeTransaction(null); - } } @Override @@ -6032,10 +6023,6 @@ class WindowState extends WindowContainer implements WindowManagerP if (mRedrawForSyncReported) { return false; } - final Task task = getTask(); - if (task != null && task.getMainWindowSizeChangeTransaction() != null) { - return true; - } return useBLASTSync(); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index c17961e8a5641..285a6d5bdf5f4 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -442,50 +442,6 @@ class WindowStateAnimator { return mService.useBLASTSync() && mWin.useBLASTSync(); } - private boolean shouldConsumeMainWindowSizeTransaction() { - // We only consume the transaction when the client is calling relayout - // because this is the only time we know the frameNumber will be valid - // due to the client renderer being paused. Put otherwise, only when - // mInRelayout is true can we guarantee the next frame will contain - // the most recent configuration. - if (!mWin.mInRelayout) return false; - // Since we can only do this for one window, we focus on the main application window - if (mAttrType != TYPE_BASE_APPLICATION) return false; - final Task task = mWin.getTask(); - if (task == null) return false; - if (task.getMainWindowSizeChangeTransaction() == null) return false; - // Likewise we only focus on the task root, since we can only use one window - if (!mWin.mActivityRecord.isRootOfTask()) return false; - return true; - } - - void setSurfaceBoundariesLocked(SurfaceControl.Transaction t) { - if (mSurfaceController == null) { - return; - } - - final WindowState w = mWin; - final Task task = w.getTask(); - if (shouldConsumeMainWindowSizeTransaction()) { - if (isInBlastSync()) { - // If we're in a sync transaction, there's no need to call defer transaction. - // The sync transaction will contain the buffer so the bounds change transaction - // will only be applied with the buffer. - t.merge(task.getMainWindowSizeChangeTransaction()); - task.setMainWindowSizeChangeTransaction(null); - } else { - mWin.applyWithNextDraw(finishedFrame -> { - final SurfaceControl.Transaction sizeChangedTransaction = - task.getMainWindowSizeChangeTransaction(); - if (sizeChangedTransaction != null) { - finishedFrame.merge(sizeChangedTransaction); - task.setMainWindowSizeChangeTransaction(null); - } - }); - } - } - } - void prepareSurfaceLocked(SurfaceControl.Transaction t) { final WindowState w = mWin; if (!hasSurface()) { @@ -501,8 +457,6 @@ class WindowStateAnimator { computeShownFrameLocked(); - setSurfaceBoundariesLocked(t); - if (w.isParentWindowHidden() || !w.isOnScreen()) { hide(t, "prepareSurfaceLocked"); mWallpaperControllerLocked.hideWallpapers(w);