diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 23de215eeefc5..f642d7580d4d8 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -232,6 +232,7 @@ public final class SurfaceControl implements Parcelable { long nativeSurfaceControl); private static native void nativeRemoveJankDataListener(long nativeListener); private static native long nativeCreateJankDataListenerWrapper(OnJankDataListener listener); + private static native int nativeGetGPUContextPriority(); @Nullable @GuardedBy("mLock") @@ -2438,7 +2439,15 @@ public final class SurfaceControl implements Parcelable { nativeRemoveJankDataListener(listener.mNativePtr.get()); } - /** + /** + * Return GPU Context priority that is set in SurfaceFlinger's Render Engine. + * @hide + */ + public static int getGPUContextPriority() { + return nativeGetGPUContextPriority(); + } + + /** * An atomic set of changes to a set of SurfaceControl. */ public static class Transaction implements Closeable, Parcelable { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index a21545c21011b..a6dbd196566cf 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1679,6 +1679,10 @@ static jlong nativeCreateJankDataListenerWrapper(JNIEnv* env, jclass clazz, return reinterpret_cast(new JankDataListenerWrapper(env, jankDataListenerObject)); } +static jint nativeGetGPUContextPriority(JNIEnv* env, jclass clazz) { + return static_cast(SurfaceComposerClient::getGPUContextPriority()); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod sSurfaceControlMethods[] = { @@ -1869,6 +1873,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeRemoveJankDataListener }, {"nativeCreateJankDataListenerWrapper", "(Landroid/view/SurfaceControl$OnJankDataListener;)J", (void*)nativeCreateJankDataListenerWrapper }, + {"nativeGetGPUContextPriority", "()I", + (void*)nativeGetGPUContextPriority }, // clang-format on }; diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java index bf88a291843d9..ffd8a08905f03 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java @@ -23,6 +23,7 @@ import android.view.ThreadedRenderer; */ public class ThreadedRendererCompat { + public static int EGL_CONTEXT_PRIORITY_REALTIME_NV = 0x3357; public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101; public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102; public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103; diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index bf42a60ac0339..4827aa635e557 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -33,6 +33,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.util.TimingsTraceLog; +import android.view.SurfaceControl; import com.android.internal.protolog.common.ProtoLog; import com.android.systemui.dagger.ContextComponentHelper; @@ -41,6 +42,7 @@ import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dump.DumpManager; import com.android.systemui.people.PeopleSpaceActivity; import com.android.systemui.people.widget.PeopleSpaceWidgetProvider; +import com.android.systemui.shared.system.ThreadedRendererCompat; import com.android.systemui.util.NotificationChannels; import java.lang.reflect.Constructor; @@ -98,6 +100,18 @@ public class SystemUIApplication extends Application implements if (Process.myUserHandle().equals(UserHandle.SYSTEM)) { IntentFilter bootCompletedFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED); bootCompletedFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + + // If SF GPU context priority is set to realtime, then SysUI should run at high. + // The priority is defaulted at medium. + int sfPriority = SurfaceControl.getGPUContextPriority(); + Log.i(TAG, "Found SurfaceFlinger's GPU Priority: " + sfPriority); + if (sfPriority == ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_REALTIME_NV) { + Log.i(TAG, "Setting SysUI's GPU Context priority to: " + + ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG); + ThreadedRendererCompat.setContextPriority( + ThreadedRendererCompat.EGL_CONTEXT_PRIORITY_HIGH_IMG); + } + registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {