Loading services/core/java/com/android/server/wm/WindowState.java +1 −14 Original line number Diff line number Diff line Loading @@ -387,14 +387,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP /** The last syncId associated with a BLAST prepareSync or 0 when no BLAST sync is active. */ int mPrepareSyncSeqId = 0; /** * {@code true} when the client was still drawing for sync when the sync-set was finished or * cancelled. This can happen if the window goes away during a sync. In this situation we need * to make sure to still apply the postDrawTransaction when it finishes to prevent the client * from getting stuck in a bad state. */ boolean mClientWasDrawingForSync = false; /** * Special mode that is intended only for the rounded corner overlay: during rotation * transition, we un-rotate the window token such that the window appears as it did before the Loading Loading @@ -5977,9 +5969,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override void finishSync(Transaction outMergedTransaction, boolean cancel) { if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mRedrawForSyncReported) { mClientWasDrawingForSync = true; } mPrepareSyncSeqId = 0; if (cancel) { // This is leaving sync so any buffers left in the sync have a chance of Loading Loading @@ -6047,9 +6036,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP layoutNeeded = onSyncFinishedDrawing(); } layoutNeeded |= mWinAnimator.finishDrawingLocked(postDrawTransaction, mClientWasDrawingForSync); mClientWasDrawingForSync = false; layoutNeeded |= mWinAnimator.finishDrawingLocked(postDrawTransaction); // We always want to force a traversal after a finish draw for blast sync. return !skipLayout && (hasSyncHandlers || layoutNeeded); } Loading services/core/java/com/android/server/wm/WindowStateAnimator.java +2 −26 Original line number Diff line number Diff line Loading @@ -151,17 +151,6 @@ class WindowStateAnimator { int mAttrType; /** * Handles surface changes synchronized to after the client has drawn the surface. This * transaction is currently used to reparent the old surface children to the new surface once * the client has completed drawing to the new surface. * This transaction is also used to merge transactions parceled in by the client. The client * uses the transaction to update the relative z of its children from the old parent surface * to the new parent surface once window manager reparents its children. */ private final SurfaceControl.Transaction mPostDrawTransaction = new SurfaceControl.Transaction(); WindowStateAnimator(final WindowState win) { final WindowManagerService service = win.mWmService; Loading Loading @@ -217,8 +206,7 @@ class WindowStateAnimator { } } boolean finishDrawingLocked(SurfaceControl.Transaction postDrawTransaction, boolean forceApplyNow) { boolean finishDrawingLocked(SurfaceControl.Transaction postDrawTransaction) { final boolean startingWindow = mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; if (startingWindow) { Loading @@ -240,14 +228,7 @@ class WindowStateAnimator { } if (postDrawTransaction != null) { // If there is no surface, the last draw was for the previous surface. We don't want to // wait until the new surface is shown and instead just apply the transaction right // away. if (mLastHidden && mDrawState != NO_SURFACE && !forceApplyNow) { mPostDrawTransaction.merge(postDrawTransaction); } else { mWin.getSyncTransaction().merge(postDrawTransaction); } layoutNeeded = true; } Loading Loading @@ -543,7 +524,6 @@ class WindowStateAnimator { if (!shown) return false; t.merge(mPostDrawTransaction); return true; } Loading Loading @@ -710,10 +690,6 @@ class WindowStateAnimator { } void destroySurface(SurfaceControl.Transaction t) { // Since the SurfaceControl is getting torn down, it's safe to just clean up any // pending transactions that were in mPostDrawTransaction, as well. t.merge(mPostDrawTransaction); try { if (mSurfaceController != null) { mSurfaceController.destroy(t); Loading services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +5 −0 Original line number Diff line number Diff line Loading @@ -552,7 +552,12 @@ public class WindowStateTests extends WindowTestsBase { win.applyWithNextDraw(t -> handledT[0] = t); assertTrue(win.useBLASTSync()); final SurfaceControl.Transaction drawT = new StubTransaction(); final SurfaceControl.Transaction currT = win.getSyncTransaction(); clearInvocations(currT); win.mWinAnimator.mLastHidden = true; assertTrue(win.finishDrawing(drawT, Integer.MAX_VALUE)); // The draw transaction should be merged to current transaction even if the state is hidden. verify(currT).merge(eq(drawT)); assertEquals(drawT, handledT[0]); assertFalse(win.useBLASTSync()); Loading Loading
services/core/java/com/android/server/wm/WindowState.java +1 −14 Original line number Diff line number Diff line Loading @@ -387,14 +387,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP /** The last syncId associated with a BLAST prepareSync or 0 when no BLAST sync is active. */ int mPrepareSyncSeqId = 0; /** * {@code true} when the client was still drawing for sync when the sync-set was finished or * cancelled. This can happen if the window goes away during a sync. In this situation we need * to make sure to still apply the postDrawTransaction when it finishes to prevent the client * from getting stuck in a bad state. */ boolean mClientWasDrawingForSync = false; /** * Special mode that is intended only for the rounded corner overlay: during rotation * transition, we un-rotate the window token such that the window appears as it did before the Loading Loading @@ -5977,9 +5969,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override void finishSync(Transaction outMergedTransaction, boolean cancel) { if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mRedrawForSyncReported) { mClientWasDrawingForSync = true; } mPrepareSyncSeqId = 0; if (cancel) { // This is leaving sync so any buffers left in the sync have a chance of Loading Loading @@ -6047,9 +6036,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP layoutNeeded = onSyncFinishedDrawing(); } layoutNeeded |= mWinAnimator.finishDrawingLocked(postDrawTransaction, mClientWasDrawingForSync); mClientWasDrawingForSync = false; layoutNeeded |= mWinAnimator.finishDrawingLocked(postDrawTransaction); // We always want to force a traversal after a finish draw for blast sync. return !skipLayout && (hasSyncHandlers || layoutNeeded); } Loading
services/core/java/com/android/server/wm/WindowStateAnimator.java +2 −26 Original line number Diff line number Diff line Loading @@ -151,17 +151,6 @@ class WindowStateAnimator { int mAttrType; /** * Handles surface changes synchronized to after the client has drawn the surface. This * transaction is currently used to reparent the old surface children to the new surface once * the client has completed drawing to the new surface. * This transaction is also used to merge transactions parceled in by the client. The client * uses the transaction to update the relative z of its children from the old parent surface * to the new parent surface once window manager reparents its children. */ private final SurfaceControl.Transaction mPostDrawTransaction = new SurfaceControl.Transaction(); WindowStateAnimator(final WindowState win) { final WindowManagerService service = win.mWmService; Loading Loading @@ -217,8 +206,7 @@ class WindowStateAnimator { } } boolean finishDrawingLocked(SurfaceControl.Transaction postDrawTransaction, boolean forceApplyNow) { boolean finishDrawingLocked(SurfaceControl.Transaction postDrawTransaction) { final boolean startingWindow = mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; if (startingWindow) { Loading @@ -240,14 +228,7 @@ class WindowStateAnimator { } if (postDrawTransaction != null) { // If there is no surface, the last draw was for the previous surface. We don't want to // wait until the new surface is shown and instead just apply the transaction right // away. if (mLastHidden && mDrawState != NO_SURFACE && !forceApplyNow) { mPostDrawTransaction.merge(postDrawTransaction); } else { mWin.getSyncTransaction().merge(postDrawTransaction); } layoutNeeded = true; } Loading Loading @@ -543,7 +524,6 @@ class WindowStateAnimator { if (!shown) return false; t.merge(mPostDrawTransaction); return true; } Loading Loading @@ -710,10 +690,6 @@ class WindowStateAnimator { } void destroySurface(SurfaceControl.Transaction t) { // Since the SurfaceControl is getting torn down, it's safe to just clean up any // pending transactions that were in mPostDrawTransaction, as well. t.merge(mPostDrawTransaction); try { if (mSurfaceController != null) { mSurfaceController.destroy(t); Loading
services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +5 −0 Original line number Diff line number Diff line Loading @@ -552,7 +552,12 @@ public class WindowStateTests extends WindowTestsBase { win.applyWithNextDraw(t -> handledT[0] = t); assertTrue(win.useBLASTSync()); final SurfaceControl.Transaction drawT = new StubTransaction(); final SurfaceControl.Transaction currT = win.getSyncTransaction(); clearInvocations(currT); win.mWinAnimator.mLastHidden = true; assertTrue(win.finishDrawing(drawT, Integer.MAX_VALUE)); // The draw transaction should be merged to current transaction even if the state is hidden. verify(currT).merge(eq(drawT)); assertEquals(drawT, handledT[0]); assertFalse(win.useBLASTSync()); Loading