diff options
| author | 2023-01-06 13:49:36 +0000 | |
|---|---|---|
| committer | 2023-01-06 13:49:36 +0000 | |
| commit | ea5ef0018a1e6150244a4c64830ecec64d8cafeb (patch) | |
| tree | 7c074f5d9dce2ac791e06c8eda7213ced31cd2db | |
| parent | 21207f26faff4685fdafd325d3605b927e7c729b (diff) | |
| parent | 4d9d3883fa6571a91ddd4a9ffb7a430b2cd90b12 (diff) | |
Merge "Finish sync for unchanged drawn window" into tm-qpr-dev am: 719029c87c am: 4d9d3883fa
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20783091
Change-Id: I74b4a6d53c8f76745c22a347ed8c844198c18c74
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
5 files changed, 16 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 176f619008f5..0ab4faf9d4bd 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -3791,7 +3791,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< if (mSyncState == SYNC_STATE_NONE) return false; mSyncState = SYNC_STATE_READY; mSyncMethodOverride = BLASTSyncEngine.METHOD_UNDEFINED; - mWmService.mWindowPlacerLocked.requestTraversal(); ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "onSyncFinishedDrawing %s", this); return true; } @@ -3861,8 +3860,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< /** * Checks if the subtree rooted at this container is finished syncing (everything is ready or - * not visible). NOTE, this is not const: it will cancel/prepare itself depending on its state - * in the hierarchy. + * not visible). NOTE, this is not const: it may cancel/prepare/complete itself depending on + * its state in the hierarchy. * * @return {@code true} if this subtree is finished waiting for sync participants. */ diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 60b9f4b4117e..79830477ea3d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2563,12 +2563,6 @@ public class WindowManagerService extends IWindowManager.Stub && win.mSyncSeqId > lastSyncSeqId) { maybeSyncSeqId = win.shouldSyncWithBuffers() ? win.mSyncSeqId : -1; win.markRedrawForSyncReported(); - if (win.mSyncState == WindowContainer.SYNC_STATE_WAITING_FOR_DRAW - && winAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN - && maybeSyncSeqId < 0) { - // Do not wait for a drawn window which won't report draw. - win.onSyncFinishedDrawing(); - } } else { maybeSyncSeqId = -1; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 59c673791db3..096f8f67d494 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5957,12 +5957,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override boolean isSyncFinished() { - if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mViewVisibility != View.VISIBLE - && !isVisibleRequested()) { + if (!isVisibleRequested()) { // Don't wait for invisible windows. However, we don't alter the state in case the // window becomes visible while the sync group is still active. return true; } + if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mWinAnimator.mDrawState == HAS_DRAWN + && !mRedrawForSyncReported && !mWmService.mResizingWindows.contains(this)) { + // Complete the sync state immediately for a drawn window that doesn't need to redraw. + onSyncFinishedDrawing(); + } return super.isSyncFinished(); } @@ -6013,6 +6017,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final boolean hasSyncHandlers = executeDrawHandlers(postDrawTransaction, syncSeqId); boolean skipLayout = false; + boolean layoutNeeded = false; // Control the timing to switch the appearance of window with different rotations. final AsyncRotationController asyncRotationController = mDisplayContent.getAsyncRotationController(); @@ -6025,7 +6030,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } else if (syncActive) { // Currently in a Sync that is using BLAST. if (!syncStillPending) { - onSyncFinishedDrawing(); + layoutNeeded = onSyncFinishedDrawing(); } if (postDrawTransaction != null) { mSyncTransaction.merge(postDrawTransaction); @@ -6034,10 +6039,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } else if (useBLASTSync()) { // Sync that is not using BLAST - onSyncFinishedDrawing(); + layoutNeeded = onSyncFinishedDrawing(); } - final boolean layoutNeeded = + layoutNeeded |= mWinAnimator.finishDrawingLocked(postDrawTransaction, mClientWasDrawingForSync); mClientWasDrawingForSync = false; // We always want to force a traversal after a finish draw for blast sync. diff --git a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java index df7b3cdebe28..aff9c1a9372a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java @@ -31,6 +31,7 @@ import static com.android.server.wm.WindowState.BLAST_TIMEOUT_DURATION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -108,9 +109,7 @@ public class SyncEngineTests extends WindowTestsBase { bse.onSurfacePlacement(); verify(listener, times(0)).onTransactionReady(anyInt(), any()); - mockWC.onSyncFinishedDrawing(); - // Make sure the second traversal is requested. - verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal(); + assertTrue(mockWC.onSyncFinishedDrawing()); bse.onSurfacePlacement(); verify(listener, times(1)).onTransactionReady(eq(id), notNull()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index f24318bb1116..b2761d1d463d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1238,7 +1238,8 @@ public class WindowOrganizerTests extends WindowTestsBase { assertTrue(w1.useBLASTSync()); assertTrue(w2.useBLASTSync()); - w1.immediatelyNotifyBlastSync(); + // A drawn window can complete the sync state automatically. + w1.mWinAnimator.mDrawState = WindowStateAnimator.HAS_DRAWN; mWm.mSyncEngine.onSurfacePlacement(); verify(mockCallback).onTransactionReady(anyInt(), any()); assertFalse(w1.useBLASTSync()); |