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

This commit is contained in:
Chavi Weingarten
2021-11-08 23:35:55 +00:00
committed by Android (Google) Code Review
2 changed files with 12 additions and 25 deletions

View File

@@ -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;
}
}
}

View File

@@ -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;
}