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

Change-Id: I507b44686b393c1bb854bd593535a3a3874497af
This commit is contained in:
Vishnu Nair
2022-08-11 16:32:53 -07:00
committed by Evan Rosky
parent 3e348ff74d
commit f82e53bfc3
2 changed files with 37 additions and 0 deletions

View File

@@ -274,6 +274,9 @@ public final class SurfaceControl implements Parcelable {
private static native void nativeSanitize(long transactionObject);
private static native void nativeSetDestinationFrame(long transactionObj, long nativeObject,
int l, int t, int r, int b);
private static native void nativeSetDefaultApplyToken(IBinder token);
private static native IBinder nativeGetDefaultApplyToken();
/**
* Transforms that can be applied to buffers as they are displayed to a window.
@@ -2773,6 +2776,22 @@ public final class SurfaceControl implements Parcelable {
readFromParcel(in);
}
/**
*
* @hide
*/
public static void setDefaultApplyToken(IBinder token) {
nativeSetDefaultApplyToken(token);
}
/**
*
* @hide
*/
public static IBinder getDefaultApplyToken() {
return nativeGetDefaultApplyToken();
}
/**
* Apply the transaction, clearing it's state, and making it usable
* as a new transaction.

View File

@@ -2121,6 +2121,20 @@ static jint nativeGetLayerId(JNIEnv* env, jclass clazz, jlong nativeSurfaceContr
return surface->getLayerId();
}
static void nativeSetDefaultApplyToken(JNIEnv* env, jclass clazz, jobject applyToken) {
sp<IBinder> token(ibinderForJavaObject(env, applyToken));
if (token == nullptr) {
ALOGE("Null apply token provided.");
return;
}
SurfaceComposerClient::Transaction::setDefaultApplyToken(token);
}
static jobject nativeGetDefaultApplyToken(JNIEnv* env, jclass clazz) {
sp<IBinder> token = SurfaceComposerClient::Transaction::getDefaultApplyToken();
return javaObjectForIBinder(env, token);
}
// ----------------------------------------------------------------------------
static const JNINativeMethod sSurfaceControlMethods[] = {
@@ -2343,6 +2357,10 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*) nativeSanitize },
{"nativeSetDestinationFrame", "(JJIIII)V",
(void*)nativeSetDestinationFrame },
{"nativeSetDefaultApplyToken", "(Landroid/os/IBinder;)V",
(void*)nativeSetDefaultApplyToken },
{"nativeGetDefaultApplyToken", "()Landroid/os/IBinder;",
(void*)nativeGetDefaultApplyToken },
// clang-format on
};