From 4fa6a5f413bbfa5d948d69d70c11f4a376d9ce63 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 8 Feb 2021 13:18:30 -0800 Subject: [PATCH] WindowManagerService: Handle transparent region on client Since the client owns its own SurfaceControl now, there is no need to call through to the WM just to set transparent regions. Bug: 161937501 Test: Existing tests pass Change-Id: I1767090bc60be72b86879ae806876d49bfa0e06c --- core/java/android/view/IWindowSession.aidl | 8 -------- core/java/android/view/ViewRootImpl.java | 13 ++++++++----- .../android/view/WindowlessWindowManager.java | 6 +----- .../java/com/android/server/wm/Session.java | 5 ----- .../android/server/wm/WindowManagerService.java | 17 ----------------- .../android/server/wm/WindowStateAnimator.java | 8 -------- .../server/wm/WindowSurfaceController.java | 16 ---------------- 7 files changed, 9 insertions(+), 64 deletions(-) diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 990b7bdfa9873..dad932c2ee199 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -122,14 +122,6 @@ interface IWindowSession { */ boolean outOfMemory(IWindow window); - /** - * Give the window manager a hint of the part of the window that is - * completely transparent, allowing it to work with the surface flinger - * to optimize compositing of this part of the window. - */ - @UnsupportedAppUsage - oneway void setTransparentRegion(IWindow window, in Region region); - /** * Tell the window manager about the content and visible insets of the * given window, which can be used to adjust the outContentInsets diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 036a703f178c8..8fd897c1c7ee7 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3063,11 +3063,14 @@ public final class ViewRootImpl implements ViewParent, if (!mTransparentRegion.equals(mPreviousTransparentRegion)) { mPreviousTransparentRegion.set(mTransparentRegion); mFullRedrawNeeded = true; - // reconfigure window manager - try { - mWindowSession.setTransparentRegion(mWindow, mTransparentRegion); - } catch (RemoteException e) { - } + // TODO: Ideally we would do this in prepareSurfaces, + // but prepareSurfaces is currently working under + // the assumption that we paused the render thread + // via the WM relayout code path. We probably eventually + // want to synchronize transparent region hint changes + // with draws. + mTransaction.setTransparentRegionHint(getSurfaceControl(), + mTransparentRegion).apply(); } } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index bededa09cfcec..59ea23daf3f93 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -71,7 +71,7 @@ public class WindowlessWindowManager implements IWindowSession { new HashMap(); private final SurfaceSession mSurfaceSession = new SurfaceSession(); - private final SurfaceControl mRootSurface; + protected final SurfaceControl mRootSurface; private final Configuration mConfiguration; private final IWindowSession mRealWm; private final IBinder mHostInputToken; @@ -301,10 +301,6 @@ public class WindowlessWindowManager implements IWindowSession { return false; } - @Override - public void setTransparentRegion(android.view.IWindow window, android.graphics.Region region) { - } - @Override public void setInsets(android.view.IWindow window, int touchableInsets, android.graphics.Rect contentInsets, android.graphics.Rect visibleInsets, diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 1f8daf6f361fd..5f50321ca0285 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -252,11 +252,6 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { return mService.outOfMemoryWindow(this, window); } - @Override - public void setTransparentRegion(IWindow window, Region region) { - mService.setTransparentRegionWindow(this, window, region); - } - @Override public void setInsets(IWindow window, int touchableInsets, Rect contentInsets, Rect visibleInsets, Region touchableArea) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a41761f529be3..91d1cfca0d414 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2148,23 +2148,6 @@ public class WindowManagerService extends IWindowManager.Stub Slog.i(tag, s, e); } - void setTransparentRegionWindow(Session session, IWindow client, Region region) { - final long origId = Binder.clearCallingIdentity(); - try { - synchronized (mGlobalLock) { - WindowState w = windowForClientLocked(session, client, false); - ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE transparentRegionHint=%s: %s", - region, w); - - if ((w != null) && w.mHasSurface) { - w.mWinAnimator.setTransparentRegionHintLocked(region); - } - } - } finally { - Binder.restoreCallingIdentity(origId); - } - } - void setInsetsWindow(Session session, IWindow client, int touchableInsets, Rect contentInsets, Rect visibleInsets, Region touchableRegion) { int uid = Binder.getCallingUid(); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 2da3dda831e14..783f9d39e18df 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -679,14 +679,6 @@ class WindowStateAnimator { } } - void setTransparentRegionHintLocked(final Region region) { - if (mSurfaceController == null) { - Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); - return; - } - mSurfaceController.setTransparentRegionHint(region); - } - boolean setWallpaperOffset(int dx, int dy, float scale) { if (mXOffset == dx && mYOffset == dy && Float.compare(mWallpaperScale, scale) == 0) { 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 82ba3c188b76e..636f0bb6086fe 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -194,22 +194,6 @@ class WindowSurfaceController { return true; } - void setTransparentRegionHint(final Region region) { - if (mSurfaceControl == null) { - Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); - return; - } - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion"); - mService.openSurfaceTransaction(); - try { - getGlobalTransaction().setTransparentRegionHint(mSurfaceControl, region); - } finally { - mService.closeSurfaceTransaction("setTransparentRegion"); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, - "<<< CLOSE TRANSACTION setTransparentRegion"); - } - } - void setOpaque(boolean isOpaque) { ProtoLog.i(WM_SHOW_TRANSACTIONS, "SURFACE isOpaque=%b: %s", isOpaque, title);