From cb122ec8a59f5ccd1fba5b0d24584ffed58c2539 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 7 Dec 2018 09:45:41 -0800 Subject: [PATCH 1/2] DO NOT MERGE: WM: Restrict SC Builder to set a single surface type When building a surface control, only allow a single surface type to be set, clearing any previously set types so the surface creating flags remain valid. Test: reboot device, rotate the screen, enter and exit multi window, check the UI is normal Dump SF layer and check the container layer is set successfully Bug: 111164627 Change-Id: Ifc022881ee7fec0561a39ce647868d5b43cb49d9 --- core/java/android/view/SurfaceControl.java | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 66f16d57c8289..1dbe166899dc8 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -530,9 +530,9 @@ public class SurfaceControl implements Parcelable { */ public Builder setColorLayer(boolean isColorLayer) { if (isColorLayer) { - mFlags |= FX_SURFACE_DIM; + setFlags(FX_SURFACE_DIM, FX_SURFACE_MASK); } else { - mFlags &= ~FX_SURFACE_DIM; + setBufferLayer(); } return this; } @@ -547,13 +547,21 @@ public class SurfaceControl implements Parcelable { */ public Builder setContainerLayer(boolean isContainerLayer) { if (isContainerLayer) { - mFlags |= FX_SURFACE_CONTAINER; + setFlags(FX_SURFACE_CONTAINER, FX_SURFACE_MASK); } else { - mFlags &= ~FX_SURFACE_CONTAINER; + setBufferLayer(); } return this; } + /** + * Indicates whether a buffer layer is to be constructed. + * + */ + public Builder setBufferLayer() { + return setFlags(FX_SURFACE_NORMAL, FX_SURFACE_MASK); + } + /** * Set 'Surface creation flags' such as {@link HIDDEN}, {@link SECURE}. * @@ -564,6 +572,11 @@ public class SurfaceControl implements Parcelable { mFlags = flags; return this; } + + private Builder setFlags(int flags, int mask) { + mFlags = (mFlags & ~mask) | flags; + return this; + } } /** From ff674ee46819c094a68e533689315f8c07ceac6a Mon Sep 17 00:00:00 2001 From: "yu.chen" Date: Tue, 6 Nov 2018 21:03:00 +0800 Subject: [PATCH 2/2] DO NOT MERGE Set ContainerLayer for buffer-less surface The container layers havn't buffers,but the buffer size may beyond the GPU limit, need set those surface as container layer Test: Reboot device, rotate the screen, enter and exit multi window, check the UI is normal Dump SF layer and check the container layer is set successfully Bug: 111164627 Change-Id: I6dd3bcb85ffe890c98ce82f2ef20a1576e8cd440 --- .../core/java/com/android/server/wm/AppWindowThumbnail.java | 1 + services/core/java/com/android/server/wm/DisplayContent.java | 5 +++-- .../java/com/android/server/wm/WindowSurfaceController.java | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java index ad92f81f4dde4..bef974ae10817 100644 --- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java +++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java @@ -69,6 +69,7 @@ class AppWindowThumbnail implements Animatable { .setFormat(PixelFormat.TRANSLUCENT) .setMetadata(appToken.windowType, window != null ? window.mOwnerUid : Binder.getCallingUid()) + .setBufferLayer() .build(); if (SHOW_TRANSACTIONS) { diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2887e5ef90617..4fdf68e8d7086 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -773,7 +773,8 @@ class DisplayContent extends WindowContainer