Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f82e53bf authored by Vishnu Nair's avatar Vishnu Nair Committed by Evan Rosky
Browse files

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
parent 3e348ff7
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -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.
+18 −0
Original line number Diff line number Diff line
@@ -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
};