From 906fe67bb4143ca272ef31198c1c93103bedff21 Mon Sep 17 00:00:00 2001 From: Leon Scroggins Date: Tue, 28 Dec 2021 14:43:12 +0000 Subject: [PATCH] Reland "Add/plumb SurfaceControl.DISPLAY_DECORATION" The first time this topic landed, it resulted in b/212402133. We avoid running into this bug with Ib11d46439db57b90486bad07dd90f2cf0822182a. Original commit message: When passed to native, this flag will tell a Layer that it should use Composition.DISPLAY_DECORATION. Bug: 193170859 Test: manual Change-Id: I7f1685eb7dc57271f532065dcd1d4dcc449c5cb0 --- core/java/android/view/SurfaceControl.java | 24 ++++++++++++++++++++++ core/java/android/view/ViewRootImpl.java | 23 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 3b5270960c99..ab33feae7c56 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -514,6 +514,15 @@ public final class SurfaceControl implements Parcelable { */ public static final int ENABLE_BACKPRESSURE = 0x00000100; + /** + * Buffers from this SurfaceControl should be considered display decorations. + * + * If the hardware has optimizations for display decorations (e.g. rounded corners, camera + * cutouts, etc), it should use them for this layer. + * @hide + */ + public static final int DISPLAY_DECORATION = 0x00000200; + /** * Surface creation flag: Creates a surface where color components are interpreted * as "non pre-multiplied" by their alpha channel. Of course this flag is @@ -3265,6 +3274,21 @@ public final class SurfaceControl implements Parcelable { return this; } + /** + * Sets whether the surface should take advantage of display decoration optimizations. + * @hide + */ + public Transaction setDisplayDecoration(SurfaceControl sc, boolean displayDecoration) { + checkPreconditions(sc); + if (displayDecoration) { + nativeSetFlags(mNativeObject, sc.mNativeObject, DISPLAY_DECORATION, + DISPLAY_DECORATION); + } else { + nativeSetFlags(mNativeObject, sc.mNativeObject, 0, DISPLAY_DECORATION); + } + return this; + } + /** * Indicates whether the surface must be considered opaque, even if its pixel format is * set to translucent. This can be useful if an application needs full RGBA 8888 support diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index af496dcea8e3..0dd90298ac9d 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -491,6 +491,9 @@ public final class ViewRootImpl implements ViewParent, protected final ViewFrameInfo mViewFrameInfo = new ViewFrameInfo(); private final InputEventAssigner mInputEventAssigner = new InputEventAssigner(); + // Whether to draw this surface as DISPLAY_DECORATION. + boolean mDisplayDecorationCached = false; + /** * Update the Choreographer's FrameInfo object with the timing information for the current * ViewRootImpl instance. Erase the data in the current ViewFrameInfo to prepare for the next @@ -2842,6 +2845,9 @@ public final class ViewRootImpl implements ViewParent, if (mSurfaceControl.isValid()) { updateOpacity(mWindowAttributes, dragResizing, surfaceControlChanged /*forceUpdate */); + if (surfaceControlChanged) { + updateDisplayDecoration(); + } } if (DEBUG_LAYOUT) Log.v(mTag, "relayout: frame=" + frame.toShortString() @@ -10398,6 +10404,23 @@ public final class ViewRootImpl implements ViewParent, } } + /** + * @hide + */ + public void setDisplayDecoration(boolean displayDecoration) { + if (displayDecoration == mDisplayDecorationCached) return; + + mDisplayDecorationCached = displayDecoration; + + if (mSurfaceControl.isValid()) { + updateDisplayDecoration(); + } + } + + private void updateDisplayDecoration() { + mTransaction.setDisplayDecoration(mSurfaceControl, mDisplayDecorationCached).apply(); + } + /** * Sends a list of blur regions to SurfaceFlinger, tagged with a frame. *