Loading core/java/android/view/SurfaceControl.java +6 −26 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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{" Loading @@ -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 Loading Loading @@ -2201,28 +2203,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 */ Loading core/jni/android_view_SurfaceControl.cpp +11 −18 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ static struct { jfieldID supportedColorModes; jfieldID activeColorMode; jfieldID hdrCapabilities; jfieldID autoLowLatencyModeSupported; jfieldID gameContentTypeSupported; } gDynamicDisplayInfoClassInfo; static struct { Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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", Loading Loading @@ -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); Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +18 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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) { Loading services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +68 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
core/java/android/view/SurfaceControl.java +6 −26 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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{" Loading @@ -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 Loading Loading @@ -2201,28 +2203,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 */ Loading
core/jni/android_view_SurfaceControl.cpp +11 −18 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ static struct { jfieldID supportedColorModes; jfieldID activeColorMode; jfieldID hdrCapabilities; jfieldID autoLowLatencyModeSupported; jfieldID gameContentTypeSupported; } gDynamicDisplayInfoClassInfo; static struct { Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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", Loading Loading @@ -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); Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +18 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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) { Loading
services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +68 −0 Original line number Diff line number Diff line Loading @@ -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); Loading