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

Commit 5d9d2ddc authored by Robert Carr's avatar Robert Carr
Browse files

WindowlessWindowManager: Set size when creating surface

When we set the buffer size from relayout window, there is a race
condition where the client may then submit its first buffer but the
transaction hasnt applied yet on the SF side and so the buffer is
rejected. Setting a defualt size when creating fixes this. Luckily
SurfaceControlViewHost size is known at add time, since we force the
window size based on the values passed in to the SurfaceControlViewHost API.

Bug: 157153874
Test: Existing tests pass
Change-Id: I2566844aea81df92f1694f43254a480fc3b3c019
parent 7a639dce
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ public class WindowlessWindowManager implements IWindowSession {
        final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession)
                .setParent(mRootSurface)
                .setFormat(attrs.format)
                .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs))
                .setName(attrs.getTitle().toString());
        final SurfaceControl sc = b.build();

@@ -242,13 +243,8 @@ public class WindowlessWindowManager implements IWindowSession {
        WindowManager.LayoutParams attrs = state.mParams;

        if (viewFlags == View.VISIBLE) {
            final Rect surfaceInsets = attrs.surfaceInsets;
            int width = surfaceInsets != null
                    ? attrs.width + surfaceInsets.left + surfaceInsets.right : attrs.width;
            int height = surfaceInsets != null
                    ? attrs.height + surfaceInsets.top + surfaceInsets.bottom : attrs.height;

            t.setBufferSize(sc, width, height).setOpaque(sc, isOpaque(attrs)).show(sc).apply();
            t.setBufferSize(sc, getSurfaceWidth(attrs), getSurfaceHeight(attrs))
                    .setOpaque(sc, isOpaque(attrs)).show(sc).apply();
            outSurfaceControl.copyFrom(sc);
        } else {
            t.hide(sc).apply();
@@ -444,4 +440,15 @@ public class WindowlessWindowManager implements IWindowSession {
    public android.os.IBinder asBinder() {
        return null;
    }

    private int getSurfaceWidth(WindowManager.LayoutParams attrs) {
      final Rect surfaceInsets = attrs.surfaceInsets;
      return surfaceInsets != null
          ? attrs.width + surfaceInsets.left + surfaceInsets.right : attrs.width;
    }
    private int getSurfaceHeight(WindowManager.LayoutParams attrs) {
      final Rect surfaceInsets = attrs.surfaceInsets;
      return surfaceInsets != null
          ? attrs.height + surfaceInsets.top + surfaceInsets.bottom : attrs.height;
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -156,4 +156,3 @@ public class ShellRoot {
        }
    }
}