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

Commit 41d73671 authored by Chavi Weingarten's avatar Chavi Weingarten Committed by Android (Google) Code Review
Browse files

Merge "Call applyTransactionOnDraw when removing SV" into sc-v2-dev

parents 533ce6f9 6b1b599f
Loading
Loading
Loading
Loading
+7 −22
Original line number Diff line number Diff line
@@ -162,8 +162,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
    boolean mIsCreating = false;
    private volatile boolean mRtHandlingPositionUpdates = false;
    private volatile boolean mRtReleaseSurfaces = false;

    private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener =
            this::updateSurface;
@@ -909,13 +907,14 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
                mBlastBufferQueue = null;
            }

            if (mRtHandlingPositionUpdates) {
                mRtReleaseSurfaces = true;
                return;
            ViewRootImpl viewRoot = getViewRootImpl();
            Transaction transaction = new Transaction();
            releaseSurfaces(transaction);
            if (viewRoot != null) {
                viewRoot.applyTransactionOnDraw(transaction);
            } else {
                transaction.apply();
            }

            releaseSurfaces(mTmpTransaction);
            mTmpTransaction.apply();
        }
    }

@@ -1468,15 +1467,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
                if (mSurfaceControl == null) {
                    return;
                }
                // TODO: This is teensy bit racey in that a brand new SurfaceView moving on
                // its 2nd frame if RenderThread is running slowly could potentially see
                // this as false, enter the branch, get pre-empted, then this comes along
                // and reports a new position, then the UI thread resumes and reports
                // its position. This could therefore be de-sync'd in that interval, but
                // the synchronization would violate the rule that RT must never block
                // on the UI thread which would open up potential deadlocks. The risk of
                // a single-frame desync is therefore preferable for now.
                mRtHandlingPositionUpdates = true;
            }
            if (mRTLastReportedPosition.left == left
                    && mRTLastReportedPosition.top == top
@@ -1552,12 +1542,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
                    return;
                }
                mRtTransaction.hide(mSurfaceControl);
                if (mRtReleaseSurfaces) {
                    mRtReleaseSurfaces = false;
                    releaseSurfaces(mRtTransaction);
                }
                applyOrMergeTransaction(mRtTransaction, frameNumber);
                mRtHandlingPositionUpdates = false;
            }
        }
    }
+5 −3
Original line number Diff line number Diff line
@@ -10507,9 +10507,11 @@ public final class ViewRootImpl implements ViewParent,

    @Override
    public boolean applyTransactionOnDraw(@NonNull SurfaceControl.Transaction t) {
        registerRtFrameCallback(frame -> {
            mergeWithNextTransaction(t, frame);
        });
        if (mRemoved) {
            t.apply();
        } else {
            registerRtFrameCallback(frame -> mergeWithNextTransaction(t, frame));
        }
        return true;
    }