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

Commit a2c79995 authored by Surbhi Kadam's avatar Surbhi Kadam
Browse files

Send early wakeup requests to SurfaceFlinger with token

Specifies a token to tie the early wakeup requests made from a client process.

Bug: 323292798
Bug: 409740673
Test: atest SurfaceFlinger_test
libsurfaceflinger_unittest libgui_test
Flag: EXEMPT log only; bugfix

Change-Id: Ia824347e2179f22275a0cbf289b3523c958765db
parent fab8de21
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import android.graphics.Region;
import android.gui.BorderSettings;
import android.gui.BoxShadowSettings;
import android.gui.DropInputMode;
import android.gui.EarlyWakeupInfo;
import android.gui.StalledTransactionInfo;
import android.gui.TrustedOverlay;
import android.hardware.DataSpace;
@@ -69,6 +70,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Trace;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
@@ -129,8 +131,8 @@ public final class SurfaceControl implements Parcelable {
            long otherTransactionObj);
    private static native void nativeClearTransaction(long transactionObj);
    private static native void nativeSetAnimationTransaction(long transactionObj);
    private static native void nativeSetEarlyWakeupStart(long transactionObj);
    private static native void nativeSetEarlyWakeupEnd(long transactionObj);
    private static native void nativeSetEarlyWakeupStart(long transactionObj, Parcel request);
    private static native void nativeSetEarlyWakeupEnd(long transactionObj, Parcel request);
    private static native long nativeGetTransactionId(long transactionObj);

    private static native void nativeSetLayer(long transactionObj, long nativeObject, int zorder);
