From 1afe51de2f226cb964de9d95279502038316f3d6 Mon Sep 17 00:00:00 2001 From: Marin Shalamanov Date: Tue, 16 Feb 2021 19:43:10 +0100 Subject: Update ALLM and Game type support on hotplug In this CL we move ALLM and game contnet type support to DynamicDisplayInfo and change LocalDisplayAdapter to update them on hotplug. Unit tests for this scenario are added. Bug: 180108954 Test: atest LocalDisplayAdapterTest Change-Id: Ida74d2782804f113fda784bdde00457ec3c80a2c --- core/java/android/view/SurfaceControl.java | 32 ++-------- core/jni/android_view_SurfaceControl.cpp | 29 ++++----- .../server/display/LocalDisplayAdapter.java | 20 ++++++- .../server/display/LocalDisplayAdapterTest.java | 68 ++++++++++++++++++++++ 4 files changed, 103 insertions(+), 46 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index b3787045e8b4..fa993fb464d7 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -188,9 +188,6 @@ public final class SurfaceControl implements Parcelable { private static native void nativeReparent(long transactionObj, long nativeObject, long newParentNativeObject); - private static native boolean nativeGetAutoLowLatencyModeSupport(IBinder displayToken); - private static native boolean nativeGetGameContentTypeSupport(IBinder displayToken); - private static native void nativeSetInputWindowInfo(long transactionObj, long nativeObject, InputWindowHandle handle); @@ -1747,6 +1744,9 @@ public final class SurfaceControl implements Parcelable { public Display.HdrCapabilities hdrCapabilities; + public boolean autoLowLatencyModeSupported; + public boolean gameContentTypeSupported; + @Override public String toString() { return "DynamicDisplayInfo{" @@ -1754,7 +1754,9 @@ public final class SurfaceControl implements Parcelable { + ", activeDisplayModeId=" + activeDisplayModeId + ", supportedColorModes=" + Arrays.toString(supportedColorModes) + ", activeColorMode=" + activeColorMode - + ", hdrCapabilities=" + hdrCapabilities + "}"; + + ", hdrCapabilities=" + hdrCapabilities + + ", autoLowLatencyModeSupported=" + autoLowLatencyModeSupported + + ", gameContentTypeSupported" + gameContentTypeSupported + "}"; } @Override @@ -2198,28 +2200,6 @@ public final class SurfaceControl implements Parcelable { } } - /** - * @hide - */ - public static boolean getAutoLowLatencyModeSupport(IBinder displayToken) { - if (displayToken == null) { - throw new IllegalArgumentException("displayToken must not be null"); - } - - return nativeGetAutoLowLatencyModeSupport(displayToken); - } - - /** - * @hide - */ - public static boolean getGameContentTypeSupport(IBinder displayToken) { - if (displayToken == null) { - throw new IllegalArgumentException("displayToken must not be null"); - } - - return nativeGetGameContentTypeSupport(displayToken); - } - /** * @hide */ diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index d8e9a637c9e4..3b74b1832b8a 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -97,6 +97,8 @@ static struct { jfieldID supportedColorModes; jfieldID activeColorMode; jfieldID hdrCapabilities; + jfieldID autoLowLatencyModeSupported; + jfieldID gameContentTypeSupported; } gDynamicDisplayInfoClassInfo; static struct { @@ -1116,6 +1118,11 @@ static jobject nativeGetDynamicDisplayInfo(JNIEnv* env, jclass clazz, jobject to env->SetObjectField(object, gDynamicDisplayInfoClassInfo.hdrCapabilities, convertDeviceProductInfoToJavaObject(env, info.hdrCapabilities)); + env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported, + info.autoLowLatencyModeSupported); + + env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.gameContentTypeSupported, + info.gameContentTypeSupported); return object; } @@ -1440,20 +1447,6 @@ static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj, transaction->reparent(ctrl, newParent); } -static jboolean nativeGetAutoLowLatencyModeSupport(JNIEnv* env, jclass clazz, jobject tokenObject) { - sp token(ibinderForJavaObject(env, tokenObject)); - if (token == NULL) return NULL; - - return SurfaceComposerClient::getAutoLowLatencyModeSupport(token); -} - -static jboolean nativeGetGameContentTypeSupport(JNIEnv* env, jclass clazz, jobject tokenObject) { - sp token(ibinderForJavaObject(env, tokenObject)); - if (token == NULL) return NULL; - - return SurfaceComposerClient::getGameContentTypeSupport(token); -} - static void nativeSetAutoLowLatencyMode(JNIEnv* env, jclass clazz, jobject tokenObject, jboolean on) { sp token(ibinderForJavaObject(env, tokenObject)); if (token == NULL) return; @@ -1801,12 +1794,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeGetDisplayNativePrimaries }, {"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z", (void*)nativeSetActiveColorMode}, - {"nativeGetAutoLowLatencyModeSupport", "(Landroid/os/IBinder;)Z", - (void*)nativeGetAutoLowLatencyModeSupport }, {"nativeSetAutoLowLatencyMode", "(Landroid/os/IBinder;Z)V", (void*)nativeSetAutoLowLatencyMode }, - {"nativeGetGameContentTypeSupport", "(Landroid/os/IBinder;)Z", - (void*)nativeGetGameContentTypeSupport }, {"nativeSetGameContentType", "(Landroid/os/IBinder;Z)V", (void*)nativeSetGameContentType }, {"nativeGetCompositionDataspaces", "()[I", @@ -1914,6 +1903,10 @@ int register_android_view_SurfaceControl(JNIEnv* env) gDynamicDisplayInfoClassInfo.hdrCapabilities = GetFieldIDOrDie(env, dynamicInfoClazz, "hdrCapabilities", "Landroid/view/Display$HdrCapabilities;"); + gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported = + GetFieldIDOrDie(env, dynamicInfoClazz, "autoLowLatencyModeSupported", "Z"); + gDynamicDisplayInfoClassInfo.gameContentTypeSupported = + GetFieldIDOrDie(env, dynamicInfoClazz, "gameContentTypeSupported", "Z"); jclass modeClazz = FindClassOrDie(env, "android/view/SurfaceControl$DisplayMode"); gDisplayModeClassInfo.clazz = MakeGlobalRefOrDie(env, modeClazz); diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index ed010441ceb7..fe4c9057c583 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -229,8 +229,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { mSidekickInternal = LocalServices.getService(SidekickInternal.class); mBacklightAdapter = new BacklightAdapter(displayToken, isDefaultDisplay, mSurfaceControlProxy); - mAllmSupported = SurfaceControl.getAutoLowLatencyModeSupport(displayToken); - mGameContentTypeSupported = SurfaceControl.getGameContentTypeSupport(displayToken); mDisplayDeviceConfig = null; // Defer configuration file loading BackgroundThread.getHandler().sendMessage(PooledLambda.obtainMessage( @@ -254,6 +252,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { changed |= updateColorModesLocked(dynamicInfo.supportedColorModes, dynamicInfo.activeColorMode); changed |= updateHdrCapabilitiesLocked(dynamicInfo.hdrCapabilities); + changed |= updateAllmSupport(dynamicInfo.autoLowLatencyModeSupported); + changed |= updateGameContentTypeSupport(dynamicInfo.gameContentTypeSupported); if (changed) { mHavePendingChanges = true; @@ -523,6 +523,22 @@ final class LocalDisplayAdapter extends DisplayAdapter { return true; } + private boolean updateAllmSupport(boolean supported) { + if (mAllmSupported == supported) { + return false; + } + mAllmSupported = supported; + return true; + } + + private boolean updateGameContentTypeSupport(boolean supported) { + if (mGameContentTypeSupported == supported) { + return false; + } + mGameContentTypeSupported = supported; + return true; + } + private SurfaceControl.DisplayMode getModeById(SurfaceControl.DisplayMode[] supportedModes, int modeId) { for (SurfaceControl.DisplayMode mode : supportedModes) { diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index d6d1c466c92f..728b97cc3968 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -436,6 +436,74 @@ public class LocalDisplayAdapterTest { assertThat(displayDeviceInfo.hdrCapabilities).isEqualTo(changedHdrCapabilities); } + @Test + public void testAfterDisplayChange_AllmSupportIsUpdated() throws Exception { + FakeDisplay display = new FakeDisplay(PORT_A); + display.dynamicInfo.autoLowLatencyModeSupported = true; + setUpDisplay(display); + updateAvailableDisplays(); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays).isEmpty(); + + DisplayDeviceInfo displayDeviceInfo = mListener.addedDisplays.get(0) + .getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.allmSupported).isTrue(); + + // Change the display + display.dynamicInfo.autoLowLatencyModeSupported = false; + setUpDisplay(display); + mInjector.getTransmitter().sendHotplug(display, /* connected */ true); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertTrue(mListener.traversalRequested); + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays.size()).isEqualTo(1); + + DisplayDevice displayDevice = mListener.changedDisplays.get(0); + displayDevice.applyPendingDisplayDeviceInfoChangesLocked(); + displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.allmSupported).isFalse(); + } + + @Test + public void testAfterDisplayChange_GameContentTypeSupportIsUpdated() throws Exception { + FakeDisplay display = new FakeDisplay(PORT_A); + display.dynamicInfo.gameContentTypeSupported = true; + setUpDisplay(display); + updateAvailableDisplays(); + mAdapter.registerLocked(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays).isEmpty(); + + DisplayDeviceInfo displayDeviceInfo = mListener.addedDisplays.get(0) + .getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.gameContentTypeSupported).isTrue(); + + // Change the display + display.dynamicInfo.gameContentTypeSupported = false; + setUpDisplay(display); + mInjector.getTransmitter().sendHotplug(display, /* connected */ true); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + assertTrue(mListener.traversalRequested); + assertThat(mListener.addedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays.size()).isEqualTo(1); + + DisplayDevice displayDevice = mListener.changedDisplays.get(0); + displayDevice.applyPendingDisplayDeviceInfoChangesLocked(); + displayDeviceInfo = displayDevice.getDisplayDeviceInfoLocked(); + + assertThat(displayDeviceInfo.gameContentTypeSupported).isFalse(); + } + @Test public void testAfterDisplayChange_ColorModesAreUpdated() throws Exception { FakeDisplay display = new FakeDisplay(PORT_A); -- cgit v1.2.3-59-g8ed1b