diff options
| author | 2021-02-23 18:54:18 +0000 | |
|---|---|---|
| committer | 2021-02-23 18:54:18 +0000 | |
| commit | 85bde7b023342127bdd85a8eadcb7df0d83221c4 (patch) | |
| tree | 364d4d8263854078e2dc53dcacb6632d0231d43b | |
| parent | d549483e311e3d9765efc21be1524c1ebe96d9a2 (diff) | |
| parent | 1afe51de2f226cb964de9d95279502038316f3d6 (diff) | |
Merge "Update ALLM and Game type support on hotplug" into sc-dev
4 files changed, 103 insertions, 46 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 2bd32acc6c2c..0832578d80c5 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -191,9 +191,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); @@ -1750,6 +1747,9 @@ public final class SurfaceControl implements Parcelable { public Display.HdrCapabilities hdrCapabilities; + public boolean autoLowLatencyModeSupported; + public boolean gameContentTypeSupported; + @Override public String toString() { return "DynamicDisplayInfo{" @@ -1757,7 +1757,9 @@ public final class SurfaceControl implements Parcelable { + ", activeDisplayModeId=" + activeDisplayModeId + ", supportedColorModes=" + Arrays.toString(supportedColorModes) + ", activeColorMode=" + activeColorMode - + ", hdrCapabilities=" + hdrCapabilities + "}"; + + ", hdrCapabilities=" + hdrCapabilities + + ", autoLowLatencyModeSupported=" + autoLowLatencyModeSupported + + ", gameContentTypeSupported" + gameContentTypeSupported + "}"; } @Override @@ -2204,28 +2206,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 - */ @UnsupportedAppUsage public static IBinder createDisplay(String name, boolean secure) { if (name == null) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index d11ee3a875aa..cbf4481bd2f1 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -98,6 +98,8 @@ static struct { jfieldID supportedColorModes; jfieldID activeColorMode; jfieldID hdrCapabilities; + jfieldID autoLowLatencyModeSupported; + jfieldID gameContentTypeSupported; } gDynamicDisplayInfoClassInfo; static struct { @@ -1134,6 +1136,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; } @@ -1458,20 +1465,6 @@ static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj, transaction->reparent(ctrl, newParent); } -static jboolean nativeGetAutoLowLatencyModeSupport(JNIEnv* env, jclass clazz, jobject tokenObject) { - sp<IBinder> token(ibinderForJavaObject(env, tokenObject)); - if (token == NULL) return NULL; - - return SurfaceComposerClient::getAutoLowLatencyModeSupport(token); -} - -static jboolean nativeGetGameContentTypeSupport(JNIEnv* env, jclass clazz, jobject tokenObject) { - sp<IBinder> 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<IBinder> token(ibinderForJavaObject(env, tokenObject)); if (token == NULL) return; @@ -1821,12 +1814,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", @@ -1934,6 +1923,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 a4e2c7001b27..4bbf227f7033 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -228,8 +228,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; } @@ -250,6 +248,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; @@ -522,6 +522,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 @@ -437,6 +437,74 @@ public class LocalDisplayAdapterTest { } @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); final int[] initialColorModes = new int[]{Display.COLOR_MODE_BT709}; |