From c66a2ac732053f0e197174133cab2b282932a671 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Wed, 29 Dec 2021 11:21:39 -0500 Subject: [PATCH] DisplayManager: Add an API to query for DISPLAY_DECORATON Tunnel through SurfaceControl to determine whether the HWC has this capability. This allows clients (i.e. SystemUI) to know whether they can use Composition.DISPLAY_DECORATON. If so, they may want to render differently (i.e. in A8). See Ib948c38ee189877eda675a6342cb70099f66122b for an example. Bug: 193170859 Test: manual Test: TODO Change-Id: I9904452b6408199bb1f86de9e21132e4d4444e1a --- .../hardware/display/DisplayManager.java | 11 +++++++++++ .../hardware/display/DisplayManagerGlobal.java | 15 +++++++++++++++ .../hardware/display/IDisplayManager.aidl | 3 +++ core/java/android/view/SurfaceControl.java | 15 +++++++++++++++ core/jni/android_view_SurfaceControl.cpp | 11 +++++++++++ .../server/display/DisplayManagerService.java | 18 ++++++++++++++++++ 6 files changed, 73 insertions(+) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 00374644d72c1..de5c9adbc599a 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -1205,6 +1205,17 @@ public final class DisplayManager { mGlobal.setRefreshRateSwitchingType(newValue); } + /** + * Returns whether the specified display supports DISPLAY_DECORATION. + * + * @param displayId The display to query support. + * + * @hide + */ + public boolean getDisplayDecorationSupport(int displayId) { + return mGlobal.getDisplayDecorationSupport(displayId); + } + /** * Returns the user preference for "Match content frame rate". *

diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index 01833fda5b95f..888108740aac0 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -811,6 +811,21 @@ public final class DisplayManagerGlobal { } } + /** + * Report whether the display supports DISPLAY_DECORATION. + * + * @param displayId The display whose support is being queried. + * + * @hide + */ + public boolean getDisplayDecorationSupport(int displayId) { + try { + return mDm.getDisplayDecorationSupport(displayId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + /** * Gets the brightness of the display. * diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index 82b31d48d5feb..d38d388ca8a30 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -180,4 +180,7 @@ interface IDisplayManager { // Returns the refresh rate switching type. int getRefreshRateSwitchingType(); + + // Query for DISPLAY_DECORATION support. + boolean getDisplayDecorationSupport(int displayId); } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index ab33feae7c567..b7f9be70f7ce2 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -231,6 +231,7 @@ public final class SurfaceControl implements Parcelable { float shadowRadius); private static native void nativeSetGlobalShadowSettings(@Size(4) float[] ambientColor, @Size(4) float[] spotColor, float lightPosY, float lightPosZ, float lightRadius); + private static native boolean nativeGetDisplayDecorationSupport(IBinder displayToken); private static native void nativeSetFrameRate(long transactionObj, long nativeObject, float frameRate, int compatibility, int changeFrameRateStrategy); @@ -2650,6 +2651,20 @@ public final class SurfaceControl implements Parcelable { nativeSetGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius); } + /** + * Returns whether a display supports DISPLAY_DECORATION. + * + * @param displayToken + * The token for the display. + * + * @return Whether the display supports DISPLAY_DECORATION. + * + * @hide + */ + public static boolean getDisplayDecorationSupport(IBinder displayToken) { + return nativeGetDisplayDecorationSupport(displayToken); + } + /** * Adds a callback to be informed about SF's jank classification for a specific surface. * @hide diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 67d0c52960e02..dd5af0435accb 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -1768,6 +1768,15 @@ static void nativeSetGlobalShadowSettings(JNIEnv* env, jclass clazz, jfloatArray client->setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius); } +static jboolean nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz, + jobject displayTokenObject) { + sp displayToken(ibinderForJavaObject(env, displayTokenObject)); + if (displayToken == nullptr) { + return JNI_FALSE; + } + return static_cast(SurfaceComposerClient::getDisplayDecorationSupport(displayToken)); +} + static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) { SurfaceControl *surfaceControl = reinterpret_cast(nativeObject); return reinterpret_cast(surfaceControl->getHandle().get()); @@ -2092,6 +2101,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeMirrorSurface }, {"nativeSetGlobalShadowSettings", "([F[FFFF)V", (void*)nativeSetGlobalShadowSettings }, + {"nativeGetDisplayDecorationSupport", "(Landroid/os/IBinder;)Z", + (void*)nativeGetDisplayDecorationSupport}, {"nativeGetHandle", "(J)J", (void*)nativeGetHandle }, {"nativeSetFixedTransformHint", "(JJI)V", diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index c0a6abf3a121a..9bc3d101eec97 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1782,6 +1782,14 @@ public final class DisplayManagerService extends SystemService { return mDisplayModeDirector.getModeSwitchingType(); } + private boolean getDisplayDecorationSupportInternal(int displayId) { + final IBinder displayToken = getDisplayToken(displayId); + if (null == displayToken) { + return false; + } + return SurfaceControl.getDisplayDecorationSupport(displayToken); + } + private void setBrightnessConfigurationForDisplayInternal( @Nullable BrightnessConfiguration c, String uniqueId, @UserIdInt int userId, String packageName) { @@ -3442,6 +3450,16 @@ public final class DisplayManagerService extends SystemService { Binder.restoreCallingIdentity(token); } } + + @Override // Binder call + public boolean getDisplayDecorationSupport(int displayId) { + final long token = Binder.clearCallingIdentity(); + try { + return getDisplayDecorationSupportInternal(displayId); + } finally { + Binder.restoreCallingIdentity(token); + } + } } private static boolean isValidBrightness(float brightness) {