Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e20bcd6 authored by Robert Carr's avatar Robert Carr
Browse files

WM: Defer transactions for BLAST Surfaces too.

For switching on BLAST we are implementing deferred transactions for
compatibility. Presently the BLAST Surface is constructed by the ViewRootImpl
and so the WM has no reference to pass when using it as a barrier layer for
deferTransactionUntil. To resolve this we construct and hold a reference to
the BLAST Surface on the server side, and pass it down to the client in relayoutWindow.
We don't use the WindowStateAnimator surface directly as both the BLAST Adapter and
the WindowStateAnimator would then be setting crops on it.

Bug: 146598493
Test: Builds, existing tests pass.
Change-Id: I6513e0442f5c75f01eb8dde5f1924dd7b636163c
parent 6871767a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -150,7 +150,7 @@ public class RelayoutPerfTest extends WindowManagerPerfTestBase {
                        mViewVisibility.getAsInt(), mFlags, mFrameNumber, mOutFrame,
                        mViewVisibility.getAsInt(), mFlags, mFrameNumber, mOutFrame,
                        mOutContentInsets, mOutVisibleInsets, mOutStableInsets,
                        mOutContentInsets, mOutVisibleInsets, mOutStableInsets,
                        mOutBackDropFrame, mOutDisplayCutout, mOutMergedConfiguration,
                        mOutBackDropFrame, mOutDisplayCutout, mOutMergedConfiguration,
                        mOutSurfaceControl, mOutInsetsState, new Point());
                        mOutSurfaceControl, mOutInsetsState, new Point(), new SurfaceControl());
            }
            }
        }
        }
    }
    }
