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

Commit bc1f004b authored by Surbhi Kadam's avatar Surbhi Kadam Committed by Android (Google) Code Review
Browse files

Merge "Send early wakeup requests to SurfaceFlinger with token" into main

parents e9d11d05 a2c79995
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);
@@ -4139,8 +4141,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;
        }

@@ -4150,8 +4157,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