Merge "Remove onSyncComplete from SurfaceSyncGroup"

This commit is contained in:
Chavi Weingarten
2022-11-16 14:02:51 +00:00
committed by Android (Google) Code Review
4 changed files with 94 additions and 95 deletions

View File

@@ -1073,7 +1073,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private void handleSyncBufferCallback(SurfaceHolder.Callback[] callbacks,
SyncBufferTransactionCallback syncBufferTransactionCallback) {
getViewRootImpl().addToSync(syncBufferCallback ->
getViewRootImpl().addToSync((parentSyncGroup, syncBufferCallback) ->
redrawNeededAsync(callbacks, () -> {
Transaction t = null;
if (mBlastBufferQueue != null) {
@@ -1081,7 +1081,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
t = syncBufferTransactionCallback.waitForTransaction();
}
syncBufferCallback.onBufferReady(t);
syncBufferCallback.onTransactionReady(t);
onDrawFinished();
}));
}
@@ -1092,9 +1092,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
mSyncGroups.add(syncGroup);
}
syncGroup.addToSync(syncBufferCallback -> redrawNeededAsync(callbacks,
() -> {
syncBufferCallback.onBufferReady(null);
syncGroup.addToSync((parentSyncGroup, syncBufferCallback) ->
redrawNeededAsync(callbacks, () -> {
syncBufferCallback.onTransactionReady(null);
onDrawFinished();
synchronized (mSyncGroups) {
mSyncGroups.remove(syncGroup);

View File

@@ -231,6 +231,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
/**
* The top of a view hierarchy, implementing the needed protocol between View
@@ -851,7 +852,7 @@ public final class ViewRootImpl implements ViewParent,
}
private SurfaceSyncGroup mSyncGroup;
private SurfaceSyncGroup.SyncBufferCallback mSyncBufferCallback;
private SurfaceSyncGroup.TransactionReadyCallback mTransactionReadyCallback;
private int mNumSyncsInProgress = 0;
private HashSet<ScrollCaptureCallback> mRootScrollCaptureCallbacks;
@@ -3610,8 +3611,8 @@ public final class ViewRootImpl implements ViewParent,
mPendingTransitions.clear();
}
if (mSyncBufferCallback != null) {
mSyncBufferCallback.onBufferReady(null);
if (mTransactionReadyCallback != null) {
mTransactionReadyCallback.onTransactionReady(null);
}
} else if (cancelAndRedraw) {
mLastPerformTraversalsSkipDrawReason = cancelDueToPreDrawListener
@@ -3626,8 +3627,8 @@ public final class ViewRootImpl implements ViewParent,
}
mPendingTransitions.clear();
}
if (!performDraw() && mSyncBufferCallback != null) {
mSyncBufferCallback.onBufferReady(null);
if (!performDraw() && mTransactionReadyCallback != null) {
mTransactionReadyCallback.onTransactionReady(null);
}
}
@@ -3641,7 +3642,7 @@ public final class ViewRootImpl implements ViewParent,
if (!cancelAndRedraw) {
mReportNextDraw = false;
mLastReportNextDrawReason = null;
mSyncBufferCallback = null;
mTransactionReadyCallback = null;
mSyncBuffer = false;
if (isInLocalSync()) {
mSyncGroup.markSyncReady();
@@ -4388,7 +4389,7 @@ public final class ViewRootImpl implements ViewParent,
return false;
}
final boolean fullRedrawNeeded = mFullRedrawNeeded || mSyncBufferCallback != null;
final boolean fullRedrawNeeded = mFullRedrawNeeded || mTransactionReadyCallback != null;
mFullRedrawNeeded = false;
mIsDrawing = true;
@@ -4396,9 +4397,9 @@ public final class ViewRootImpl implements ViewParent,
addFrameCommitCallbackIfNeeded();
boolean usingAsyncReport = isHardwareEnabled() && mSyncBufferCallback != null;
boolean usingAsyncReport = isHardwareEnabled() && mTransactionReadyCallback != null;
if (usingAsyncReport) {
registerCallbacksForSync(mSyncBuffer, mSyncBufferCallback);
registerCallbacksForSync(mSyncBuffer, mTransactionReadyCallback);
} else if (mHasPendingTransactions) {
// These callbacks are only needed if there's no sync involved and there were calls to
// applyTransactionOnDraw. These callbacks check if the draw failed for any reason and
@@ -4449,10 +4450,11 @@ public final class ViewRootImpl implements ViewParent,
}
if (mSurfaceHolder != null && mSurface.isValid()) {
final SurfaceSyncGroup.SyncBufferCallback syncBufferCallback = mSyncBufferCallback;
final SurfaceSyncGroup.TransactionReadyCallback transactionReadyCallback =
mTransactionReadyCallback;
SurfaceCallbackHelper sch = new SurfaceCallbackHelper(() ->
mHandler.post(() -> syncBufferCallback.onBufferReady(null)));
mSyncBufferCallback = null;
mHandler.post(() -> transactionReadyCallback.onTransactionReady(null)));
mTransactionReadyCallback = null;
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
@@ -4463,8 +4465,8 @@ public final class ViewRootImpl implements ViewParent,
}
}
}
if (mSyncBufferCallback != null && !usingAsyncReport) {
mSyncBufferCallback.onBufferReady(null);
if (mTransactionReadyCallback != null && !usingAsyncReport) {
mTransactionReadyCallback.onTransactionReady(null);
}
if (mPerformContentCapture) {
performContentCaptureInitialReport();
@@ -11134,7 +11136,7 @@ public final class ViewRootImpl implements ViewParent,
}
private void registerCallbacksForSync(boolean syncBuffer,
final SurfaceSyncGroup.SyncBufferCallback syncBufferCallback) {
final SurfaceSyncGroup.TransactionReadyCallback transactionReadyCallback) {
if (!isHardwareEnabled()) {
return;
}
@@ -11161,7 +11163,7 @@ public final class ViewRootImpl implements ViewParent,
// pendingDrawFinished.
if ((syncResult
& (SYNC_LOST_SURFACE_REWARD_IF_FOUND | SYNC_CONTEXT_IS_STOPPED)) != 0) {
syncBufferCallback.onBufferReady(
transactionReadyCallback.onTransactionReady(
mBlastBufferQueue.gatherPendingTransactions(frame));
return null;
}
@@ -11171,7 +11173,8 @@ public final class ViewRootImpl implements ViewParent,
}
if (syncBuffer) {
mBlastBufferQueue.syncNextTransaction(syncBufferCallback::onBufferReady);
mBlastBufferQueue.syncNextTransaction(
transactionReadyCallback::onTransactionReady);
}
return didProduceBuffer -> {
@@ -11191,7 +11194,7 @@ public final class ViewRootImpl implements ViewParent,
// since the frame didn't draw on this vsync. It's possible the frame will
// draw later, but it's better to not be sync than to block on a frame that
// may never come.
syncBufferCallback.onBufferReady(
transactionReadyCallback.onTransactionReady(
mBlastBufferQueue.gatherPendingTransactions(frame));
return;
}
@@ -11200,22 +11203,49 @@ public final class ViewRootImpl implements ViewParent,
// syncNextTransaction callback. Instead, just report back to the Syncer so it
// knows that this sync request is complete.
if (!syncBuffer) {
syncBufferCallback.onBufferReady(null);
transactionReadyCallback.onTransactionReady(null);
}
};
}
});
}
private final Executor mPostAtFrontExecutor = new Executor() {
@Override
public void execute(Runnable command) {
mHandler.postAtFrontOfQueue(command);
}
};
public final SurfaceSyncGroup.SyncTarget mSyncTarget = new SurfaceSyncGroup.SyncTarget() {
@Override
public void onReadyToSync(SurfaceSyncGroup.SyncBufferCallback syncBufferCallback) {
readyToSync(syncBufferCallback);
public void onAddedToSyncGroup(SurfaceSyncGroup parentSyncGroup,
SurfaceSyncGroup.TransactionReadyCallback transactionReadyCallback) {
updateSyncInProgressCount(parentSyncGroup);
if (!isInLocalSync()) {
// Always sync the buffer if the sync request did not come from VRI.
mSyncBuffer = true;
}
if (mAttachInfo.mThreadedRenderer != null) {
HardwareRenderer.setRtAnimationsEnabled(false);
}
if (mTransactionReadyCallback != null) {
Log.d(mTag, "Already set sync for the next draw.");
mTransactionReadyCallback.onTransactionReady(null);
}
if (DEBUG_BLAST) {
Log.d(mTag, "Setting syncFrameCallback");
}
mTransactionReadyCallback = transactionReadyCallback;
if (!mIsInTraversal && !mTraversalScheduled) {
scheduleTraversals();
}
}
@Override
public void onSyncComplete() {
mHandler.postAtFrontOfQueue(() -> {
private void updateSyncInProgressCount(SurfaceSyncGroup parentSyncGroup) {
mNumSyncsInProgress++;
parentSyncGroup.addSyncCompleteCallback(mPostAtFrontExecutor, () -> {
if (--mNumSyncsInProgress == 0 && mAttachInfo.mThreadedRenderer != null) {
HardwareRenderer.setRtAnimationsEnabled(true);
}
@@ -11228,29 +11258,6 @@ public final class ViewRootImpl implements ViewParent,
return mSyncTarget;
}
private void readyToSync(SurfaceSyncGroup.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);
}
if (mSyncBufferCallback != null) {
Log.d(mTag, "Already set sync for the next draw.");
mSyncBufferCallback.onBufferReady(null);
}
if (DEBUG_BLAST) {
Log.d(mTag, "Setting syncFrameCallback");
}
mSyncBufferCallback = syncBufferCallback;
if (!mIsInTraversal && !mTraversalScheduled) {
scheduleTraversals();
}
}
void mergeSync(SurfaceSyncGroup otherSyncGroup) {
if (!isInLocalSync()) {
return;

View File

@@ -57,12 +57,13 @@ import java.util.function.Supplier;
* option is provided.
*
* The following is what happens within the {@link SurfaceSyncGroup}
* 1. Each SyncTarget will get a {@link SyncTarget#onReadyToSync} callback that contains a
* {@link SyncBufferCallback}.
* 2. Each {@link SyncTarget} needs to invoke {@link SyncBufferCallback#onBufferReady(Transaction)}.
* This makes sure the SurfaceSyncGroup knows when the SyncTarget is complete, allowing the
* SurfaceSyncGroup to get the Transaction that contains the buffer.
* 3. When the final SyncBufferCallback finishes for the SurfaceSyncGroup, in most cases the
* 1. Each SyncTarget will get a {@link SyncTarget#onAddedToSyncGroup} callback that contains a
* {@link TransactionReadyCallback}.
* 2. Each {@link SyncTarget} needs to invoke
* {@link TransactionReadyCallback#onTransactionReady(Transaction)}. This makes sure the
* SurfaceSyncGroup knows when the SyncTarget is complete, allowing the SurfaceSyncGroup to get the
* Transaction that contains the buffer.
* 3. When the final TransactionReadyCallback finishes for the SurfaceSyncGroup, in most cases the
* transaction is applied and then the sync complete callbacks are invoked, letting the callers know
* the sync is now complete.
*
@@ -86,8 +87,6 @@ public final class SurfaceSyncGroup {
private final Transaction mTransaction = sTransactionFactory.get();
@GuardedBy("mLock")
private boolean mSyncReady;
@GuardedBy("mLock")
private final Set<SyncTarget> mSyncTargets = new ArraySet<>();
@GuardedBy("mLock")
private Consumer<Transaction> mSyncRequestCompleteCallback;
@@ -197,14 +196,13 @@ public final class SurfaceSyncGroup {
* Add a {@link SyncTarget} to a sync set. The sync set will wait for all
* SyncableSurfaces to complete before notifying.
*
* @param syncTarget A SyncableSurface that implements how to handle syncing
* buffers.
* @param syncTarget A SyncTarget that implements how to handle syncing transactions.
* @return true if the SyncTarget was successfully added to the SyncGroup, false otherwise.
*/
public boolean addToSync(SyncTarget syncTarget) {
SyncBufferCallback syncBufferCallback = new SyncBufferCallback() {
TransactionReadyCallback transactionReadyCallback = new TransactionReadyCallback() {
@Override
public void onBufferReady(Transaction t) {
public void onTransactionReady(Transaction t) {
synchronized (mLock) {
if (t != null) {
mTransaction.merge(t);
@@ -221,10 +219,9 @@ public final class SurfaceSyncGroup {
+ "SyncTargets can be added.");
return false;
}
mPendingSyncs.add(syncBufferCallback.hashCode());
mSyncTargets.add(syncTarget);
mPendingSyncs.add(transactionReadyCallback.hashCode());
}
syncTarget.onReadyToSync(syncBufferCallback);
syncTarget.onAddedToSyncGroup(this, transactionReadyCallback);
return true;
}
@@ -256,17 +253,13 @@ public final class SurfaceSyncGroup {
Log.d(TAG, "Successfully finished sync id=" + this);
}
for (SyncTarget syncTarget : mSyncTargets) {
syncTarget.onSyncComplete();
}
mSyncTargets.clear();
mSyncRequestCompleteCallback.accept(mTransaction);
mFinished = true;
}
/**
* Add a Transaction to this sync set. This allows the caller to provide other info that
* should be synced with the buffers.
* should be synced with the transactions.
*/
public void addTransactionToSync(Transaction t) {
synchronized (mLock) {
@@ -334,9 +327,10 @@ public final class SurfaceSyncGroup {
}
@Override
public void onReadyToSync(SyncBufferCallback syncBufferCallback) {
public void onAddedToSyncGroup(SurfaceSyncGroup parentSyncGroup,
TransactionReadyCallback transactionReadyCallback) {
mFrameCallbackConsumer.accept(
() -> mSurfaceView.syncNextFrame(syncBufferCallback::onBufferReady));
() -> mSurfaceView.syncNextFrame(transactionReadyCallback::onTransactionReady));
}
}
@@ -345,22 +339,19 @@ public final class SurfaceSyncGroup {
*/
public interface SyncTarget {
/**
* Called when the Syncable is ready to begin handing a sync request. When invoked, the
* implementor is required to call {@link SyncBufferCallback#onBufferReady(Transaction)}
* and {@link SyncBufferCallback#onBufferReady(Transaction)} in order for this Syncable
* to be marked as complete.
* Called when the SyncTarget has been added to a SyncGroup as is ready to begin handing a
* sync request. When invoked, the implementor is required to call
* {@link TransactionReadyCallback#onTransactionReady(Transaction)} in order for this
* SurfaceSyncGroup to fully complete.
*
* Always invoked on the thread that initiated the call to {@link #addToSync(SyncTarget)}
*
* @param syncBufferCallback A SyncBufferCallback that the caller must invoke onBufferReady
* @param parentSyncGroup The sync group this target has been added to.
* @param transactionReadyCallback A TransactionReadyCallback that the caller must invoke
* onTransactionReady
*/
void onReadyToSync(SyncBufferCallback syncBufferCallback);
/**
* There's no guarantee about the thread this callback is invoked on.
*/
default void onSyncComplete() {
}
void onAddedToSyncGroup(SurfaceSyncGroup parentSyncGroup,
TransactionReadyCallback transactionReadyCallback);
}
/**
@@ -368,14 +359,14 @@ public final class SurfaceSyncGroup {
* completed. The caller should invoke the calls when the rendering has started and finished a
* frame.
*/
public interface SyncBufferCallback {
public interface TransactionReadyCallback {
/**
* Invoked when the transaction contains the buffer and is ready to sync.
* Invoked when the transaction is ready to sync.
*
* @param t The transaction that contains the buffer to be synced. This can be null if
* there's nothing to sync
* @param t The transaction that contains the anything to be included in the synced. This
* can be null if there's nothing to sync
*/
void onBufferReady(@Nullable Transaction t);
void onTransactionReady(@Nullable Transaction t);
}
/**

View File

@@ -192,16 +192,17 @@ public class SurfaceSyncGroupTest {
}
private static class SyncTarget implements SurfaceSyncGroup.SyncTarget {
private SurfaceSyncGroup.SyncBufferCallback mSyncBufferCallback;
private SurfaceSyncGroup.TransactionReadyCallback mTransactionReadyCallback;
@Override
public void onReadyToSync(SurfaceSyncGroup.SyncBufferCallback syncBufferCallback) {
mSyncBufferCallback = syncBufferCallback;
public void onAddedToSyncGroup(SurfaceSyncGroup parentSyncGroup,
SurfaceSyncGroup.TransactionReadyCallback transactionReadyCallback) {
mTransactionReadyCallback = transactionReadyCallback;
}
void onBufferReady() {
SurfaceControl.Transaction t = new StubTransaction();
mSyncBufferCallback.onBufferReady(t);
mTransactionReadyCallback.onTransactionReady(t);
}
}
}