@@ -4125,8 +4127,13 @@ public final class SurfaceControl implements Parcelable {
          * @hide
          */
        @RequiresPermission(Manifest.permission.WAKEUP_SURFACE_FLINGER)
        public Transaction setEarlyWakeupStart() {
            nativeSetEarlyWakeupStart(mNativeObject);
        public Transaction setEarlyWakeupStart(@NonNull EarlyWakeupInfo info) {
            Parcel infoParcel = Parcel.obtain();
            info.writeToParcel(infoParcel, 0);
            infoParcel.setDataPosition(0);
            nativeSetEarlyWakeupStart(mNativeObject, infoParcel);
            Trace.instantForTrack(Trace.TRACE_TAG_APP, "EarlyWakeup",
                    "setEarlyWakeupStart: called by " + info.trace + " with " + info.token);
            return this;
        }

@@ -4136,8 +4143,13 @@ public final class SurfaceControl implements Parcelable {
         * @hide
         */
        @RequiresPermission(Manifest.permission.WAKEUP_SURFACE_FLINGER)
        public Transaction setEarlyWakeupEnd() {
            nativeSetEarlyWakeupEnd(mNativeObject);
        public Transaction setEarlyWakeupEnd(@NonNull EarlyWakeupInfo info) {
            Parcel infoParcel = Parcel.obtain();
            info.writeToParcel(infoParcel, 0);
            infoParcel.setDataPosition(0);
            nativeSetEarlyWakeupEnd(mNativeObject, infoParcel);
            Trace.instantForTrack(Trace.TRACE_TAG_APP, "EarlyWakeup",
                    "setEarlyWakeupEnd: called by " + info.trace + " with " + info.token);
            return this;
        }

+13 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.view;
import android.annotation.SuppressLint;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.gui.EarlyWakeupInfo;
import android.view.SurfaceControl.Transaction;

import com.android.internal.annotations.VisibleForTesting;
@@ -139,10 +140,10 @@ public class SyncRtSurfaceTransactionApplier {
            }
        }
        if ((params.flags & FLAG_EARLY_WAKEUP_START) != 0) {
            t.setEarlyWakeupStart();
            t.setEarlyWakeupStart(params.earlyWakeupInfo);
        }
        if ((params.flags & FLAG_EARLY_WAKEUP_END) != 0) {
            t.setEarlyWakeupEnd();
            t.setEarlyWakeupEnd(params.earlyWakeupInfo);
        }
        if ((params.flags & FLAG_OPAQUE) != 0) {
            t.setOpaque(params.surface, params.opaque);
@@ -193,6 +194,7 @@ public class SyncRtSurfaceTransactionApplier {
            boolean visible;
            boolean opaque;
            Transaction mergeTransaction;
            EarlyWakeupInfo earlyWakeupInfo;

            /**
             * @param surface The surface to modify.
@@ -297,7 +299,8 @@ public class SyncRtSurfaceTransactionApplier {
             * wakes up earlier to compose surfaces.
             * @return this Builder
             */
            public Builder withEarlyWakeupStart() {
            public Builder withEarlyWakeupStart(EarlyWakeupInfo earlyWakeupInfo) {
                this.earlyWakeupInfo = earlyWakeupInfo;
                flags |= FLAG_EARLY_WAKEUP_START;
                return this;
            }
@@ -306,7 +309,8 @@ public class SyncRtSurfaceTransactionApplier {
             * Removes the early wake up hint set by earlyWakeupStart.
             * @return this Builder
             */
            public Builder withEarlyWakeupEnd() {
            public Builder withEarlyWakeupEnd(EarlyWakeupInfo earlyWakeupInfo) {
                this.earlyWakeupInfo = earlyWakeupInfo;
                flags |= FLAG_EARLY_WAKEUP_END;
                return this;
            }
@@ -327,15 +331,14 @@ public class SyncRtSurfaceTransactionApplier {
            public SurfaceParams build() {
                return new SurfaceParams(surface, flags, alpha, matrix, windowCrop, layer,
                        cornerRadius, backgroundBlurRadius, backgroundBlurScale, visible,
                        mergeTransaction, opaque);
                        mergeTransaction, opaque, earlyWakeupInfo);
            }
        }

        private SurfaceParams(SurfaceControl surface, int params, float alpha, Matrix matrix,
                Rect windowCrop, int layer, float cornerRadius,
                int backgroundBlurRadius, float backgroundBlurScale, boolean visible,
                Transaction mergeTransaction, boolean opaque) {

                Transaction mergeTransaction, boolean opaque, EarlyWakeupInfo earlyWakeupInfo) {
            this.flags = params;
            this.surface = surface;
            this.alpha = alpha;
@@ -348,6 +351,7 @@ public class SyncRtSurfaceTransactionApplier {
            this.visible = visible;
            this.mergeTransaction = mergeTransaction;
            this.opaque = opaque;
            this.earlyWakeupInfo = earlyWakeupInfo;
        }

        private final int flags;
@@ -380,5 +384,7 @@ public class SyncRtSurfaceTransactionApplier {

        public final Transaction mergeTransaction;
        public final boolean opaque;

        public final EarlyWakeupInfo earlyWakeupInfo;
    }
}
+9 −2
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.gui.EarlyWakeupInfo;
import android.os.Binder;
import android.os.PerformanceHintManager;
import android.os.Trace;
import android.util.Log;
@@ -166,6 +168,9 @@ public class SystemPerformanceHinter {
    private @Nullable PerformanceHintManager.Session mAdpfSession;
    private @Nullable DisplayRootProvider mDisplayRootProvider;

    /** Token for early wakeup requests to SurfaceFlinger. */
    private final EarlyWakeupInfo mEarlyWakeupInfo = new EarlyWakeupInfo();

    /**
     * Constructor for the hinter.
     * @hide
@@ -186,6 +191,8 @@ public class SystemPerformanceHinter {
        mTransaction = transactionSupplier != null
                ? transactionSupplier.get()
                : new SurfaceControl.Transaction();
        mEarlyWakeupInfo.token = new Binder();
        mEarlyWakeupInfo.trace = SystemPerformanceHinter.class.getName();
    }

    /**
@@ -265,7 +272,7 @@ public class SystemPerformanceHinter {

        // Global flags
        if (nowEnabled(oldGlobalFlags, newGlobalFlags, HINT_SF_EARLY_WAKEUP)) {
            mTransaction.setEarlyWakeupStart();
            mTransaction.setEarlyWakeupStart(mEarlyWakeupInfo);
            transactionChanged = true;
            if (isTraceEnabled) {
                asyncTraceBegin(HINT_SF_EARLY_WAKEUP, Display.INVALID_DISPLAY);
@@ -315,7 +322,7 @@ public class SystemPerformanceHinter {

        // Global flags
        if (nowDisabled(oldGlobalFlags, newGlobalFlags, HINT_SF_EARLY_WAKEUP)) {
            mTransaction.setEarlyWakeupEnd();
            mTransaction.setEarlyWakeupEnd(mEarlyWakeupInfo);
            transactionChanged = true;
            if (isTraceEnabled) {
                asyncTraceEnd(HINT_SF_EARLY_WAKEUP);
+36 −8
Original line number Diff line number Diff line
@@ -579,14 +579,42 @@ static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz, jlong trans
    transaction->setAnimationTransaction();
}

static void nativeSetEarlyWakeupStart(JNIEnv* env, jclass clazz, jlong transactionObj) {
static void nativeSetEarlyWakeupStart(JNIEnv* env, jclass clazz, jlong transactionObj,
                                      jobject infoObj) {
    Parcel* infoParcel = parcelForJavaObject(env, infoObj);
    if (infoParcel == NULL) {
        doThrowNPE(env);
        return;
    }
    gui::EarlyWakeupInfo earlyWakeupInfo;
    status_t err = earlyWakeupInfo.readFromParcel(infoParcel);
    if (err != NO_ERROR) {
        jniThrowException(env, "java/lang/IllegalArgumentException",
                          "EarlyWakeupInfo parcel has wrong format");
        return;
    }

    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
    transaction->setEarlyWakeupStart();
    transaction->setEarlyWakeupStart(earlyWakeupInfo);
}

static void nativeSetEarlyWakeupEnd(JNIEnv* env, jclass clazz, jlong transactionObj,
                                    jobject infoObj) {
    Parcel* infoParcel = parcelForJavaObject(env, infoObj);
    if (infoParcel == NULL) {
        doThrowNPE(env);
        return;
    }
    gui::EarlyWakeupInfo earlyWakeupInfo;
    status_t err = earlyWakeupInfo.readFromParcel(infoParcel);
    if (err != NO_ERROR) {
        jniThrowException(env, "java/lang/IllegalArgumentException",
                          "EarlyWakeupInfo parcel has wrong format");
        return;
    }

static void nativeSetEarlyWakeupEnd(JNIEnv* env, jclass clazz, jlong transactionObj) {
    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
    transaction->setEarlyWakeupEnd();
    transaction->setEarlyWakeupEnd(earlyWakeupInfo);
}

static jlong nativeGetTransactionId(JNIEnv* env, jclass clazz, jlong transactionObj) {
@@ -2571,9 +2599,9 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
            (void*)nativeMergeTransaction },
    {"nativeSetAnimationTransaction", "(J)V",
            (void*)nativeSetAnimationTransaction },
    {"nativeSetEarlyWakeupStart", "(J)V",
    {"nativeSetEarlyWakeupStart", "(JLandroid/os/Parcel;)V",
                (void*)nativeSetEarlyWakeupStart },
    {"nativeSetEarlyWakeupEnd", "(J)V",
    {"nativeSetEarlyWakeupEnd", "(JLandroid/os/Parcel;)V",
                (void*)nativeSetEarlyWakeupEnd },
    {"nativeGetTransactionId", "(J)J",
                (void*)nativeGetTransactionId },
+14 −13
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;

import android.gui.EarlyWakeupInfo;
import android.os.PerformanceHintManager;
import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
@@ -190,7 +191,7 @@ public class SystemPerformanceHinterTests {
        assertEquals(0, mRootProvider.getCount);

        // Verify we call SF
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
    }

@@ -202,7 +203,7 @@ public class SystemPerformanceHinterTests {
        session.close();

        // Verify we call SF
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
    }

@@ -249,7 +250,7 @@ public class SystemPerformanceHinterTests {
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH),
                eq(false));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
    }
@@ -270,7 +271,7 @@ public class SystemPerformanceHinterTests {
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT),
                eq(false));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }
@@ -291,7 +292,7 @@ public class SystemPerformanceHinterTests {
                    eq(mDefaultDisplayRoot),
                    eq(FRAME_RATE_CATEGORY_DEFAULT),
                    eq(false));
            verify(mTransaction).setEarlyWakeupEnd();
            verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
            verify(mTransaction).applyAsyncUnsafe();
            verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
        }
@@ -310,7 +311,7 @@ public class SystemPerformanceHinterTests {
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH),
                eq(false));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
        reset(mTransaction);
@@ -321,7 +322,7 @@ public class SystemPerformanceHinterTests {
        // Verify we never call SF and perf manager since session1 is already running
        verify(mTransaction, never()).setFrameRateSelectionStrategy(any(), anyInt());
        verify(mTransaction, never()).setFrameRateCategory(any(), anyInt(), anyBoolean());
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction, never()).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction, never()).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());

@@ -329,7 +330,7 @@ public class SystemPerformanceHinterTests {
        // Verify we have not cleaned up because session1 is still running
        verify(mTransaction, never()).setFrameRateSelectionStrategy(any(), anyInt());
        verify(mTransaction, never()).setFrameRateCategory(any(), anyInt(), anyBoolean());
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction, never()).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction, never()).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());

@@ -342,7 +343,7 @@ public class SystemPerformanceHinterTests {
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT),
                eq(false));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }
@@ -361,7 +362,7 @@ public class SystemPerformanceHinterTests {
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH),
                eq(false));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
        reset(mTransaction);
@@ -377,7 +378,7 @@ public class SystemPerformanceHinterTests {
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH),
                eq(false));
        verify(mTransaction, never()).setEarlyWakeupStart();
        verify(mTransaction, never()).setEarlyWakeupStart(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());
        reset(mTransaction);
@@ -400,7 +401,7 @@ public class SystemPerformanceHinterTests {
                eq(mSecondaryDisplayRoot),
                anyInt(),
                eq(false));
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction, never()).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());
        reset(mTransaction);
@@ -418,7 +419,7 @@ public class SystemPerformanceHinterTests {
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT),
                eq(false));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class));
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }
Loading