From f82e53bfc37bbec85c0623801694c23b36a9c288 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Thu, 11 Aug 2022 16:32:53 -0700 Subject: [PATCH] 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 --- core/java/android/view/SurfaceControl.java | 19 +++++++++++++++++++ core/jni/android_view_SurfaceControl.cpp | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 84f04c12cf512..e48140066837d 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -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. diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 9ae16304b6c82..7107458a166d7 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -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 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 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 };