From f09bdfc4f76b026bae3b41ee5dd49e399a5f6454 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 6 Oct 2020 13:40:38 -0700 Subject: [PATCH 1/3] WindowManager: Remove windowsAreScaleable This code was added for an earlier implementation of the PIP animation. In this earlier implementation PIP was animated by directly scaling the WSA level surface. This means that if we were in SCALING_MODE_FREEZE the requested v active geometry logic in SF could freeze our matrix/position/crop updates. Now that we manipulate the PIP surface via higher levels of the hierarchy this wont be a problem and we don't need to change the scaling mode. Bug: 161937501 Test: Existing tests pass Change-Id: Iaf10ee4fae9a56a79c1432d9ffd4c8227b832b01 --- .../java/android/app/WindowConfiguration.java | 9 --------- .../core/java/com/android/server/wm/Task.java | 19 ------------------- .../android/server/wm/WindowContainer.java | 7 ------- .../com/android/server/wm/WindowState.java | 11 +---------- .../server/wm/WindowStateAnimator.java | 4 ---- .../server/wm/WindowSurfaceController.java | 8 +++----- 6 files changed, 4 insertions(+), 54 deletions(-) diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 79f05a3caa93f..eedf958822944 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -851,15 +851,6 @@ public class WindowConfiguration implements Parcelable, Comparable { // Update task bounds if needed. adjustBoundsForDisplayChangeIfNeeded(getDisplayContent()); - if (getWindowConfiguration().windowsAreScaleable()) { - // We force windows out of SCALING_MODE_FREEZE so that we can continue to animate them - // while a resize is pending. - forceWindowsScaleable(true /* force */); - } else { - forceWindowsScaleable(false /* force */); - } - mRootWindowContainer.updateUIDsPresentOnDisplay(); // Resume next focusable stack after reparenting to another display if we aren't removing @@ -3780,17 +3772,6 @@ class Task extends WindowContainer { positionChildAt(position, child, false /* includeParents */); } - void forceWindowsScaleable(boolean force) { - mWmService.openSurfaceTransaction(); - try { - for (int i = mChildren.size() - 1; i >= 0; i--) { - mChildren.get(i).forceWindowsScaleableInTransaction(force); - } - } finally { - mWmService.closeSurfaceTransaction("forceWindowsScaleable"); - } - } - void setTaskDescription(TaskDescription taskDescription) { mTaskDescription = taskDescription; } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 95d86621c5416..0edaa1d821df4 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -861,13 +861,6 @@ class WindowContainer extends ConfigurationContainer< } } - void forceWindowsScaleableInTransaction(boolean force) { - for (int i = mChildren.size() - 1; i >= 0; --i) { - final WindowContainer wc = mChildren.get(i); - wc.forceWindowsScaleableInTransaction(force); - } - } - /** * @return {@code true} when an application can override an app transition animation on this * container. diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 0b53bf6ca8f60..3b79241a3c3e7 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2172,16 +2172,7 @@ class WindowState extends WindowContainer implements WindowManagerP } } - @Override - void forceWindowsScaleableInTransaction(boolean force) { - if (mWinAnimator != null && mWinAnimator.hasSurface()) { - mWinAnimator.mSurfaceController.forceScaleableInTransaction(force); - } - - super.forceWindowsScaleableInTransaction(force); - } - - @Override + @Override void removeImmediately() { super.removeImmediately(); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index f3429769893fb..6349e6d36ae1c 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -971,10 +971,6 @@ class WindowStateAnimator { * @return Returns true if the surface was successfully shown. */ private boolean showSurfaceRobustlyLocked() { - if (mWin.getWindowConfiguration().windowsAreScaleable()) { - mSurfaceController.forceScaleableInTransaction(true); - } - boolean shown = mSurfaceController.showRobustlyInTransaction(); if (!shown) return false; diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index cbe0a4232c973..d2c36e2bf347d 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -342,11 +342,9 @@ class WindowSurfaceController { return false; } - void forceScaleableInTransaction(boolean force) { - // -1 means we don't override the default or client specified - // scaling mode. - int scalingMode = force ? SCALING_MODE_SCALE_TO_WINDOW : -1; - mSurfaceControl.setOverrideScalingMode(scalingMode); + void deferTransactionUntil(SurfaceControl barrier, long frame) { + // TODO: Logging + mSurfaceControl.deferTransactionUntil(barrier, frame); } boolean clearWindowContentFrameStats() { From 7675809673697d6d8f3a293dfb44d205aff89739 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 6 Oct 2020 13:41:15 -0700 Subject: [PATCH 2/3] ScreenRotationAnimation: Use Surface#setScalingMode We are the last user of SurfaceControl#setOverrideScalingMode in ScreenRotationAnimation we have no need to call it since we are the BufferProducer and we can just use Surface#setScalingMode Bug: 161937501 Test: Existing tests pass Change-Id: I049145a91fedbbca5f009648f1537b0380c5e771 --- core/java/android/view/Surface.java | 2 +- .../com/android/server/wm/ScreenRotationAnimation.java | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 5b0d950e3bd8f..0847a179c5535 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -739,7 +739,7 @@ public class Surface implements Parcelable { * Set the scaling mode to be used for this surfaces buffers * @hide */ - void setScalingMode(@ScalingMode int scalingMode) { + public void setScalingMode(@ScalingMode int scalingMode) { synchronized (mLock) { checkNotReleasedLocked(); int err = nativeSetScalingMode(mNativeObject, scalingMode); diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 25732e7f0d995..7ed22a1f7777e 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -203,16 +203,14 @@ class ScreenRotationAnimation { .setCallsite("ScreenRotationAnimation") .build(); - // In case display bounds change, screenshot buffer and surface may mismatch so set a - // scaling mode. - SurfaceControl.Transaction t2 = mService.mTransactionFactory.get(); - t2.setOverrideScalingMode(mScreenshotLayer, Surface.SCALING_MODE_SCALE_TO_WINDOW); - t2.apply(true /* sync */); - // Capture a screenshot into the surface we just created. final int displayId = displayContent.getDisplayId(); final Surface surface = mService.mSurfaceFactory.get(); + // In case display bounds change, screenshot buffer and surface may mismatch so set a + // scaling mode. surface.copyFrom(mScreenshotLayer); + surface.setScalingMode(Surface.SCALING_MODE_SCALE_TO_WINDOW); + SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer = mService.mDisplayManagerInternal.systemScreenshot(displayId); if (screenshotBuffer != null) { From b3bb920676d448e70f071d3a683b8cc0db7ebb47 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 6 Oct 2020 14:38:04 -0700 Subject: [PATCH 3/3] SurfaceControl: Remove setOverrideScalingMode There are no callers. Bug: 161937501 Test: Existing tests pass Change-Id: Ib668e9092c60e3b5615cef2369b97ec1e4e6b87b --- core/java/android/view/SurfaceControl.java | 22 ------------------- core/jni/android_view_SurfaceControl.cpp | 11 ---------- .../android/server/wm/StubTransaction.java | 6 ----- 3 files changed, 39 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index ed9deecd7e88f..566ebf3f1b3ba 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -187,8 +187,6 @@ public final class SurfaceControl implements Parcelable { private static native void nativeReparent(long transactionObj, long nativeObject, long newParentNativeObject); private static native void nativeSeverChildren(long transactionObj, long nativeObject); - private static native void nativeSetOverrideScalingMode(long transactionObj, long nativeObject, - int scalingMode); private static native Display.HdrCapabilities nativeGetHdrCapabilities(IBinder displayToken); @@ -1518,16 +1516,6 @@ public final class SurfaceControl implements Parcelable { } } - /** - * @hide - */ - public void setOverrideScalingMode(int scalingMode) { - checkNotReleased(); - synchronized(SurfaceControl.class) { - sGlobalTransaction.setOverrideScalingMode(this, scalingMode); - } - } - /** * @hide */ @@ -2988,16 +2976,6 @@ public final class SurfaceControl implements Parcelable { return this; } - /** - * @hide - */ - public Transaction setOverrideScalingMode(SurfaceControl sc, int overrideScalingMode) { - checkPreconditions(sc); - nativeSetOverrideScalingMode(mNativeObject, sc.mNativeObject, - overrideScalingMode); - return this; - } - /** * Fills the surface with the specified color. * @param color A float array with three values to represent r, g, b in range [0..1]. An diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 14198559ef9c7..a61903dcb7c83 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1360,15 +1360,6 @@ static void nativeSeverChildren(JNIEnv* env, jclass clazz, jlong transactionObj, transaction->detachChildren(ctrl); } -static void nativeSetOverrideScalingMode(JNIEnv* env, jclass clazz, jlong transactionObj, - jlong nativeObject, - jint scalingMode) { - auto transaction = reinterpret_cast(transactionObj); - - auto ctrl = reinterpret_cast(nativeObject); - transaction->setOverrideScalingMode(ctrl, scalingMode); -} - static jobject nativeGetHdrCapabilities(JNIEnv* env, jclass clazz, jobject tokenObject) { sp token(ibinderForJavaObject(env, tokenObject)); if (token == NULL) return NULL; @@ -1694,8 +1685,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeReparent }, {"nativeSeverChildren", "(JJ)V", (void*)nativeSeverChildren } , - {"nativeSetOverrideScalingMode", "(JJI)V", - (void*)nativeSetOverrideScalingMode }, {"nativeCaptureDisplay", "(Landroid/view/SurfaceControl$DisplayCaptureArgs;Landroid/view/SurfaceControl$ScreenCaptureListener;)I", (void*)nativeCaptureDisplay }, diff --git a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java index d0a5644f50252..ecbfac8b091b8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java +++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java @@ -162,12 +162,6 @@ public class StubTransaction extends SurfaceControl.Transaction { return this; } - @Override - public SurfaceControl.Transaction setOverrideScalingMode(SurfaceControl sc, - int overrideScalingMode) { - return this; - } - @Override public SurfaceControl.Transaction setColor(SurfaceControl sc, float[] color) { return this;