+4 −1
Original line number Original line Diff line number Diff line
@@ -223,6 +223,9 @@ public abstract class WallpaperService extends Service {


        SurfaceControl mSurfaceControl = new SurfaceControl();
        SurfaceControl mSurfaceControl = new SurfaceControl();


        // Unused relayout out-param
        SurfaceControl mTmpSurfaceControl = new SurfaceControl();

        final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
        final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
            {
            {
                mRequestedFormat = PixelFormat.RGBX_8888;
                mRequestedFormat = PixelFormat.RGBX_8888;
@@ -902,7 +905,7 @@ public abstract class WallpaperService extends Service {
                            View.VISIBLE, 0, -1, mWinFrame, mContentInsets,
                            View.VISIBLE, 0, -1, mWinFrame, mContentInsets,
                            mVisibleInsets, mStableInsets, mBackdropFrame,
                            mVisibleInsets, mStableInsets, mBackdropFrame,
                            mDisplayCutout, mMergedConfiguration, mSurfaceControl,
                            mDisplayCutout, mMergedConfiguration, mSurfaceControl,
                            mInsetsState, mSurfaceSize);
                            mInsetsState, mSurfaceSize, mTmpSurfaceControl);
                    if (mSurfaceControl.isValid()) {
                    if (mSurfaceControl.isValid()) {
                        mSurfaceHolder.mSurface.copyFrom(mSurfaceControl);
                        mSurfaceHolder.mSurface.copyFrom(mSurfaceControl);
                        mSurfaceControl.release();
                        mSurfaceControl.release();
+5 −1
Original line number Original line Diff line number Diff line
@@ -92,6 +92,9 @@ interface IWindowSession {
     * @param outSurface Object in which is placed the new display surface.
     * @param outSurface Object in which is placed the new display surface.
     * @param insetsState The current insets state in the system.
     * @param insetsState The current insets state in the system.
     * @param outSurfaceSize The width and height of the surface control
     * @param outSurfaceSize The width and height of the surface control
     * @param outBlastSurfaceControl A BLAST SurfaceControl allocated by the WindowManager
     * the SurfaceControl willl be managed by the client side, but the WindowManager
     * may use it as a deferTransaction barrier.
     *
     *
     * @return int Result flags: {@link WindowManagerGlobal#RELAYOUT_SHOW_FOCUS},
     * @return int Result flags: {@link WindowManagerGlobal#RELAYOUT_SHOW_FOCUS},
     * {@link WindowManagerGlobal#RELAYOUT_FIRST_TIME}.
     * {@link WindowManagerGlobal#RELAYOUT_FIRST_TIME}.
@@ -103,7 +106,8 @@ interface IWindowSession {
            out Rect outBackdropFrame,
            out Rect outBackdropFrame,
            out DisplayCutout.ParcelableWrapper displayCutout,
            out DisplayCutout.ParcelableWrapper displayCutout,
            out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl,
            out MergedConfiguration outMergedConfiguration, out SurfaceControl outSurfaceControl,
            out InsetsState insetsState, out Point outSurfaceSize);
            out InsetsState insetsState, out Point outSurfaceSize,
            out SurfaceControl outBlastSurfaceControl);


    /*
    /*
     * Notify the window manager that an application is relaunching and
     * Notify the window manager that an application is relaunching and
+6 −11
Original line number Original line Diff line number Diff line
@@ -507,7 +507,7 @@ public final class ViewRootImpl implements ViewParent,
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public final Surface mSurface = new Surface();
    public final Surface mSurface = new Surface();
    private final SurfaceControl mSurfaceControl = new SurfaceControl();
    private final SurfaceControl mSurfaceControl = new SurfaceControl();
    private SurfaceControl mBlastSurfaceControl;
    private SurfaceControl mBlastSurfaceControl = new SurfaceControl();


    private BLASTBufferQueue mBlastBufferQueue;
    private BLASTBufferQueue mBlastBufferQueue;


@@ -1698,15 +1698,9 @@ public final class ViewRootImpl implements ViewParent,
        if (mSurfaceControl == null || !mSurfaceControl.isValid()) {
        if (mSurfaceControl == null || !mSurfaceControl.isValid()) {
            return null;
            return null;
        }
        }
        if (mBlastSurfaceControl == null) {
        if ((mBlastBufferQueue != null) && mBlastSurfaceControl.isValid()) {
            mBlastSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
            .setParent(mSurfaceControl)
            .setName("BLAST")
            .setBLASTLayer()
            .build();
            mBlastBufferQueue = new BLASTBufferQueue(
            mBlastBufferQueue = new BLASTBufferQueue(
                mBlastSurfaceControl, width, height);
                mBlastSurfaceControl, width, height);

        }
        }
        mBlastBufferQueue.update(mBlastSurfaceControl, width, height);
        mBlastBufferQueue.update(mBlastSurfaceControl, width, height);


@@ -7344,7 +7338,8 @@ public final class ViewRootImpl implements ViewParent,
                insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
                insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
                mTmpFrame, mPendingContentInsets, mPendingVisibleInsets,
                mTmpFrame, mPendingContentInsets, mPendingVisibleInsets,
                mPendingStableInsets, mPendingBackDropFrame, mPendingDisplayCutout,
                mPendingStableInsets, mPendingBackDropFrame, mPendingDisplayCutout,
                mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mSurfaceSize);
                mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mSurfaceSize,
                mBlastSurfaceControl);
        if (mSurfaceControl.isValid()) {
        if (mSurfaceControl.isValid()) {
            if (!WindowManagerGlobal.USE_BLAST_ADAPTER) {
            if (!WindowManagerGlobal.USE_BLAST_ADAPTER) {
                mSurface.copyFrom(mSurfaceControl);
                mSurface.copyFrom(mSurfaceControl);
+1 −1
Original line number Original line Diff line number Diff line
@@ -161,7 +161,7 @@ public class WindowlessWindowManager implements IWindowSession {
            Rect outStableInsets, Rect outBackdropFrame,
            Rect outStableInsets, Rect outBackdropFrame,
            DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
            DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
            SurfaceControl outSurfaceControl, InsetsState outInsetsState,
            SurfaceControl outSurfaceControl, InsetsState outInsetsState,
            Point outSurfaceSize) {
            Point outSurfaceSize, SurfaceControl outBLASTSurfaceControl) {
        State state = null;
        State state = null;
        synchronized (this) {
        synchronized (this) {
            state = mStateForWindow.get(window.asBinder());
            state = mStateForWindow.get(window.asBinder());
Loading