Merge "SurfaceView: Fix SurfaceControl synchronization issues" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-09-20 22:59:15 +00:00
committed by Android (Google) Code Review

View File

@@ -1464,10 +1464,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
@Override @Override
public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { public void positionChanged(long frameNumber, int left, int top, int right, int bottom) {
synchronized(mSurfaceControlLock) {
if (mSurfaceControl == null) { if (mSurfaceControl == null) {
return; return;
} }
// TODO: This is teensy bit racey in that a brand new SurfaceView moving on // 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 // its 2nd frame if RenderThread is running slowly could potentially see
// this as false, enter the branch, get pre-empted, then this comes along // this as false, enter the branch, get pre-empted, then this comes along
@@ -1476,7 +1476,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
// the synchronization would violate the rule that RT must never block // the synchronization would violate the rule that RT must never block
// on the UI thread which would open up potential deadlocks. The risk of // on the UI thread which would open up potential deadlocks. The risk of
// a single-frame desync is therefore preferable for now. // a single-frame desync is therefore preferable for now.
synchronized(mSurfaceControlLock) {
mRtHandlingPositionUpdates = true; mRtHandlingPositionUpdates = true;
} }
if (mRTLastReportedPosition.left == left if (mRTLastReportedPosition.left == left
@@ -1506,8 +1505,11 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
if (mViewVisibility) { if (mViewVisibility) {
mPositionChangedTransaction.show(mSurfaceControl); mPositionChangedTransaction.show(mSurfaceControl);
} }
final ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
applyChildSurfaceTransaction_renderWorker(mPositionChangedTransaction, applyChildSurfaceTransaction_renderWorker(mPositionChangedTransaction,
getViewRootImpl().mSurface, frameNumber); viewRoot.mSurface, frameNumber);
}
applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); applyOrMergeTransaction(mPositionChangedTransaction, frameNumber);
mPendingTransaction = false; mPendingTransaction = false;
} catch (Exception ex) { } catch (Exception ex) {
@@ -1528,7 +1530,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
@Override @Override
public void positionLost(long frameNumber) { public void positionLost(long frameNumber) {
if (DEBUG) { if (DEBUG_POSITION) {
Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d", Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d",
System.identityHashCode(this), frameNumber)); System.identityHashCode(this), frameNumber));
} }
@@ -1540,15 +1542,15 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
mPositionChangedTransaction.clear(); mPositionChangedTransaction.clear();
mPendingTransaction = false; mPendingTransaction = false;
} }
if (mSurfaceControl == null) {
return;
}
/** /**
* positionLost can be called while UI thread is un-paused so we * positionLost can be called while UI thread is un-paused so we
* need to hold the lock here. * need to hold the lock here.
*/ */
synchronized (mSurfaceControlLock) { synchronized (mSurfaceControlLock) {
if (mSurfaceControl == null) {
return;
}
mRtTransaction.hide(mSurfaceControl); mRtTransaction.hide(mSurfaceControl);
if (mRtReleaseSurfaces) { if (mRtReleaseSurfaces) {
mRtReleaseSurfaces = false; mRtReleaseSurfaces = false;