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
This commit is contained in:
Leon Scroggins
2021-12-28 14:43:12 +00:00
committed by Leon Scroggins III
parent b3ae0fbffc
commit 906fe67bb4
2 changed files with 47 additions and 0 deletions

View File

@@ -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

View File

@@ -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.
*