Merge "Only prevent overlapping SSG if a buffer is going to be synced" into udc-dev

This commit is contained in:
Chavi Weingarten
2023-05-09 15:29:03 +00:00
committed by Android (Google) Code Review
2 changed files with 52 additions and 47 deletions

View File

@@ -3780,6 +3780,16 @@ public final class ViewRootImpl implements ViewParent,
createSyncIfNeeded(); createSyncIfNeeded();
notifyDrawStarted(isInWMSRequestedSync()); notifyDrawStarted(isInWMSRequestedSync());
mDrewOnceForSync = true; mDrewOnceForSync = true;
// If the active SSG is also requesting to sync a buffer, the following needs to happen
// 1. Ensure we keep track of the number of active syncs to know when to disable RT
// RT animations that conflict with syncing a buffer.
// 2. Add a safeguard SSG to prevent multiple SSG that sync buffers from being submitted
// out of order.
if (mActiveSurfaceSyncGroup != null && mSyncBuffer) {
updateSyncInProgressCount(mActiveSurfaceSyncGroup);
safeguardOverlappingSyncs(mActiveSurfaceSyncGroup);
}
} }
if (!isViewVisible) { if (!isViewVisible) {
@@ -3844,14 +3854,11 @@ public final class ViewRootImpl implements ViewParent,
mWmsRequestSyncGroupState = WMS_SYNC_MERGED; mWmsRequestSyncGroupState = WMS_SYNC_MERGED;
reportDrawFinished(t, seqId); reportDrawFinished(t, seqId);
}); });
Trace.traceBegin(Trace.TRACE_TAG_VIEW,
"create WMS Sync group=" + mWmsRequestSyncGroup.getName());
if (DEBUG_BLAST) { if (DEBUG_BLAST) {
Log.d(mTag, "Setup new sync=" + mWmsRequestSyncGroup.getName()); Log.d(mTag, "Setup new sync=" + mWmsRequestSyncGroup.getName());
} }
mWmsRequestSyncGroup.add(this, null /* runnable */); mWmsRequestSyncGroup.add(this, null /* runnable */);
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
} }
private void notifyContentCaptureEvents() { private void notifyContentCaptureEvents() {
@@ -4512,6 +4519,9 @@ public final class ViewRootImpl implements ViewParent,
Log.d(mTag, "reportDrawFinished"); Log.d(mTag, "reportDrawFinished");
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, "reportDrawFinished " + mTag + " seqId=" + seqId);
}
try { try {
mWindowSession.finishDrawing(mWindow, t, seqId); mWindowSession.finishDrawing(mWindow, t, seqId);
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -11395,7 +11405,7 @@ public final class ViewRootImpl implements ViewParent,
* ensure the latter SSG always waits for the former SSG's transaction to get to SF. * ensure the latter SSG always waits for the former SSG's transaction to get to SF.
*/ */
private void safeguardOverlappingSyncs(SurfaceSyncGroup activeSurfaceSyncGroup) { private void safeguardOverlappingSyncs(SurfaceSyncGroup activeSurfaceSyncGroup) {
SurfaceSyncGroup safeguardSsg = new SurfaceSyncGroup("VRI-Safeguard"); SurfaceSyncGroup safeguardSsg = new SurfaceSyncGroup("Safeguard-" + mTag);
// Always disable timeout on the safeguard sync // Always disable timeout on the safeguard sync
safeguardSsg.toggleTimeout(false /* enable */); safeguardSsg.toggleTimeout(false /* enable */);
synchronized (mPreviousSyncSafeguardLock) { synchronized (mPreviousSyncSafeguardLock) {
@@ -11454,8 +11464,6 @@ public final class ViewRootImpl implements ViewParent,
mHandler.post(runnable); mHandler.post(runnable);
} }
}); });
safeguardOverlappingSyncs(mActiveSurfaceSyncGroup);
updateSyncInProgressCount(mActiveSurfaceSyncGroup);
newSyncGroup = true; newSyncGroup = true;
} }

View File

