Loading core/java/android/view/SurfaceControl.java +18 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -4124,8 +4126,14 @@ 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.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, "EarlyWakeup", "setEarlyWakeupStart: called by " + info.trace + " with " + info.token, 0); return this; } Loading @@ -4135,8 +4143,12 @@ 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.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, "EarlyWakeup", 0); return this; } Loading core/java/android/view/SyncRtSurfaceTransactionApplier.java +13 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -135,10 +136,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); Loading Loading @@ -188,6 +189,7 @@ public class SyncRtSurfaceTransactionApplier { boolean visible; boolean opaque; Transaction mergeTransaction; EarlyWakeupInfo earlyWakeupInfo; /** * @param surface The surface to modify. Loading Loading @@ -282,7 +284,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; } Loading @@ -291,7 +294,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; } Loading @@ -312,14 +316,14 @@ public class SyncRtSurfaceTransactionApplier { public SurfaceParams build() { return new SurfaceParams(surface, flags, alpha, matrix, windowCrop, layer, cornerRadius, backgroundBlurRadius, visible, mergeTransaction, opaque); opaque, earlyWakeupInfo); } } private SurfaceParams(SurfaceControl surface, int params, float alpha, Matrix matrix, Rect windowCrop, int layer, float cornerRadius, int backgroundBlurRadius, boolean visible, Transaction mergeTransaction, boolean opaque) { Transaction mergeTransaction, boolean opaque, EarlyWakeupInfo earlyWakeupInfo) { this.flags = params; this.surface = surface; this.alpha = alpha; Loading @@ -331,6 +335,7 @@ public class SyncRtSurfaceTransactionApplier { this.visible = visible; this.mergeTransaction = mergeTransaction; this.opaque = opaque; this.earlyWakeupInfo = earlyWakeupInfo; } private final int flags; Loading Loading @@ -360,5 +365,7 @@ public class SyncRtSurfaceTransactionApplier { public final Transaction mergeTransaction; public final boolean opaque; public final EarlyWakeupInfo earlyWakeupInfo; } } core/java/android/window/SystemPerformanceHinter.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -166,6 +168,9 @@ public class SystemPerformanceHinter { private @Nullable PerformanceHintManager.Session mAdpfSession; private @Nullable DisplayRootProvider mDisplayRootProvider; /** Token for early wakeup requests to SurfaceFlinger. */ private EarlyWakeupInfo mEarlyWakeupInfo = new EarlyWakeupInfo(); /** * Constructor for the hinter. * @hide Loading @@ -186,6 +191,8 @@ public class SystemPerformanceHinter { mTransaction = transactionSupplier != null ? transactionSupplier.get() : new SurfaceControl.Transaction(); mEarlyWakeupInfo.token = new Binder(); mEarlyWakeupInfo.trace = SystemPerformanceHinter.class.getName(); } /** Loading Loading @@ -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); Loading Loading @@ -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); Loading core/jni/android_view_SurfaceControl.cpp +38 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -1176,8 +1204,8 @@ static void nativeSetBoxShadowSettings(JNIEnv* env, jclass clazz, jlong transact transaction->setBoxShadowSettings(ctrl, settings); } static void nativeSetBorderSettings(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject settingsObj) { static void nativeSetBorderSettings(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject settingsObj) { Parcel* settingsParcel = parcelForJavaObject(env, settingsObj); if (settingsParcel == NULL) { doThrowNPE(env); Loading Loading @@ -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 }, Loading core/tests/coretests/src/android/window/SystemPerformanceHinterTests.java +15 −13 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ 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.Binder; import android.os.PerformanceHintManager; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; Loading Loading @@ -190,7 +192,7 @@ public class SystemPerformanceHinterTests { assertEquals(0, mRootProvider.getCount); // Verify we call SF verify(mTransaction).setEarlyWakeupStart(); verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class)); verify(mTransaction).applyAsyncUnsafe(); } Loading @@ -202,7 +204,7 @@ public class SystemPerformanceHinterTests { session.close(); // Verify we call SF verify(mTransaction).setEarlyWakeupEnd(); verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class)); verify(mTransaction).applyAsyncUnsafe(); } Loading Loading @@ -249,7 +251,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)); } Loading @@ -270,7 +272,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)); } Loading @@ -291,7 +293,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)); } Loading @@ -310,7 +312,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); Loading @@ -321,7 +323,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()); Loading @@ -329,7 +331,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()); Loading @@ -342,7 +344,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)); } Loading @@ -361,7 +363,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); Loading @@ -377,7 +379,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); Loading @@ -400,7 +402,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); Loading @@ -418,7 +420,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 Loading
core/java/android/view/SurfaceControl.java +18 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -4124,8 +4126,14 @@ 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.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, "EarlyWakeup", "setEarlyWakeupStart: called by " + info.trace + " with " + info.token, 0); return this; } Loading @@ -4135,8 +4143,12 @@ 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.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, "EarlyWakeup", 0); return this; } Loading
core/java/android/view/SyncRtSurfaceTransactionApplier.java +13 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -135,10 +136,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); Loading Loading @@ -188,6 +189,7 @@ public class SyncRtSurfaceTransactionApplier { boolean visible; boolean opaque; Transaction mergeTransaction; EarlyWakeupInfo earlyWakeupInfo; /** * @param surface The surface to modify. Loading Loading @@ -282,7 +284,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; } Loading @@ -291,7 +294,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; } Loading @@ -312,14 +316,14 @@ public class SyncRtSurfaceTransactionApplier { public SurfaceParams build() { return new SurfaceParams(surface, flags, alpha, matrix, windowCrop, layer, cornerRadius, backgroundBlurRadius, visible, mergeTransaction, opaque); opaque, earlyWakeupInfo); } } private SurfaceParams(SurfaceControl surface, int params, float alpha, Matrix matrix, Rect windowCrop, int layer, float cornerRadius, int backgroundBlurRadius, boolean visible, Transaction mergeTransaction, boolean opaque) { Transaction mergeTransaction, boolean opaque, EarlyWakeupInfo earlyWakeupInfo) { this.flags = params; this.surface = surface; this.alpha = alpha; Loading @@ -331,6 +335,7 @@ public class SyncRtSurfaceTransactionApplier { this.visible = visible; this.mergeTransaction = mergeTransaction; this.opaque = opaque; this.earlyWakeupInfo = earlyWakeupInfo; } private final int flags; Loading Loading @@ -360,5 +365,7 @@ public class SyncRtSurfaceTransactionApplier { public final Transaction mergeTransaction; public final boolean opaque; public final EarlyWakeupInfo earlyWakeupInfo; } }
core/java/android/window/SystemPerformanceHinter.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -166,6 +168,9 @@ public class SystemPerformanceHinter { private @Nullable PerformanceHintManager.Session mAdpfSession; private @Nullable DisplayRootProvider mDisplayRootProvider; /** Token for early wakeup requests to SurfaceFlinger. */ private EarlyWakeupInfo mEarlyWakeupInfo = new EarlyWakeupInfo(); /** * Constructor for the hinter. * @hide Loading @@ -186,6 +191,8 @@ public class SystemPerformanceHinter { mTransaction = transactionSupplier != null ? transactionSupplier.get() : new SurfaceControl.Transaction(); mEarlyWakeupInfo.token = new Binder(); mEarlyWakeupInfo.trace = SystemPerformanceHinter.class.getName(); } /** Loading Loading @@ -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); Loading Loading @@ -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); Loading
core/jni/android_view_SurfaceControl.cpp +38 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -1176,8 +1204,8 @@ static void nativeSetBoxShadowSettings(JNIEnv* env, jclass clazz, jlong transact transaction->setBoxShadowSettings(ctrl, settings); } static void nativeSetBorderSettings(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject settingsObj) { static void nativeSetBorderSettings(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject settingsObj) { Parcel* settingsParcel = parcelForJavaObject(env, settingsObj); if (settingsParcel == NULL) { doThrowNPE(env); Loading Loading @@ -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 }, Loading
core/tests/coretests/src/android/window/SystemPerformanceHinterTests.java +15 −13 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ 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.Binder; import android.os.PerformanceHintManager; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; Loading Loading @@ -190,7 +192,7 @@ public class SystemPerformanceHinterTests { assertEquals(0, mRootProvider.getCount); // Verify we call SF verify(mTransaction).setEarlyWakeupStart(); verify(mTransaction).setEarlyWakeupStart(any(EarlyWakeupInfo.class)); verify(mTransaction).applyAsyncUnsafe(); } Loading @@ -202,7 +204,7 @@ public class SystemPerformanceHinterTests { session.close(); // Verify we call SF verify(mTransaction).setEarlyWakeupEnd(); verify(mTransaction).setEarlyWakeupEnd(any(EarlyWakeupInfo.class)); verify(mTransaction).applyAsyncUnsafe(); } Loading Loading @@ -249,7 +251,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)); } Loading @@ -270,7 +272,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)); } Loading @@ -291,7 +293,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)); } Loading @@ -310,7 +312,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); Loading @@ -321,7 +323,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()); Loading @@ -329,7 +331,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()); Loading @@ -342,7 +344,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)); } Loading @@ -361,7 +363,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); Loading @@ -377,7 +379,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); Loading @@ -400,7 +402,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); Loading @@ -418,7 +420,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