summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-01-06 13:49:36 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-01-06 13:49:36 +0000
commitea5ef0018a1e6150244a4c64830ecec64d8cafeb (patch)
tree7c074f5d9dce2ac791e06c8eda7213ced31cd2db
parent21207f26faff4685fdafd325d3605b927e7c729b (diff)
parent4d9d3883fa6571a91ddd4a9ffb7a430b2cd90b12 (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>
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java3
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());