diff options
4 files changed, 44 insertions, 4 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 2e98d033fa7f..1dbe166899dc 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -268,6 +268,13 @@ public class SurfaceControl implements Parcelable { public static final int FX_SURFACE_DIM = 0x00020000; /** + * Surface creation flag: Creates a container surface. + * This surface will have no buffers and will only be used + * as a container for other surfaces, or for its InputInfo. + */ + public static final int FX_SURFACE_CONTAINER = 0x00080000; + + /** * Mask used for FX values above. * */ @@ -523,14 +530,39 @@ public class SurfaceControl implements Parcelable { */ public Builder setColorLayer(boolean isColorLayer) { if (isColorLayer) { - mFlags |= FX_SURFACE_DIM; + setFlags(FX_SURFACE_DIM, FX_SURFACE_MASK); + } else { + setBufferLayer(); + } + return this; + } + + /** + * Indicates whether a 'ContainerLayer' is to be constructed. + * + * Container layers will not be rendered in any fashion and instead are used + * as a parent of renderable layers. + * + * @param isContainerLayer Whether to create a container layer. + */ + public Builder setContainerLayer(boolean isContainerLayer) { + if (isContainerLayer) { + setFlags(FX_SURFACE_CONTAINER, FX_SURFACE_MASK); } else { - mFlags &= ~FX_SURFACE_DIM; + 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}. * * TODO: Finish conversion to individual builder methods? @@ -540,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; + } } /** diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java index ad92f81f4dde..bef974ae1081 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 2941e93d12dc..6700a123e043 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<DisplayContent.DisplayChildWindowCo final SurfaceControl.Builder b = mService.makeSurfaceBuilder(mSession) .setSize(mSurfaceSize, mSurfaceSize) - .setOpaque(true); + .setOpaque(true) + .setContainerLayer(true); mWindowingLayer = b.setName("Display Root").build(); mOverlayLayer = b.setName("Display Overlays").build(); @@ -3890,7 +3891,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo SurfaceSession s = child != null ? child.getSession() : getSession(); final SurfaceControl.Builder b = mService.makeSurfaceBuilder(s); b.setSize(mSurfaceSize, mSurfaceSize); - + b.setContainerLayer(true); if (child == null) { return b; } diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index 66c8cca8f0e0..4548cec88e7e 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -104,6 +104,7 @@ class WindowSurfaceController { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl"); final SurfaceControl.Builder b = win.makeSurface() + .setBufferLayer() .setParent(win.getSurfaceControl()) .setName(name) .setSize(w, h) |