Merge "Update ALLM and Game type support on hotplug" into sc-dev

This commit is contained in:
Marin Shalamanov
2021-02-23 18:54:18 +00:00
committed by Android (Google) Code Review
4 changed files with 103 additions and 46 deletions

View File

@@ -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
@@ -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
*/

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);