From 3c57702ea1b060d668d32bf3f75ab1a4c7318c3a Mon Sep 17 00:00:00 2001 From: chaviw Date: Thu, 15 Oct 2020 13:35:23 -0700 Subject: [PATCH 1/2] Send transaction when possible for WSA In WSA, we are sometimes using the global transaction. This will make things difficult when trying to handle synced transactions for blast sync. We need to make sure all changes on WSA that can happen during a sync are put on the sync transaction so they can all be applied by the client at the same time. Also cleaned up some unused functions in SurfaceControl. Test: Split and PIP Change-Id: Ic1abc3c009c38d00593f80a4e03f895c026364e2 --- core/java/android/view/SurfaceControl.java | 112 +----------------- .../com/android/server/wm/DisplayContent.java | 6 +- .../server/wm/RootWindowContainer.java | 6 +- .../server/wm/TaskScreenshotAnimatable.java | 2 +- .../server/wm/WindowManagerService.java | 2 +- .../com/android/server/wm/WindowState.java | 20 ++-- .../server/wm/WindowStateAnimator.java | 48 ++++---- .../server/wm/WindowSurfaceController.java | 24 ++-- 8 files changed, 61 insertions(+), 159 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index d7ee6ad151669..35dd781146a80 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1523,24 +1523,6 @@ public final class SurfaceControl implements Parcelable { } } - /** - * @hide - */ - public void deferTransactionUntil(SurfaceControl barrier, long frame) { - synchronized(SurfaceControl.class) { - sGlobalTransaction.deferTransactionUntil(this, barrier, frame); - } - } - - /** - * @hide - */ - public void reparentChildren(SurfaceControl newParent) { - synchronized(SurfaceControl.class) { - sGlobalTransaction.reparentChildren(this, newParent); - } - } - /** * @hide */ @@ -1550,60 +1532,6 @@ public final class SurfaceControl implements Parcelable { } } - /** - * @hide - */ - @UnsupportedAppUsage - public void setLayer(int zorder) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setLayer(this, zorder); - } - } - - /** - * @hide - */ - @UnsupportedAppUsage - public void setPosition(float x, float y) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setPosition(this, x, y); - } - } - - /** - * @hide - */ - public void setBufferSize(int w, int h) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setBufferSize(this, w, h); - } - } - - /** - * @hide - */ - @UnsupportedAppUsage - public void hide() { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.hide(this); - } - } - - /** - * @hide - */ - @UnsupportedAppUsage - public void show() { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.show(this); - } - } - /** * @hide */ @@ -1644,36 +1572,6 @@ public final class SurfaceControl implements Parcelable { return nativeGetAnimationFrameStats(outStats); } - /** - * @hide - */ - public void setAlpha(float alpha) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setAlpha(this, alpha); - } - } - - /** - * @hide - */ - public void setBackgroundBlurRadius(int blur) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setBackgroundBlurRadius(this, blur); - } - } - - /** - * @hide - */ - public void setMatrix(float dsdx, float dtdx, float dtdy, float dsdy) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setMatrix(this, dsdx, dtdx, dtdy, dsdy); - } - } - /** * Sets the Surface to be color space agnostic. If a surface is color space agnostic, * the color can be interpreted in any color space. @@ -1688,18 +1586,12 @@ public final class SurfaceControl implements Parcelable { } /** - * Bounds the surface and its children to the bounds specified. Size of the surface will be - * ignored and only the crop and buffer size will be used to determine the bounds of the - * surface. If no crop is specified and the surface has no buffer, the surface bounds is only - * constrained by the size of its parent bounds. - * - * @param crop Bounds of the crop to apply. * @hide */ - public void setWindowCrop(Rect crop) { + public void setBackgroundBlurRadius(int blur) { checkNotReleased(); synchronized (SurfaceControl.class) { - sGlobalTransaction.setWindowCrop(this, crop); + sGlobalTransaction.setBackgroundBlurRadius(this, blur); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e88f8e3908335..637b4198571e1 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3405,6 +3405,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp boolean destroyLeakedSurfaces() { // Used to indicate that a surface was leaked. mTmpWindow = null; + final Transaction t = mWmService.mTransactionFactory.get(); forAllWindows(w -> { final WindowStateAnimator wsa = w.mWinAnimator; if (wsa.mSurfaceController == null) { @@ -3416,7 +3417,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp + " token=" + w.mToken + " pid=" + w.mSession.mPid + " uid=" + w.mSession.mUid); - wsa.destroySurface(); + wsa.destroySurface(t); mWmService.mForceRemoves.add(w); mTmpWindow = w; } else if (w.mActivityRecord != null && !w.mActivityRecord.isClientVisible()) { @@ -3424,10 +3425,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp + w + " surface=" + wsa.mSurfaceController + " token=" + w.mActivityRecord); ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE LEAK DESTROY: %s", w); - wsa.destroySurface(); + wsa.destroySurface(t); mTmpWindow = w; } }, false /* traverseTopToBottom */); + t.apply(); return mTmpWindow != null; } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 497087a967f3d..169d5f2155ed4 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -778,7 +778,9 @@ class RootWindowContainer extends WindowContainer if (surfaceController != null) { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE RECOVER DESTROY: %s", winAnimator.mWin); - winAnimator.destroySurface(); + SurfaceControl.Transaction t = mWmService.mTransactionFactory.get(); + winAnimator.destroySurface(t); + t.apply(); if (winAnimator.mWin.mActivityRecord != null) { winAnimator.mWin.mActivityRecord.removeStartingWindow(); } @@ -926,7 +928,7 @@ class RootWindowContainer extends WindowContainer displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; } win.destroySurfaceUnchecked(); - win.mWinAnimator.destroyPreservedSurfaceLocked(); + win.mWinAnimator.destroyPreservedSurfaceLocked(win.getSyncTransaction()); } while (i > 0); mWmService.mDestroySurface.clear(); } diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java index 3def0911bd766..1779d2a394eb3 100644 --- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java +++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java @@ -60,7 +60,7 @@ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { surface.attachAndQueueBufferWithColorSpace(buffer, screenshotBuffer.getColorSpace()); surface.release(); final float scale = 1.0f * mTask.getBounds().width() / mWidth; - mSurfaceControl.setMatrix(scale, 0, 0, scale); + getPendingTransaction().setMatrix(mSurfaceControl, scale, 0, 0, scale); } getPendingTransaction().show(mSurfaceControl); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 8fd342c25bc32..06a4f728c461c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5349,7 +5349,7 @@ public class WindowManagerService extends IWindowManager.Stub void destroyPreservedSurfaceLocked() { for (int i = mDestroyPreservedSurface.size() - 1; i >= 0 ; i--) { final WindowState w = mDestroyPreservedSurface.get(i); - w.mWinAnimator.destroyPreservedSurfaceLocked(); + w.mWinAnimator.destroyPreservedSurfaceLocked(w.getSyncTransaction()); } mDestroyPreservedSurface.clear(); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index bc8699e2ee394..c2a6df3099e61 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -617,6 +617,8 @@ class WindowState extends WindowContainer implements WindowManagerP private final Rect mTmpRect = new Rect(); private final Point mTmpPoint = new Point(); + private final Transaction mTmpTransaction; + /** * If a window is on a display which has been re-parented to a view in another window, * use this offset to indicate the correct location. @@ -861,6 +863,7 @@ class WindowState extends WindowContainer implements WindowManagerP int ownerId, int showUserId, boolean ownerCanAddInternalSystemWindow, PowerManagerWrapper powerManagerWrapper) { super(service); + mTmpTransaction = service.mTransactionFactory.get(); mSession = s; mClient = c; mAppOp = appOp; @@ -2176,8 +2179,9 @@ class WindowState extends WindowContainer implements WindowManagerP disposeInputChannel(); - mWinAnimator.destroyDeferredSurfaceLocked(); - mWinAnimator.destroySurfaceLocked(); + mWinAnimator.destroyDeferredSurfaceLocked(mTmpTransaction); + mWinAnimator.destroySurfaceLocked(mTmpTransaction); + mTmpTransaction.apply(); mSession.windowRemovedLocked(); try { mClient.asBinder().unlinkToDeath(mDeathRecipient, 0); @@ -3238,7 +3242,8 @@ class WindowState extends WindowContainer implements WindowManagerP } if (appStopped || mWindowRemovalAllowed) { - mWinAnimator.destroyPreservedSurfaceLocked(); + mWinAnimator.destroyPreservedSurfaceLocked(mTmpTransaction); + mTmpTransaction.apply(); } if (mDestroying) { @@ -3274,7 +3279,8 @@ class WindowState extends WindowContainer implements WindowManagerP // various indicators of whether the client has released the surface. // This is in general unsafe, and most callers should use {@link #destroySurface} void destroySurfaceUnchecked() { - mWinAnimator.destroySurfaceLocked(); + mWinAnimator.destroySurfaceLocked(mTmpTransaction); + mTmpTransaction.apply(); // Clear animating flags now, since the surface is now gone. (Note this is true even // if the surface is saved, to outside world the surface is still NO_SURFACE.) @@ -4942,7 +4948,7 @@ class WindowState extends WindowContainer implements WindowManagerP // on the new one. This prevents blinking when we change elevation of freeform and // pinned windows. if (!mWinAnimator.tryChangeFormatInPlaceLocked()) { - mWinAnimator.preserveSurfaceLocked(getPendingTransaction()); + mWinAnimator.preserveSurfaceLocked(getSyncTransaction()); result |= RELAYOUT_RES_SURFACE_CHANGED | RELAYOUT_RES_FIRST_TIME; scheduleAnimation(); @@ -4961,7 +4967,7 @@ class WindowState extends WindowContainer implements WindowManagerP // to preserve and destroy windows which are attached to another, they // will keep their surface and its size may change over time. if (mHasSurface && !isChildWindow()) { - mWinAnimator.preserveSurfaceLocked(getPendingTransaction()); + mWinAnimator.preserveSurfaceLocked(getSyncTransaction()); result |= RELAYOUT_RES_SURFACE_CHANGED | RELAYOUT_RES_FIRST_TIME; scheduleAnimation(); @@ -5264,7 +5270,7 @@ class WindowState extends WindowContainer implements WindowManagerP updateFrameRateSelectionPriorityIfNeeded(); updateGlobalScaleIfNeeded(); - mWinAnimator.prepareSurfaceLocked(SurfaceControl.getGlobalTransaction(), true); + mWinAnimator.prepareSurfaceLocked(getSyncTransaction(), true); super.prepareSurfaces(); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 9cc72a2ddf7c2..143f83bc3c8a0 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -362,7 +362,7 @@ class WindowStateAnimator { mSurfaceController.mSurfaceControl, mPendingDestroySurface.mSurfaceControl).apply(); } - destroySurfaceLocked(); + destroySurfaceLocked(t); mSurfaceDestroyDeferred = true; return; } @@ -375,10 +375,10 @@ class WindowStateAnimator { } mDestroyPreservedSurfaceUponRedraw = true; mSurfaceDestroyDeferred = true; - destroySurfaceLocked(); + destroySurfaceLocked(t); } - void destroyPreservedSurfaceLocked() { + void destroyPreservedSurfaceLocked(SurfaceControl.Transaction t) { if (!mDestroyPreservedSurfaceUponRedraw) { return; } @@ -397,7 +397,7 @@ class WindowStateAnimator { mSurfaceController.mSurfaceControl).apply(); } - destroyDeferredSurfaceLocked(); + destroyDeferredSurfaceLocked(t); mDestroyPreservedSurfaceUponRedraw = false; } @@ -529,7 +529,7 @@ class WindowStateAnimator { return mSurfaceController != null && mSurfaceController.hasSurface(); } - void destroySurfaceLocked() { + void destroySurfaceLocked(SurfaceControl.Transaction t) { final ActivityRecord activity = mWin.mActivityRecord; if (activity != null) { if (mWin == activity.mStartingWindow) { @@ -557,14 +557,14 @@ class WindowStateAnimator { if (mPendingDestroySurface != null) { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY PENDING: %s. %s", mWin, new RuntimeException().fillInStackTrace()); - mPendingDestroySurface.destroyNotInTransaction(); + mPendingDestroySurface.destroy(t); } mPendingDestroySurface = mSurfaceController; } } else { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY: %s. %s", mWin, new RuntimeException().fillInStackTrace()); - destroySurface(); + destroySurface(t); } // Don't hide wallpaper if we're deferring the surface destroy // because of a surface change. @@ -587,12 +587,12 @@ class WindowStateAnimator { mDrawState = NO_SURFACE; } - void destroyDeferredSurfaceLocked() { + void destroyDeferredSurfaceLocked(SurfaceControl.Transaction t) { try { if (mPendingDestroySurface != null) { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, "SURFACE DESTROY PENDING: %s. %s", mWin, new RuntimeException().fillInStackTrace()); - mPendingDestroySurface.destroyNotInTransaction(); + mPendingDestroySurface.destroy(t); // Don't hide wallpaper if we're destroying a deferred surface // after a surface mode change. if (!mDestroyPreservedSurfaceUponRedraw) { @@ -665,11 +665,17 @@ class WindowStateAnimator { final Task task = w.getTask(); if (shouldConsumeMainWindowSizeTransaction()) { - t.deferTransactionUntil(task.getMainWindowSizeChangeTask().getSurfaceControl(), - mWin.getClientViewRootSurface(), mWin.getFrameNumber()); - t.deferTransactionUntil(mSurfaceController.mSurfaceControl, - mWin.getClientViewRootSurface(), mWin.getFrameNumber()); - t.merge(task.getMainWindowSizeChangeTransaction()); + // Use pending transaction here instead of the transaction passed in because we want to + // ensure the defer transaction is applied on the main transaction and not on the sync + // transaction. This is because the sync transaction could contain the buffer and we'd + // defer the transaction that contains the buffer we're deferring on. + SurfaceControl.Transaction pendingTransaction = mWin.getPendingTransaction(); + pendingTransaction.deferTransactionUntil( + task.getMainWindowSizeChangeTask().getSurfaceControl(), + mWin.getClientViewRootSurface(), mWin.getFrameNumber()); + pendingTransaction.deferTransactionUntil(mSurfaceController.mSurfaceControl, + mWin.getClientViewRootSurface(), mWin.getFrameNumber()); + pendingTransaction.merge(task.getMainWindowSizeChangeTransaction()); task.setMainWindowSizeChangeTransaction(null); } @@ -804,7 +810,7 @@ class WindowStateAnimator { mXOffset, mYOffset, mWallpaperScale, recoveringMemory); } else { prepared = - mSurfaceController.prepareToShowInTransaction(mShownAlpha, + mSurfaceController.prepareToShowInTransaction(t, mShownAlpha, mDsDx * w.mHScale, mDtDx * w.mVScale, mDtDy * w.mHScale, @@ -814,7 +820,7 @@ class WindowStateAnimator { if (prepared && mDrawState == HAS_DRAWN) { if (mLastHidden) { - if (showSurfaceRobustlyLocked()) { + if (showSurfaceRobustlyLocked(t)) { markPreservedSurfaceForDestroy(); mAnimator.requestRemovalOfReplacedWindows(w); mLastHidden = false; @@ -974,8 +980,8 @@ class WindowStateAnimator { * * @return Returns true if the surface was successfully shown. */ - private boolean showSurfaceRobustlyLocked() { - boolean shown = mSurfaceController.showRobustlyInTransaction(); + private boolean showSurfaceRobustlyLocked(SurfaceControl.Transaction t) { + boolean shown = mSurfaceController.showRobustly(t); if (!shown) return false; @@ -993,7 +999,7 @@ class WindowStateAnimator { } } - SurfaceControl.mergeToGlobalTransaction(mPostDrawTransaction); + t.merge(mPostDrawTransaction); return true; } @@ -1174,10 +1180,10 @@ class WindowStateAnimator { return false; } - void destroySurface() { + void destroySurface(SurfaceControl.Transaction t) { try { if (mSurfaceController != null) { - mSurfaceController.destroyNotInTransaction(); + mSurfaceController.destroy(t); } } catch (RuntimeException e) { Slog.w(TAG, "Exception thrown when destroying surface " + this diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index ec79c5999a3f3..c4fbf4ffc48ee 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -131,7 +131,7 @@ class WindowSurfaceController { void hide(SurfaceControl.Transaction transaction, String reason) { ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE HIDE ( %s ): %s", reason, title); - mAnimator.destroyPreservedSurfaceLocked(); + mAnimator.destroyPreservedSurfaceLocked(transaction); if (mSurfaceShown) { hideSurface(transaction); } @@ -149,12 +149,12 @@ class WindowSurfaceController { } } - void destroyNotInTransaction() { + void destroy(SurfaceControl.Transaction t) { ProtoLog.i(WM_SHOW_SURFACE_ALLOC, - "Destroying surface %s called by %s", this, Debug.getCallers(8)); + "Destroying surface %s called by %s", this, Debug.getCallers(8)); try { if (mSurfaceControl != null) { - mTmpTransaction.remove(mSurfaceControl).apply(); + t.remove(mSurfaceControl); } } catch (RuntimeException e) { Slog.w(TAG, "Error destroying surface in: " + this, e); @@ -215,19 +215,18 @@ class WindowSurfaceController { } } - boolean prepareToShowInTransaction(float alpha, + boolean prepareToShowInTransaction(SurfaceControl.Transaction t, float alpha, float dsdx, float dtdx, float dsdy, float dtdy, boolean recoveringMemory) { if (mSurfaceControl != null) { try { mSurfaceAlpha = alpha; - mSurfaceControl.setAlpha(alpha); + t.setAlpha(mSurfaceControl, alpha); mLastDsdx = dsdx; mLastDtdx = dtdx; mLastDsdy = dsdy; mLastDtdy = dtdy; - mSurfaceControl.setMatrix( - dsdx, dtdx, dsdy, dtdy); + t.setMatrix(mSurfaceControl, dsdx, dtdx, dsdy, dtdy); } catch (RuntimeException e) { Slog.w(TAG, "Error updating surface in " + title, e); if (!recoveringMemory) { @@ -327,7 +326,7 @@ class WindowSurfaceController { } } - boolean showRobustlyInTransaction() { + boolean showRobustly(SurfaceControl.Transaction t) { ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE SHOW (performLayout): %s", title); if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this + " during relayout"); @@ -338,7 +337,7 @@ class WindowSurfaceController { try { setShown(true); - mSurfaceControl.show(); + t.show(mSurfaceControl); return true; } catch (RuntimeException e) { Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + this, e); @@ -348,11 +347,6 @@ class WindowSurfaceController { return false; } - void deferTransactionUntil(SurfaceControl barrier, long frame) { - // TODO: Logging - mSurfaceControl.deferTransactionUntil(barrier, frame); - } - boolean clearWindowContentFrameStats() { if (mSurfaceControl == null) { return false; From 8bbdc770f5c77840283aaf21e3dc08a42a9d65df Mon Sep 17 00:00:00 2001 From: chaviw Date: Thu, 15 Oct 2020 15:08:02 -0700 Subject: [PATCH 2/2] Clean up code in WSA and WS 1. Use Transaction API instead of SurfaceControl 2. Removed recoverMemory flag from Tranaction request APIs 3. Deleted a lot of unused code Test: Split Screen + PIP Change-Id: I91762453afadd79626f6fb2d8ba162054a011584 --- core/java/android/view/SurfaceControl.java | 64 --------- .../com/android/server/wm/ActivityRecord.java | 17 +-- .../server/wm/WindowManagerService.java | 3 +- .../com/android/server/wm/WindowState.java | 11 +- .../server/wm/WindowStateAnimator.java | 133 ++++-------------- .../server/wm/WindowSurfaceController.java | 119 +++++----------- 6 files changed, 80 insertions(+), 267 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 35dd781146a80..eef5ce6be2ca3 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1523,25 +1523,6 @@ public final class SurfaceControl implements Parcelable { } } - /** - * @hide - */ - public void detachChildren() { - synchronized(SurfaceControl.class) { - sGlobalTransaction.detachChildren(this); - } - } - - /** - * @hide - */ - public void setTransparentRegionHint(Region region) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setTransparentRegionHint(this, region); - } - } - /** * @hide */ @@ -1572,51 +1553,6 @@ public final class SurfaceControl implements Parcelable { return nativeGetAnimationFrameStats(outStats); } - /** - * Sets the Surface to be color space agnostic. If a surface is color space agnostic, - * the color can be interpreted in any color space. - * @param agnostic A boolean to indicate whether the surface is color space agnostic - * @hide - */ - public void setColorSpaceAgnostic(boolean agnostic) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setColorSpaceAgnostic(this, agnostic); - } - } - - /** - * @hide - */ - public void setBackgroundBlurRadius(int blur) { - checkNotReleased(); - synchronized (SurfaceControl.class) { - sGlobalTransaction.setBackgroundBlurRadius(this, blur); - } - } - - /** - * @hide - */ - public void setOpaque(boolean isOpaque) { - checkNotReleased(); - - synchronized (SurfaceControl.class) { - sGlobalTransaction.setOpaque(this, isOpaque); - } - } - - /** - * @hide - */ - public void setSecure(boolean isSecure) { - checkNotReleased(); - - synchronized (SurfaceControl.class) { - sGlobalTransaction.setSecure(this, isSecure); - } - } - /** * @hide */ diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 743796b0aad09..758c1ed23bb5e 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -95,18 +95,18 @@ import static android.view.Display.COLOR_MODE_DEFAULT; import static android.view.Display.INVALID_DISPLAY; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; -import static android.view.WindowManager.TRANSIT_CLOSE; -import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE; -import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE; -import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN_BEHIND; -import static android.view.WindowManager.TRANSIT_OLD_UNSET; +import static android.view.SurfaceControl.getGlobalTransaction; import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND; +import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE; +import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_OLD_UNSET; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS; @@ -182,7 +182,6 @@ import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION; -import static com.android.server.wm.Task.TASK_VISIBILITY_VISIBLE; import static com.android.server.wm.Task.ActivityState.DESTROYED; import static com.android.server.wm.Task.ActivityState.DESTROYING; import static com.android.server.wm.Task.ActivityState.FINISHING; @@ -194,6 +193,7 @@ import static com.android.server.wm.Task.ActivityState.RESUMED; import static com.android.server.wm.Task.ActivityState.STARTED; import static com.android.server.wm.Task.ActivityState.STOPPED; import static com.android.server.wm.Task.ActivityState.STOPPING; +import static com.android.server.wm.Task.TASK_VISIBILITY_VISIBLE; import static com.android.server.wm.TaskPersister.DEBUG; import static com.android.server.wm.TaskPersister.IMAGE_EXTENSION; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; @@ -3131,7 +3131,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A SurfaceControl.openTransaction(); for (int i = mChildren.size() - 1; i >= 0; i--) { final WindowState w = mChildren.get(i); - w.mWinAnimator.detachChildren(); + w.mWinAnimator.detachChildren(getGlobalTransaction()); } SurfaceControl.closeTransaction(); } @@ -4443,7 +4443,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A SurfaceControl.openTransaction(); try { forAllWindows(win -> { - win.mWinAnimator.hide("immediately hidden"); }, true); + win.mWinAnimator.hide(getGlobalTransaction(), "immediately hidden"); + }, true); } finally { SurfaceControl.closeTransaction(); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 06a4f728c461c..f233199365360 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -48,6 +48,7 @@ import static android.provider.Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COM import static android.provider.Settings.Global.DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static android.view.SurfaceControl.getGlobalTransaction; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; @@ -2557,7 +2558,7 @@ public class WindowManagerService extends IWindowManager.Stub // side child surfaces, so they will remain preserved in their current state // (rather than be cleaned up immediately by the app code). SurfaceControl.openTransaction(); - winAnimator.detachChildren(); + winAnimator.detachChildren(getGlobalTransaction()); SurfaceControl.closeTransaction(); return focusMayChange; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c2a6df3099e61..3bbdcb8dfedd3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -32,6 +32,7 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.SurfaceControl.Transaction; +import static android.view.SurfaceControl.getGlobalTransaction; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION; @@ -2649,7 +2650,7 @@ class WindowState extends WindowContainer implements WindowManagerP clearPolicyVisibilityFlag(LEGACY_POLICY_VISIBILITY); } if (!isVisibleByPolicy()) { - mWinAnimator.hide("checkPolicyVisibilityChange"); + mWinAnimator.hide(getGlobalTransaction(), "checkPolicyVisibilityChange"); if (isFocused()) { ProtoLog.i(WM_DEBUG_FOCUS_LIGHT, "setAnimationLocked: setting mFocusMayChange true"); @@ -3180,10 +3181,10 @@ class WindowState extends WindowContainer implements WindowManagerP // detaching any surface control the client added from the client. for (int i = mChildren.size() - 1; i >= 0; --i) { final WindowState c = mChildren.get(i); - c.mWinAnimator.detachChildren(); + c.mWinAnimator.detachChildren(getGlobalTransaction()); } - mWinAnimator.detachChildren(); + mWinAnimator.detachChildren(getGlobalTransaction()); } try { @@ -4806,7 +4807,7 @@ class WindowState extends WindowContainer implements WindowManagerP c.hideWallpaperWindow(wasDeferred, reason); } if (!mWinAnimator.mLastHidden || wasDeferred) { - mWinAnimator.hide(reason); + mWinAnimator.hide(getGlobalTransaction(), reason); getDisplayContent().mWallpaperController.mDeferredHideWallpaper = null; dispatchWallpaperVisibility(false); final DisplayContent displayContent = getDisplayContent(); @@ -5270,7 +5271,7 @@ class WindowState extends WindowContainer implements WindowManagerP updateFrameRateSelectionPriorityIfNeeded(); updateGlobalScaleIfNeeded(); - mWinAnimator.prepareSurfaceLocked(getSyncTransaction(), true); + mWinAnimator.prepareSurfaceLocked(getSyncTransaction()); super.prepareSurfaces(); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 143f83bc3c8a0..068d0dfd0602d 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -57,7 +57,6 @@ import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_C import android.content.Context; import android.graphics.Matrix; import android.graphics.PixelFormat; -import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; import android.os.Debug; @@ -130,10 +129,6 @@ class WindowStateAnimator { float mAlpha = 0; float mLastAlpha = 0; - Rect mTmpStackBounds = new Rect(); - private Rect mTmpAnimatingBounds = new Rect(); - private Rect mTmpSourceBounds = new Rect(); - /** * This is rectangle of the window's surface that is not covered by * system decorations. @@ -154,8 +149,6 @@ class WindowStateAnimator { * window is first added or shown, cleared when the callback has been made. */ boolean mEnteringAnimation; - private final SurfaceControl.Transaction mTmpTransaction; - /** The pixel format of the underlying SurfaceControl */ int mSurfaceFormat; @@ -201,12 +194,6 @@ class WindowStateAnimator { // region. float mWallpaperScale = 1f; - /** - * A flag to determine if the WSA needs to offset its position to compensate for the stack's - * position update before the WSA surface has resized. - */ - private boolean mOffsetPositionForStackResize; - private final Rect mTmpSize = new Rect(); /** @@ -220,13 +207,10 @@ class WindowStateAnimator { private final SurfaceControl.Transaction mPostDrawTransaction = new SurfaceControl.Transaction(); - private final Point mTmpPos = new Point(); - WindowStateAnimator(final WindowState win) { final WindowManagerService service = win.mWmService; mService = service; - mTmpTransaction = service.mTransactionFactory.get(); mAnimator = service.mAnimator; mPolicy = service.mPolicy; mContext = service.mContext; @@ -243,7 +227,7 @@ class WindowStateAnimator { if (DEBUG_ANIM) Slog.v( TAG, "Animation done in " + this + ": exiting=" + mWin.mAnimatingExit + ", reportedVisible=" - + (mWin.mActivityRecord != null ? mWin.mActivityRecord.reportedVisible : false)); + + (mWin.mActivityRecord != null && mWin.mActivityRecord.reportedVisible)); mWin.checkPolicyVisibilityChange(); final DisplayContent displayContent = mWin.getDisplayContent(); @@ -284,11 +268,6 @@ class WindowStateAnimator { } } - void hide(String reason) { - hide(mTmpTransaction, reason); - SurfaceControl.mergeToGlobalTransaction(mTmpTransaction); - } - boolean finishDrawingLocked(SurfaceControl.Transaction postDrawTransaction) { final boolean startingWindow = mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; @@ -484,7 +463,6 @@ class WindowStateAnimator { mSurfaceController.setColorSpaceAgnostic((attrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC) != 0); - setOffsetPositionForStackResize(false); mSurfaceFormat = format; w.setHasSurface(true); @@ -655,13 +633,12 @@ class WindowStateAnimator { return true; } - void setSurfaceBoundariesLocked(SurfaceControl.Transaction t, final boolean recoveringMemory) { + void setSurfaceBoundariesLocked(SurfaceControl.Transaction t) { if (mSurfaceController == null) { return; } final WindowState w = mWin; - final LayoutParams attrs = mWin.getAttrs(); final Task task = w.getTask(); if (shouldConsumeMainWindowSizeTransaction()) { @@ -679,75 +656,26 @@ class WindowStateAnimator { task.setMainWindowSizeChangeTransaction(null); } - float surfaceWidth = mSurfaceController.getWidth(); - float surfaceHeight = mSurfaceController.getHeight(); - - final Rect insets = attrs.surfaceInsets; - - // getFrameNumber is only valid in the call-stack of relayoutWindow - // as this is the only-time we know the client renderer - // is paused. - final boolean relayout = !w.mRelayoutCalled || w.mInRelayout; - if (!w.mSeamlesslyRotated) { // Used to offset the WSA when stack position changes before a resize. int xOffset = mXOffset; int yOffset = mYOffset; - if (mOffsetPositionForStackResize) { - if (relayout) { - // Once a relayout is called, reset the offset back to 0 and defer - // setting it until a new frame with the updated size. This ensures that - // the WS position is reset (so the stack position is shown) at the same - // time that the buffer size changes. - setOffsetPositionForStackResize(false); - t.deferTransactionUntil(mSurfaceController.mSurfaceControl, - mWin.getClientViewRootSurface(), mWin.getFrameNumber()); - } else { - final Task stack = mWin.getRootTask(); - mTmpPos.x = 0; - mTmpPos.y = 0; - if (stack != null) { - stack.getRelativePosition(mTmpPos); - } - xOffset = -mTmpPos.x; - yOffset = -mTmpPos.y; - } - } - if (!mIsWallpaper) { - mSurfaceController.setPosition(t, xOffset, yOffset, recoveringMemory); - } else { - setWallpaperPositionAndScale(t, - xOffset, yOffset, mWallpaperScale, recoveringMemory); - } - } - - if (!w.mSeamlesslyRotated) { - // Wallpaper is already updated above when calling setWallpaperPositionAndScale so - // we only need to consider the non-wallpaper case here. if (!mIsWallpaper) { + mSurfaceController.setPosition(t, xOffset, yOffset); + // Wallpaper is already updated above when calling setWallpaperPositionAndScale so + // we only need to consider the non-wallpaper case here. mSurfaceController.setMatrix(t, - mDsDx * w.mHScale, - mDtDx * w.mVScale, - mDtDy * w.mHScale, - mDsDy * w.mVScale, recoveringMemory); + mDsDx * w.mHScale, + mDtDx * w.mVScale, + mDtDy * w.mHScale, + mDsDy * w.mVScale); + } else { + setWallpaperPositionAndScale(t, xOffset, yOffset, mWallpaperScale); } } } - /** - * Get rect of the task this window is currently in. If there is no task, rect will be set to - * empty. - */ - void getContainerRect(Rect rect) { - final Task task = mWin.getTask(); - if (task != null) { - task.getDimBounds(rect); - } else { - rect.left = rect.top = rect.right = rect.bottom = 0; - } - } - - void prepareSurfaceLocked(SurfaceControl.Transaction t, final boolean recoveringMemory) { + void prepareSurfaceLocked(SurfaceControl.Transaction t) { final WindowState w = mWin; if (!hasSurface()) { @@ -764,13 +692,13 @@ class WindowStateAnimator { computeShownFrameLocked(); - setSurfaceBoundariesLocked(t, recoveringMemory); + setSurfaceBoundariesLocked(t); if (mIsWallpaper && !w.mWallpaperVisible) { // Wallpaper is no longer visible and there is no wp target => hide it. - hide("prepareSurfaceLocked"); + hide(t, "prepareSurfaceLocked"); } else if (w.isParentWindowHidden() || !w.isOnScreen()) { - hide("prepareSurfaceLocked"); + hide(t, "prepareSurfaceLocked"); mWallpaperControllerLocked.hideWallpapers(w); // If we are waiting for this window to handle an orientation change. If this window is @@ -806,16 +734,15 @@ class WindowStateAnimator { boolean prepared = true; if (mIsWallpaper) { - setWallpaperPositionAndScale(t, - mXOffset, mYOffset, mWallpaperScale, recoveringMemory); + setWallpaperPositionAndScale(t, mXOffset, mYOffset, mWallpaperScale); } else { prepared = mSurfaceController.prepareToShowInTransaction(t, mShownAlpha, mDsDx * w.mHScale, mDtDx * w.mVScale, mDtDy * w.mHScale, - mDsDy * w.mVScale, - recoveringMemory); + mDsDy * w.mVScale + ); } if (prepared && mDrawState == HAS_DRAWN) { @@ -894,8 +821,7 @@ class WindowStateAnimator { Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset"); } mService.openSurfaceTransaction(); - setWallpaperPositionAndScale(SurfaceControl.getGlobalTransaction(), - dx, dy, scale, false); + setWallpaperPositionAndScale(SurfaceControl.getGlobalTransaction(), dx, dy, scale); } catch (RuntimeException e) { Slog.w(TAG, "Error positioning surface of " + mWin + " pos=(" + dx + "," + dy + ")", e); @@ -910,8 +836,8 @@ class WindowStateAnimator { return true; } - private void setWallpaperPositionAndScale(SurfaceControl.Transaction t, - int dx, int dy, float scale, boolean recoveringMemory) { + private void setWallpaperPositionAndScale(SurfaceControl.Transaction t, int dx, int dy, + float scale) { DisplayInfo displayInfo = mWin.getDisplayInfo(); Matrix matrix = mWin.mTmpMatrix; matrix.setTranslate(dx, dy); @@ -921,13 +847,12 @@ class WindowStateAnimator { matrix.reset(); mSurfaceController.setPosition(t,mWin.mTmpMatrixArray[MTRANS_X], - mWin.mTmpMatrixArray[MTRANS_Y], recoveringMemory); + mWin.mTmpMatrixArray[MTRANS_Y]); mSurfaceController.setMatrix(t, mDsDx * mWin.mTmpMatrixArray[MSCALE_X] * mWin.mHScale, mDtDx * mWin.mTmpMatrixArray[MSKEW_Y] * mWin.mVScale, mDtDy * mWin.mTmpMatrixArray[MSKEW_X] * mWin.mHScale, - mDsDy * mWin.mTmpMatrixArray[MSCALE_Y] * mWin.mVScale, - recoveringMemory); + mDsDy * mWin.mTmpMatrixArray[MSCALE_Y] * mWin.mVScale); } /** @@ -1169,10 +1094,6 @@ class WindowStateAnimator { return sb.toString(); } - void reclaimSomeSurfaceMemory(String operation, boolean secure) { - mService.mRoot.reclaimSomeSurfaceMemory(this, operation, secure); - } - boolean getShown() { if (mSurfaceController != null) { return mSurfaceController.getShown(); @@ -1195,7 +1116,7 @@ class WindowStateAnimator { } } - void detachChildren() { + void detachChildren(SurfaceControl.Transaction t) { // Do not detach children of starting windows, as their lifecycle is well under control and // it may lead to issues in case we relaunch when we just added the starting window. @@ -1203,14 +1124,10 @@ class WindowStateAnimator { return; } if (mSurfaceController != null) { - mSurfaceController.detachChildren(); + mSurfaceController.detachChildren(t); } } - void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) { - mOffsetPositionForStackResize = offsetPositionForStackResize; - } - SurfaceControl getSurfaceControl() { if (!hasSurface()) { return null; diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index c4fbf4ffc48ee..788f004076713 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -20,6 +20,7 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.SurfaceControl.METADATA_OWNER_PID; import static android.view.SurfaceControl.METADATA_OWNER_UID; import static android.view.SurfaceControl.METADATA_WINDOW_TYPE; +import static android.view.SurfaceControl.getGlobalTransaction; import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_SURFACE_ALLOC; import static com.android.internal.protolog.ProtoLogGroup.WM_SHOW_TRANSACTIONS; @@ -76,8 +77,6 @@ class WindowSurfaceController { private final int mWindowType; private final Session mWindowSession; - private final SurfaceControl.Transaction mTmpTransaction; - // Used to track whether we have called detach children on the way to invisibility. boolean mChildrenDetached; @@ -94,7 +93,6 @@ class WindowSurfaceController { final WindowState win = animator.mWin; mWindowType = windowType; mWindowSession = win.mSession; - mTmpTransaction = mService.mTransactionFactory.get(); Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl"); final SurfaceControl.Builder b = win.makeSurface() @@ -120,11 +118,11 @@ class WindowSurfaceController { Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } - void detachChildren() { + void detachChildren(SurfaceControl.Transaction t) { ProtoLog.i(WM_SHOW_TRANSACTIONS, "SEVER CHILDREN"); mChildrenDetached = true; if (mSurfaceControl != null) { - mSurfaceControl.detachChildren(); + t.detachChildren(mSurfaceControl); } } @@ -164,30 +162,22 @@ class WindowSurfaceController { } } - void setPosition(SurfaceControl.Transaction t, float left, float top, - boolean recoveringMemory) { + void setPosition(SurfaceControl.Transaction t, float left, float top) { final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top; - if (surfaceMoved) { - mSurfaceX = left; - mSurfaceY = top; - - try { - ProtoLog.i(WM_SHOW_TRANSACTIONS, - "SURFACE POS (setPositionInTransaction) @ (%f,%f): %s", left, top, title); - - t.setPosition(mSurfaceControl, left, top); - } catch (RuntimeException e) { - Slog.w(TAG, "Error positioning surface of " + this - + " pos=(" + left + "," + top + ")", e); - if (!recoveringMemory) { - mAnimator.reclaimSomeSurfaceMemory("position", true); - } - } + if (!surfaceMoved) { + return; } + + mSurfaceX = left; + mSurfaceY = top; + + ProtoLog.i(WM_SHOW_TRANSACTIONS, + "SURFACE POS (setPositionInTransaction) @ (%f,%f): %s", left, top, title); + + t.setPosition(mSurfaceControl, left, top); } - void setMatrix(SurfaceControl.Transaction t, float dsdx, float dtdx, - float dtdy, float dsdy, boolean recoveringMemory) { + void setMatrix(SurfaceControl.Transaction t, float dsdx, float dtdx, float dtdy, float dsdy) { final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx || mLastDtdy != dtdy || mLastDsdy != dsdy; if (!matrixChanged) { @@ -199,42 +189,24 @@ class WindowSurfaceController { mLastDtdy = dtdy; mLastDsdy = dsdy; - try { - ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE MATRIX [%f,%f,%f,%f]: %s", - dsdx, dtdx, dtdy, dsdy, title); - t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy); - } catch (RuntimeException e) { - // If something goes wrong with the surface (such - // as running out of memory), don't take down the - // entire system. - Slog.e(TAG, "Error setting matrix on surface surface" + title - + " MATRIX [" + dsdx + "," + dtdx + "," + dtdy + "," + dsdy + "]", null); - if (!recoveringMemory) { - mAnimator.reclaimSomeSurfaceMemory("matrix", true); - } - } + ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE MATRIX [%f,%f,%f,%f]: %s", + dsdx, dtdx, dtdy, dsdy, title); + t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy); } - boolean prepareToShowInTransaction(SurfaceControl.Transaction t, float alpha, - float dsdx, float dtdx, float dsdy, - float dtdy, boolean recoveringMemory) { - if (mSurfaceControl != null) { - try { - mSurfaceAlpha = alpha; - t.setAlpha(mSurfaceControl, alpha); - mLastDsdx = dsdx; - mLastDtdx = dtdx; - mLastDsdy = dsdy; - mLastDtdy = dtdy; - t.setMatrix(mSurfaceControl, dsdx, dtdx, dsdy, dtdy); - } catch (RuntimeException e) { - Slog.w(TAG, "Error updating surface in " + title, e); - if (!recoveringMemory) { - mAnimator.reclaimSomeSurfaceMemory("update", true); - } - return false; - } + boolean prepareToShowInTransaction(SurfaceControl.Transaction t, float alpha, float dsdx, + float dtdx, float dsdy, float dtdy) { + if (mSurfaceControl == null) { + return false; } + + mSurfaceAlpha = alpha; + t.setAlpha(mSurfaceControl, alpha); + mLastDsdx = dsdx; + mLastDtdx = dtdx; + mLastDsdy = dsdy; + mLastDtdy = dtdy; + t.setMatrix(mSurfaceControl, dsdx, dtdx, dsdy, dtdy); return true; } @@ -246,7 +218,7 @@ class WindowSurfaceController { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion"); mService.openSurfaceTransaction(); try { - mSurfaceControl.setTransparentRegionHint(region); + getGlobalTransaction().setTransparentRegionHint(mSurfaceControl, region); } finally { mService.closeSurfaceTransaction("setTransparentRegion"); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, @@ -263,7 +235,7 @@ class WindowSurfaceController { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setOpaqueLocked"); mService.openSurfaceTransaction(); try { - mSurfaceControl.setOpaque(isOpaque); + getGlobalTransaction().setOpaque(mSurfaceControl, isOpaque); } finally { mService.closeSurfaceTransaction("setOpaqueLocked"); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setOpaqueLocked"); @@ -281,7 +253,7 @@ class WindowSurfaceController { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setBackgroundBlurRadius"); mService.openSurfaceTransaction(); try { - mSurfaceControl.setBackgroundBlurRadius(radius); + getGlobalTransaction().setBackgroundBlurRadius(mSurfaceControl, radius); } finally { mService.closeSurfaceTransaction("setBackgroundBlurRadius"); if (SHOW_LIGHT_TRANSACTIONS) { @@ -299,7 +271,7 @@ class WindowSurfaceController { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setSecureLocked"); mService.openSurfaceTransaction(); try { - mSurfaceControl.setSecure(isSecure); + getGlobalTransaction().setSecure(mSurfaceControl, isSecure); } finally { mService.closeSurfaceTransaction("setSecure"); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setSecureLocked"); @@ -317,7 +289,7 @@ class WindowSurfaceController { } mService.openSurfaceTransaction(); try { - mSurfaceControl.setColorSpaceAgnostic(agnostic); + getGlobalTransaction().setColorSpaceAgnostic(mSurfaceControl, agnostic); } finally { mService.closeSurfaceTransaction("setColorSpaceAgnostic"); if (SHOW_LIGHT_TRANSACTIONS) { @@ -335,16 +307,9 @@ class WindowSurfaceController { return true; } - try { - setShown(true); - t.show(mSurfaceControl); - return true; - } catch (RuntimeException e) { - Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + this, e); - } - - mAnimator.reclaimSomeSurfaceMemory("show", true); - return false; + setShown(true); + t.show(mSurfaceControl); + return true; } boolean clearWindowContentFrameStats() { @@ -385,14 +350,6 @@ class WindowSurfaceController { } } - int getWidth() { - return mSurfaceW; - } - - int getHeight() { - return mSurfaceH; - } - void dumpDebug(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); proto.write(SHOWN, mSurfaceShown);