Merge "SurfaceView: Fix SurfaceControl synchronization issues" into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
bc617435cf
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user