SurfaceComposerClient: Expose default apply token
The default apply token specifies which transaction queue transactions
from a process is sent to in surfaceflinger. This queue is used to
ensure transactions from a process are applied in order.
If a transaction from multiple processes need to be applied in order,
we can use a commit callback to act as a barrier or pass transactions
across processes to be applied on a single process. In some cases
where operations are intertwined it may be advantageous to set a
single transaction queue for multiple processes. In this case
this api can be used to set a single queue to apply transactions by
setting the same apply token on both processes.
Note this api if misused can result in surprising out of order
transactions.
Test: manually set the same applytoken on multiple processes and
verify they go into the same queue.
Bug: 242193885
Bug: 242193885
Change-Id: I106fa701cc844d675e2ff2a05b5edcfed8cf85ff
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index d16ddb9..e7c1d7f 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -1038,9 +1038,7 @@
flags |= ISurfaceComposer::eEarlyWakeupEnd;
}
- sp<IBinder> applyToken = mApplyToken
- ? mApplyToken
- : IInterface::asBinder(TransactionCompletedListener::getIInstance());
+ sp<IBinder> applyToken = mApplyToken ? mApplyToken : sApplyToken;
sf->setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,
mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,
@@ -1055,6 +1053,15 @@
return NO_ERROR;
}
+sp<IBinder> SurfaceComposerClient::Transaction::sApplyToken = new BBinder();
+
+sp<IBinder> SurfaceComposerClient::Transaction::getDefaultApplyToken() {
+ return sApplyToken;
+}
+
+void SurfaceComposerClient::Transaction::setDefaultApplyToken(sp<IBinder> applyToken) {
+ sApplyToken = applyToken;
+}
// ---------------------------------------------------------------------------
sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {