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:
committed by
Leon Scroggins III
parent
b3ae0fbffc
commit
906fe67bb4
@@ -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
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user