Merge "Update ALLM and Game type support on hotplug" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
85bde7b023
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user