diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 017f2e4e9af19..6be6f9d110ada 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -967,7 +967,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall final boolean redrawNeeded = sizeChanged || creating || hintChanged || (mVisible && !mDrawFinished); boolean shouldSyncBuffer = - redrawNeeded && viewRoot.wasRelayoutRequested() && viewRoot.isInSync(); + redrawNeeded && viewRoot.wasRelayoutRequested() && viewRoot.isInLocalSync(); SyncBufferTransactionCallback syncBufferTransactionCallback = null; if (shouldSyncBuffer) { syncBufferTransactionCallback = new SyncBufferTransactionCallback(); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 92289d9c72b6c..27ce711558573 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -319,6 +319,8 @@ public final class ViewRootImpl implements ViewParent, */ private static final int SCROLL_CAPTURE_REQUEST_TIMEOUT_MILLIS = 2500; + private static final int UNSET_SYNC_ID = -1; + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) static final ThreadLocal sRunQueues = new ThreadLocal(); @@ -815,7 +817,7 @@ public final class ViewRootImpl implements ViewParent, } private final SurfaceSyncer mSurfaceSyncer = new SurfaceSyncer(); - private int mLastSyncId = -1; + private int mSyncId = UNSET_SYNC_ID; private SurfaceSyncer.SyncBufferCallback mSyncBufferCallback; private int mNumSyncsInProgress = 0; @@ -3463,21 +3465,21 @@ public final class ViewRootImpl implements ViewParent, mReportNextDraw = false; mSyncBufferCallback = null; mSyncBuffer = false; - if (mLastSyncId != -1) { - mSurfaceSyncer.markSyncReady(mLastSyncId); - mLastSyncId = -1; + if (isInLocalSync()) { + mSurfaceSyncer.markSyncReady(mSyncId); + mSyncId = UNSET_SYNC_ID; } } } private void createSyncIfNeeded() { // Started a sync already or there's nothing needing to sync - if (mLastSyncId != -1 || !mReportNextDraw) { + if (isInLocalSync() || !mReportNextDraw) { return; } final int seqId = mSyncSeqId; - mLastSyncId = mSurfaceSyncer.setupSync(transaction -> { + mSyncId = mSurfaceSyncer.setupSync(transaction -> { // Callback will be invoked on executor thread so post to main thread. mHandler.postAtFrontOfQueue(() -> { mSurfaceChangedTransaction.merge(transaction); @@ -3485,9 +3487,9 @@ public final class ViewRootImpl implements ViewParent, }); }); if (DEBUG_BLAST) { - Log.d(mTag, "Setup new sync id=" + mLastSyncId); + Log.d(mTag, "Setup new sync id=" + mSyncId); } - mSurfaceSyncer.addToSync(mLastSyncId, mSyncTarget); + mSurfaceSyncer.addToSync(mSyncId, mSyncTarget); } private void notifyContentCatpureEvents() { @@ -4123,17 +4125,19 @@ public final class ViewRootImpl implements ViewParent, return mAttachInfo.mThreadedRenderer != null && mAttachInfo.mThreadedRenderer.isEnabled(); } - boolean addToSync(SurfaceSyncer.SyncTarget syncable) { - if (mLastSyncId == -1) { - return false; + void addToSync(SurfaceSyncer.SyncTarget syncable) { + if (!isInLocalSync()) { + return; } - mSurfaceSyncer.addToSync(mLastSyncId, syncable); - return true; + mSurfaceSyncer.addToSync(mSyncId, syncable); } - - public boolean isInSync() { - return mLastSyncId != -1; + /** + * This VRI is currently in the middle of a sync request, but specifically one initiated from + * within VRI. + */ + public boolean isInLocalSync() { + return mSyncId != UNSET_SYNC_ID; } private void addFrameCommitCallbackIfNeeded() { @@ -10895,6 +10899,10 @@ public final class ViewRootImpl implements ViewParent, private void readyToSync(SurfaceSyncer.SyncBufferCallback syncBufferCallback) { mNumSyncsInProgress++; + if (!isInLocalSync()) { + // Always sync the buffer if the sync request did not come from VRI. + mSyncBuffer = true; + } if (mAttachInfo.mThreadedRenderer != null) { HardwareRenderer.setRtAnimationsEnabled(false); }