@@ -53,7 +53,6 @@ import java.util.function.Supplier;
* This will also allow synchronization of surfaces across multiple processes. The caller can add * This will also allow synchronization of surfaces across multiple processes. The caller can add
* SurfaceControlViewHosts from another process to the SurfaceSyncGroup in a different process * SurfaceControlViewHosts from another process to the SurfaceSyncGroup in a different process
* and this clas will ensure all the surfaces are ready before applying everything together. * and this clas will ensure all the surfaces are ready before applying everything together.
* </p>
* see the <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/window/SurfaceSyncGroup.md">SurfaceSyncGroup documentation</a> * see the <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/window/SurfaceSyncGroup.md">SurfaceSyncGroup documentation</a>
* </p> * </p>
*/ */
@@ -136,6 +135,7 @@ public final class SurfaceSyncGroup {
@GuardedBy("mLock") @GuardedBy("mLock")
private boolean mTimeoutDisabled; private boolean mTimeoutDisabled;
private final String mTrackName;
private static boolean isLocalBinder(IBinder binder) { private static boolean isLocalBinder(IBinder binder) {
return !(binder instanceof BinderProxy); return !(binder instanceof BinderProxy);
@@ -192,6 +192,7 @@ public final class SurfaceSyncGroup {
} }
mName = name + "#" + sCounter.getAndIncrement(); mName = name + "#" + sCounter.getAndIncrement();
mTrackName = "SurfaceSyncGroup " + name;
mTransactionReadyConsumer = (transaction) -> { mTransactionReadyConsumer = (transaction) -> {
if (DEBUG && transaction != null) { if (DEBUG && transaction != null) {
@@ -199,9 +200,10 @@ public final class SurfaceSyncGroup {
+ mName); + mName);
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, Trace.instantForTrack(Trace.TRACE_TAG_VIEW, mTrackName,
"Final TransactionCallback with " + transaction + " for " + mName); "Final TransactionCallback with " + transaction);
} }
Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
transactionReadyConsumer.accept(transaction); transactionReadyConsumer.accept(transaction);
synchronized (mLock) { synchronized (mLock) {
// If there's a registered listener with WMS, that means we aren't actually complete // If there's a registered listener with WMS, that means we aren't actually complete
@@ -213,7 +215,7 @@ public final class SurfaceSyncGroup {
}; };
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, "new SurfaceSyncGroup " + mName); Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName, mName, hashCode());
} }
if (DEBUG) { if (DEBUG) {
@@ -257,7 +259,7 @@ public final class SurfaceSyncGroup {
Log.d(TAG, "markSyncReady " + mName); Log.d(TAG, "markSyncReady " + mName);
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "markSyncReady " + mName); Trace.instantForTrack(Trace.TRACE_TAG_VIEW, mTrackName, "markSyncReady");
} }
synchronized (mLock) { synchronized (mLock) {
if (mHasWMSync) { if (mHasWMSync) {
@@ -269,9 +271,6 @@ public final class SurfaceSyncGroup {
mSyncReady = true; mSyncReady = true;
checkIfSyncIsComplete(); checkIfSyncIsComplete();
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
} }
/** /**
@@ -399,14 +398,14 @@ public final class SurfaceSyncGroup {
public boolean add(ISurfaceSyncGroup surfaceSyncGroup, boolean parentSyncGroupMerge, public boolean add(ISurfaceSyncGroup surfaceSyncGroup, boolean parentSyncGroupMerge,
@Nullable Runnable runnable) { @Nullable Runnable runnable) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"addToSync token=" + mToken.hashCode() + " parent=" + mName); "addToSync token=" + mToken.hashCode(), hashCode());
} }
synchronized (mLock) { synchronized (mLock) {
if (mSyncReady) { if (mSyncReady) {
Log.w(TAG, "Trying to add to sync when already marked as ready " + mName); Log.w(TAG, "Trying to add to sync when already marked as ready " + mName);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return false; return false;
} }
@@ -419,7 +418,7 @@ public final class SurfaceSyncGroup {
if (isLocalBinder(surfaceSyncGroup.asBinder())) { if (isLocalBinder(surfaceSyncGroup.asBinder())) {
boolean didAddLocalSync = addLocalSync(surfaceSyncGroup, parentSyncGroupMerge); boolean didAddLocalSync = addLocalSync(surfaceSyncGroup, parentSyncGroupMerge);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return didAddLocalSync; return didAddLocalSync;
} }
@@ -447,7 +446,7 @@ public final class SurfaceSyncGroup {
mSurfaceSyncGroupCompletedListener)) { mSurfaceSyncGroupCompletedListener)) {
mSurfaceSyncGroupCompletedListener = null; mSurfaceSyncGroupCompletedListener = null;
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return false; return false;
} }
@@ -459,13 +458,13 @@ public final class SurfaceSyncGroup {
surfaceSyncGroup.onAddedToSyncGroup(mToken, parentSyncGroupMerge); surfaceSyncGroup.onAddedToSyncGroup(mToken, parentSyncGroupMerge);
} catch (RemoteException e) { } catch (RemoteException e) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return false; return false;
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return true; return true;
} }
@@ -510,15 +509,15 @@ public final class SurfaceSyncGroup {
+ ". Setting up Sync in WindowManager."); + ". Setting up Sync in WindowManager.");
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"addSyncToWm=" + token.hashCode() + " group=" + mName); "addSyncToWm=" + token.hashCode(), hashCode());
} }
AddToSurfaceSyncGroupResult addToSyncGroupResult = new AddToSurfaceSyncGroupResult(); AddToSurfaceSyncGroupResult addToSyncGroupResult = new AddToSurfaceSyncGroupResult();
if (!WindowManagerGlobal.getWindowManagerService().addToSurfaceSyncGroup(token, if (!WindowManagerGlobal.getWindowManagerService().addToSurfaceSyncGroup(token,
parentSyncGroupMerge, surfaceSyncGroupCompletedListener, parentSyncGroupMerge, surfaceSyncGroupCompletedListener,
addToSyncGroupResult)) { addToSyncGroupResult)) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return false; return false;
} }
@@ -527,12 +526,12 @@ public final class SurfaceSyncGroup {
addToSyncGroupResult.mTransactionReadyCallback); addToSyncGroupResult.mTransactionReadyCallback);
} catch (RemoteException e) { } catch (RemoteException e) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return false; return false;
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return true; return true;
} }
@@ -550,8 +549,8 @@ public final class SurfaceSyncGroup {
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"addLocalSync=" + childSurfaceSyncGroup.mName + " parent=" + mName); "addLocalSync=" + childSurfaceSyncGroup.mName, hashCode());
} }
ITransactionReadyCallback callback = ITransactionReadyCallback callback =
createTransactionReadyCallback(parentSyncGroupMerge); createTransactionReadyCallback(parentSyncGroupMerge);
@@ -562,7 +561,7 @@ public final class SurfaceSyncGroup {
childSurfaceSyncGroup.setTransactionCallbackFromParent(mISurfaceSyncGroup, callback); childSurfaceSyncGroup.setTransactionCallbackFromParent(mISurfaceSyncGroup, callback);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return true; return true;
} }
@@ -574,9 +573,9 @@ public final class SurfaceSyncGroup {
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"setTransactionCallbackFromParent " + mName + " callback=" "setTransactionCallbackFromParent " + mName + " callback="
+ transactionReadyCallback.hashCode()); + transactionReadyCallback.hashCode(), hashCode());
} }
// Start the timeout when this SurfaceSyncGroup has been added to a parent SurfaceSyncGroup. // Start the timeout when this SurfaceSyncGroup has been added to a parent SurfaceSyncGroup.
@@ -617,9 +616,9 @@ public final class SurfaceSyncGroup {
mParentSyncGroup = parentSyncGroup; mParentSyncGroup = parentSyncGroup;
mTransactionReadyConsumer = (transaction) -> { mTransactionReadyConsumer = (transaction) -> {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"transactionReadyCallback " + mName + " callback=" "Invoke transactionReadyCallback="
+ transactionReadyCallback.hashCode()); + transactionReadyCallback.hashCode(), hashCode());
} }
lastCallback.accept(null); lastCallback.accept(null);
@@ -629,7 +628,7 @@ public final class SurfaceSyncGroup {
transaction.apply(); transaction.apply();
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
}; };
addedToSyncListener = mAddedToSyncListener; addedToSyncListener = mAddedToSyncListener;
@@ -647,7 +646,7 @@ public final class SurfaceSyncGroup {
addedToSyncListener.run(); addedToSyncListener.run();
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
} }
@@ -669,8 +668,8 @@ public final class SurfaceSyncGroup {
} }
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, Trace.instantForTrack(Trace.TRACE_TAG_VIEW, mTrackName,
"checkIfSyncIsComplete " + mName + " mSyncReady=" + mSyncReady "checkIfSyncIsComplete mSyncReady=" + mSyncReady
+ " mPendingSyncs=" + mPendingSyncs.size()); + " mPendingSyncs=" + mPendingSyncs.size());
} }
@@ -726,9 +725,8 @@ public final class SurfaceSyncGroup {
} }
mPendingSyncs.remove(this); mPendingSyncs.remove(this);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, Trace.instantForTrack(Trace.TRACE_TAG_VIEW, mTrackName,
"onTransactionReady group=" + mName + " callback=" "onTransactionReady callback=" + hashCode());
+ hashCode());
} }
checkIfSyncIsComplete(); checkIfSyncIsComplete();
} }
@@ -743,8 +741,8 @@ public final class SurfaceSyncGroup {
} }
mPendingSyncs.add(transactionReadyCallback); mPendingSyncs.add(transactionReadyCallback);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.instant(Trace.TRACE_TAG_VIEW, Trace.instantForTrack(Trace.TRACE_TAG_VIEW, mTrackName,
"createTransactionReadyCallback " + mName + " mPendingSyncs=" "createTransactionReadyCallback mPendingSyncs="
+ mPendingSyncs.size() + " transactionReady=" + mPendingSyncs.size() + " transactionReady="
+ transactionReadyCallback.hashCode()); + transactionReadyCallback.hashCode());
} }
@@ -764,13 +762,12 @@ public final class SurfaceSyncGroup {
public boolean onAddedToSyncGroup(IBinder parentSyncGroupToken, public boolean onAddedToSyncGroup(IBinder parentSyncGroupToken,
boolean parentSyncGroupMerge) { boolean parentSyncGroupMerge) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_VIEW, mTrackName,
"onAddedToSyncGroup token=" + parentSyncGroupToken.hashCode() + " child=" "onAddedToSyncGroup token=" + parentSyncGroupToken.hashCode(), hashCode());
+ mName);
} }
boolean didAdd = addSyncToWm(parentSyncGroupToken, parentSyncGroupMerge, null); boolean didAdd = addSyncToWm(parentSyncGroupToken, parentSyncGroupMerge, null);
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceEnd(Trace.TRACE_TAG_VIEW); Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_VIEW, mTrackName, hashCode());
} }
return didAdd; return didAdd;
} }