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

Commit 65507cbb authored by Patrick Williams's avatar Patrick Williams
Browse files

Update ViewRootImpl#getBufferTransformHint to use display rotation

Updates ViewRootImpl#getBufferTransform hint to determine the transform hint based off display rotation instead of the transform hint set on the underlying SurfaceControl. This fixes an issue where getBufferTransformHint returns an incorrect transform hint because SurfaceFlinger's display information hasn't been updated with display rotation information yet.

Bug: 301238858
Test: VulkanPreTransformTest
Change-Id: Ib835a8cf793ad048297789222802d2d1677db3ce
parent f1790276
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodCl
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER;
import static com.android.input.flags.Flags.enablePointerChoreographer;
import static com.android.window.flags.Flags.enableBufferTransformHintFromDisplay;
import android.Manifest;
import android.accessibilityservice.AccessibilityService;
@@ -992,8 +993,6 @@ public final class ViewRootImpl implements ViewParent,
     */
    private final boolean mViewBoundsSandboxingEnabled;
    private int mLastTransformHint = Integer.MIN_VALUE;
    private AccessibilityWindowAttributes mAccessibilityWindowAttributes;
    /*
@@ -8868,11 +8867,13 @@ public final class ViewRootImpl implements ViewParent,
        final int transformHint = SurfaceControl.rotationToBufferTransform(
                (mDisplay.getInstallOrientation() + mDisplay.getRotation()) % 4);
        final boolean transformHintChanged = transformHint != mPreviousTransformHint;
        mPreviousTransformHint = transformHint;
        mSurfaceControl.setTransformHint(transformHint);
        WindowLayout.computeSurfaceSize(mWindowAttributes, winConfig.getMaxBounds(), requestedWidth,
                requestedHeight, mWinFrameInScreen, mPendingDragResizing, mSurfaceSize);
        final boolean transformHintChanged = transformHint != mLastTransformHint;
        final boolean sizeChanged = !mLastSurfaceSize.equals(mSurfaceSize);
        final boolean surfaceControlChanged =
                (relayoutResult & RELAYOUT_RES_SURFACE_CHANGED) == RELAYOUT_RES_SURFACE_CHANGED;
@@ -8901,10 +8902,6 @@ public final class ViewRootImpl implements ViewParent,
            }
        }
        mLastTransformHint = transformHint;
        mSurfaceControl.setTransformHint(transformHint);
        if (mAttachInfo.mContentCaptureManager != null) {
            ContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager
                    .getMainContentCaptureSession();
@@ -8918,8 +8915,7 @@ public final class ViewRootImpl implements ViewParent,
                mAttachInfo.mThreadedRenderer.setSurfaceControl(mSurfaceControl, mBlastBufferQueue);
            }
            mHdrRenderState.forceUpdateHdrSdrRatio();
            if (mPreviousTransformHint != transformHint) {
                mPreviousTransformHint = transformHint;
            if (transformHintChanged) {
                dispatchTransformHintChanged(transformHint);
            }
        } else {
@@ -11883,6 +11879,14 @@ public final class ViewRootImpl implements ViewParent,
    @Override
    public @SurfaceControl.BufferTransform int getBufferTransformHint() {
        // TODO(b/326482114) We use mPreviousTransformHint (calculated using mDisplay's rotation)
        // instead of mSurfaceControl#getTransformHint because there's a race where SurfaceFlinger
        // can set an incorrect transform hint for a few frames before it is aware of the updated
        // display rotation.
        if (enableBufferTransformHintFromDisplay()) {
            return mPreviousTransformHint;
        }
        if (mSurfaceControl.isValid()) {
            return mSurfaceControl.getTransformHint();
        } else {
+11 −0
Original line number Diff line number Diff line
@@ -81,3 +81,14 @@ flag {
    is_fixed_read_only: true
    bug: "321263247"
}

flag {
    namespace: "window_surfaces"
    name: "enable_buffer_transform_hint_from_display"
    description: "Always use display info to determine VRI's buffer transform hint"
    is_fixed_read_only: true
    bug: "301238858"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}