Merge "Made SurfaceSyncGroup final"
This commit is contained in:
committed by
Android (Google) Code Review
commit
98e0185091
@@ -60332,7 +60332,7 @@ package android.window {
|
||||
method @UiThread public void remove();
|
||||
}
|
||||
|
||||
public class SurfaceSyncGroup {
|
||||
public final class SurfaceSyncGroup {
|
||||
ctor public SurfaceSyncGroup(@NonNull String);
|
||||
method @UiThread public boolean add(@Nullable android.view.AttachedSurfaceControl, @Nullable Runnable);
|
||||
method public boolean add(@NonNull android.view.SurfaceControlViewHost.SurfacePackage, @Nullable Runnable);
|
||||
|
||||
@@ -11511,33 +11511,25 @@ public final class ViewRootImpl implements ViewParent,
|
||||
});
|
||||
}
|
||||
|
||||
private class VRISurfaceSyncGroup extends SurfaceSyncGroup {
|
||||
VRISurfaceSyncGroup(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSyncReady() {
|
||||
Runnable runnable = () -> {
|
||||
mNumPausedForSync--;
|
||||
if (!mIsInTraversal && mNumPausedForSync == 0) {
|
||||
scheduleTraversals();
|
||||
}
|
||||
};
|
||||
|
||||
if (Thread.currentThread() == mThread) {
|
||||
runnable.run();
|
||||
} else {
|
||||
mHandler.post(runnable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SurfaceSyncGroup getOrCreateSurfaceSyncGroup() {
|
||||
boolean newSyncGroup = false;
|
||||
if (mActiveSurfaceSyncGroup == null) {
|
||||
mActiveSurfaceSyncGroup = new VRISurfaceSyncGroup(mTag);
|
||||
mActiveSurfaceSyncGroup = new SurfaceSyncGroup(mTag);
|
||||
mActiveSurfaceSyncGroup.setAddedToSyncListener(() -> {
|
||||
Runnable runnable = () -> {
|
||||
mNumPausedForSync--;
|
||||
if (!mIsInTraversal && mNumPausedForSync == 0) {
|
||||
scheduleTraversals();
|
||||
}
|
||||
};
|
||||
|
||||
if (Thread.currentThread() == mThread) {
|
||||
runnable.run();
|
||||
} else {
|
||||
mHandler.post(runnable);
|
||||
}
|
||||
});
|
||||
updateSyncInProgressCount(mActiveSurfaceSyncGroup);
|
||||
newSyncGroup = true;
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ import java.util.function.Supplier;
|
||||
* see the <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/window/SurfaceSyncGroup.md">SurfaceSyncGroup documentation</a>
|
||||
* </p>
|
||||
*/
|
||||
public class SurfaceSyncGroup {
|
||||
public final class SurfaceSyncGroup {
|
||||
private static final String TAG = "SurfaceSyncGroup";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
@@ -101,6 +101,9 @@ public class SurfaceSyncGroup {
|
||||
*/
|
||||
public final ISurfaceSyncGroup mISurfaceSyncGroup = new ISurfaceSyncGroupImpl();
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private Runnable mAddedToSyncListener;
|
||||
|
||||
/**
|
||||
* Token to identify this SurfaceSyncGroup. This is used to register the SurfaceSyncGroup in
|
||||
* WindowManager. This token is also sent to other processes' SurfaceSyncGroup that want to be
|
||||
@@ -447,12 +450,15 @@ public class SurfaceSyncGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the SurfaceSyncGroup has been added to another SurfaceSyncGroup and is ready
|
||||
* to proceed.
|
||||
* Add a Runnable to be invoked when the SurfaceSyncGroup has been added to another
|
||||
* SurfaceSyncGroup. This is useful to know when it's safe to proceed rendering.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public void onSyncReady() {
|
||||
public void setAddedToSyncListener(Runnable addedToSyncListener) {
|
||||
synchronized (mLock) {
|
||||
mAddedToSyncListener = addedToSyncListener;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean addSyncToWm(IBinder token, boolean parentSyncGroupMerge,
|
||||
@@ -525,12 +531,15 @@ public class SurfaceSyncGroup {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "setTransactionCallbackFromParent " + mName);
|
||||
}
|
||||
boolean finished = false;
|
||||
|
||||
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIEW,
|
||||
"setTransactionCallbackFromParent " + mName + " callback="
|
||||
+ transactionReadyCallback.hashCode());
|
||||
}
|
||||
|
||||
boolean finished = false;
|
||||
Runnable addedToSyncListener = null;
|
||||
synchronized (mLock) {
|
||||
if (mFinished) {
|
||||
finished = true;
|
||||
@@ -577,6 +586,7 @@ public class SurfaceSyncGroup {
|
||||
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
|
||||
}
|
||||
};
|
||||
addedToSyncListener = mAddedToSyncListener;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -587,8 +597,8 @@ public class SurfaceSyncGroup {
|
||||
transactionReadyCallback.onTransactionReady(null);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
} else {
|
||||
onSyncReady();
|
||||
} else if (addedToSyncListener != null) {
|
||||
addedToSyncListener.run();
|
||||
}
|
||||
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
|
||||
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
|
||||
|
||||
@@ -54,11 +54,11 @@ public class SurfaceSyncGroupTest {
|
||||
final CountDownLatch finishedLatch = new CountDownLatch(1);
|
||||
SurfaceSyncGroup syncGroup = new SurfaceSyncGroup(TAG);
|
||||
syncGroup.addSyncCompleteCallback(mExecutor, finishedLatch::countDown);
|
||||
SyncTarget syncTarget = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget = new SurfaceSyncGroup("FakeSyncTarget");
|
||||
syncGroup.add(syncTarget, null /* runnable */);
|
||||
syncGroup.markSyncReady();
|
||||
|
||||
syncTarget.onBufferReady();
|
||||
syncTarget.markSyncReady();
|
||||
|
||||
finishedLatch.await(5, TimeUnit.SECONDS);
|
||||
assertEquals(0, finishedLatch.getCount());
|
||||
@@ -69,22 +69,22 @@ public class SurfaceSyncGroupTest {
|
||||
final CountDownLatch finishedLatch = new CountDownLatch(1);
|
||||
SurfaceSyncGroup syncGroup = new SurfaceSyncGroup(TAG);
|
||||
syncGroup.addSyncCompleteCallback(mExecutor, finishedLatch::countDown);
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SyncTarget syncTarget3 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
SurfaceSyncGroup syncTarget3 = new SurfaceSyncGroup("FakeSyncTarget3");
|
||||
|
||||
syncGroup.add(syncTarget1, null /* runnable */);
|
||||
syncGroup.add(syncTarget2, null /* runnable */);
|
||||
syncGroup.add(syncTarget3, null /* runnable */);
|
||||
syncGroup.markSyncReady();
|
||||
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
assertNotEquals(0, finishedLatch.getCount());
|
||||
|
||||
syncTarget3.onBufferReady();
|
||||
syncTarget3.markSyncReady();
|
||||
assertNotEquals(0, finishedLatch.getCount());
|
||||
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
|
||||
finishedLatch.await(5, TimeUnit.SECONDS);
|
||||
assertEquals(0, finishedLatch.getCount());
|
||||
@@ -94,8 +94,8 @@ public class SurfaceSyncGroupTest {
|
||||
public void testAddSyncWhenSyncComplete() {
|
||||
SurfaceSyncGroup syncGroup = new SurfaceSyncGroup(TAG);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
|
||||
assertTrue(syncGroup.add(syncTarget1, null /* runnable */));
|
||||
syncGroup.markSyncReady();
|
||||
@@ -114,21 +114,21 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.addSyncCompleteCallback(mExecutor, finishedLatch1::countDown);
|
||||
syncGroup2.addSyncCompleteCallback(mExecutor, finishedLatch2::countDown);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
|
||||
assertTrue(syncGroup1.add(syncTarget1, null /* runnable */));
|
||||
assertTrue(syncGroup2.add(syncTarget2, null /* runnable */));
|
||||
syncGroup1.markSyncReady();
|
||||
syncGroup2.markSyncReady();
|
||||
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
|
||||
finishedLatch1.await(5, TimeUnit.SECONDS);
|
||||
assertEquals(0, finishedLatch1.getCount());
|
||||
assertNotEquals(0, finishedLatch2.getCount());
|
||||
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
|
||||
finishedLatch2.await(5, TimeUnit.SECONDS);
|
||||
assertEquals(0, finishedLatch2.getCount());
|
||||
@@ -144,8 +144,8 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.addSyncCompleteCallback(mExecutor, finishedLatch1::countDown);
|
||||
syncGroup2.addSyncCompleteCallback(mExecutor, finishedLatch2::countDown);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
|
||||
assertTrue(syncGroup1.add(syncTarget1, null /* runnable */));
|
||||
assertTrue(syncGroup2.add(syncTarget2, null /* runnable */));
|
||||
@@ -155,12 +155,12 @@ public class SurfaceSyncGroupTest {
|
||||
|
||||
// Finish syncTarget2 first to test that the syncGroup is not complete until the merged sync
|
||||
// is also done.
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
finishedLatch2.await(1, TimeUnit.SECONDS);
|
||||
// Sync did not complete yet
|
||||
assertNotEquals(0, finishedLatch2.getCount());
|
||||
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
|
||||
// The first sync will still get a callback when it's sync requirements are done.
|
||||
finishedLatch1.await(5, TimeUnit.SECONDS);
|
||||
@@ -180,13 +180,13 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.addSyncCompleteCallback(mExecutor, finishedLatch1::countDown);
|
||||
syncGroup2.addSyncCompleteCallback(mExecutor, finishedLatch2::countDown);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
|
||||
assertTrue(syncGroup1.add(syncTarget1, null /* runnable */));
|
||||
assertTrue(syncGroup2.add(syncTarget2, null /* runnable */));
|
||||
syncGroup1.markSyncReady();
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
|
||||
// The first sync will still get a callback when it's sync requirements are done.
|
||||
finishedLatch1.await(5, TimeUnit.SECONDS);
|
||||
@@ -194,7 +194,7 @@ public class SurfaceSyncGroupTest {
|
||||
|
||||
syncGroup2.add(syncGroup1, null /* runnable */);
|
||||
syncGroup2.markSyncReady();
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
|
||||
// Verify that the second sync will receive complete since the merged sync was already
|
||||
// completed before the merge.
|
||||
@@ -212,9 +212,9 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.addSyncCompleteCallback(mExecutor, finishedLatch1::countDown);
|
||||
syncGroup2.addSyncCompleteCallback(mExecutor, finishedLatch2::countDown);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SyncTarget syncTarget3 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
SurfaceSyncGroup syncTarget3 = new SurfaceSyncGroup("FakeSyncTarget3");
|
||||
|
||||
assertTrue(syncGroup1.add(syncTarget1, null /* runnable */));
|
||||
assertTrue(syncGroup1.add(syncTarget2, null /* runnable */));
|
||||
@@ -228,8 +228,8 @@ public class SurfaceSyncGroupTest {
|
||||
|
||||
// Make target1 and target3 ready, but not target2. SyncGroup2 should not be ready since
|
||||
// SyncGroup2 also waits for all of SyncGroup1 to finish, which includes target2
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget3.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
syncTarget3.markSyncReady();
|
||||
|
||||
// Neither SyncGroup will be ready.
|
||||
finishedLatch1.await(1, TimeUnit.SECONDS);
|
||||
@@ -238,7 +238,7 @@ public class SurfaceSyncGroupTest {
|
||||
assertEquals(1, finishedLatch1.getCount());
|
||||
assertEquals(1, finishedLatch2.getCount());
|
||||
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
|
||||
// Both sync groups should be ready after target2 completed.
|
||||
finishedLatch1.await(5, TimeUnit.SECONDS);
|
||||
@@ -257,13 +257,13 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.addSyncCompleteCallback(mExecutor, finishedLatch1::countDown);
|
||||
syncGroup2.addSyncCompleteCallback(mExecutor, finishedLatch2::countDown);
|
||||
|
||||
SyncTarget syncTarget1 = new SyncTarget();
|
||||
SyncTarget syncTarget2 = new SyncTarget();
|
||||
SyncTarget syncTarget3 = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget1 = new SurfaceSyncGroup("FakeSyncTarget1");
|
||||
SurfaceSyncGroup syncTarget2 = new SurfaceSyncGroup("FakeSyncTarget2");
|
||||
SurfaceSyncGroup syncTarget3 = new SurfaceSyncGroup("FakeSyncTarget3");
|
||||
|
||||
assertTrue(syncGroup1.add(syncTarget1, null /* runnable */));
|
||||
assertTrue(syncGroup1.add(syncTarget2, null /* runnable */));
|
||||
syncTarget2.onBufferReady();
|
||||
syncTarget2.markSyncReady();
|
||||
|
||||
// Add syncTarget1 to syncGroup2 so it forces syncGroup1 into syncGroup2
|
||||
assertTrue(syncGroup2.add(syncTarget1, null /* runnable */));
|
||||
@@ -272,7 +272,7 @@ public class SurfaceSyncGroupTest {
|
||||
syncGroup1.markSyncReady();
|
||||
syncGroup2.markSyncReady();
|
||||
|
||||
syncTarget1.onBufferReady();
|
||||
syncTarget1.markSyncReady();
|
||||
|
||||
// Only SyncGroup1 will be ready, but SyncGroup2 still needs its own targets to be ready.
|
||||
finishedLatch1.await(1, TimeUnit.SECONDS);
|
||||
@@ -281,7 +281,7 @@ public class SurfaceSyncGroupTest {
|
||||
assertEquals(0, finishedLatch1.getCount());
|
||||
assertEquals(1, finishedLatch2.getCount());
|
||||
|
||||
syncTarget3.onBufferReady();
|
||||
syncTarget3.markSyncReady();
|
||||
|
||||
// SyncGroup2 is finished after target3 completed.
|
||||
finishedLatch2.await(1, TimeUnit.SECONDS);
|
||||
@@ -302,7 +302,7 @@ public class SurfaceSyncGroupTest {
|
||||
SurfaceControl.Transaction targetTransaction = spy(new StubTransaction());
|
||||
SurfaceSyncGroup.setTransactionFactory(() -> targetTransaction);
|
||||
|
||||
SyncTarget syncTarget = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget = new SurfaceSyncGroup("FakeSyncTarget");
|
||||
assertTrue(
|
||||
syncGroup.add(syncTarget.mISurfaceSyncGroup, true /* parentSyncGroupMerge */,
|
||||
null /* runnable */));
|
||||
@@ -329,7 +329,7 @@ public class SurfaceSyncGroupTest {
|
||||
SurfaceControl.Transaction targetTransaction = spy(new StubTransaction());
|
||||
SurfaceSyncGroup.setTransactionFactory(() -> targetTransaction);
|
||||
|
||||
SyncTarget syncTarget = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget = new SurfaceSyncGroup("FakeSyncTarget");
|
||||
assertTrue(syncGroup.add(syncTarget, null /* runnable */));
|
||||
syncTarget.markSyncReady();
|
||||
|
||||
@@ -344,13 +344,13 @@ public class SurfaceSyncGroupTest {
|
||||
final CountDownLatch finishedLatch = new CountDownLatch(1);
|
||||
SurfaceSyncGroup syncGroup = new SurfaceSyncGroup(TAG);
|
||||
syncGroup.addSyncCompleteCallback(mExecutor, finishedLatch::countDown);
|
||||
SyncTarget syncTarget = new SyncTarget();
|
||||
SurfaceSyncGroup syncTarget = new SurfaceSyncGroup("FakeSyncTarget");
|
||||
syncGroup.add(syncTarget, null /* runnable */);
|
||||
// Add the syncTarget to the same syncGroup and ensure it doesn't crash.
|
||||
syncGroup.add(syncTarget, null /* runnable */);
|
||||
syncGroup.markSyncReady();
|
||||
|
||||
syncTarget.onBufferReady();
|
||||
syncTarget.markSyncReady();
|
||||
|
||||
try {
|
||||
finishedLatch.await(5, TimeUnit.SECONDS);
|
||||
@@ -359,14 +359,4 @@ public class SurfaceSyncGroupTest {
|
||||
}
|
||||
assertEquals(0, finishedLatch.getCount());
|
||||
}
|
||||
|
||||
private static class SyncTarget extends SurfaceSyncGroup {
|
||||
SyncTarget() {
|
||||
super("FakeSyncTarget");
|
||||
}
|
||||
|
||||
void onBufferReady() {
|
||||
markSyncReady();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user