Merge "Avoid changing resolution by display mode when animating" into tm-qpr-dev
This commit is contained in:
@@ -2116,6 +2116,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
w.seamlesslyRotateIfAllowed(transaction, oldRotation, rotation, rotateSeamlessly);
|
w.seamlesslyRotateIfAllowed(transaction, oldRotation, rotation, rotateSeamlessly);
|
||||||
}, true /* traverseTopToBottom */);
|
}, true /* traverseTopToBottom */);
|
||||||
mPinnedTaskController.startSeamlessRotationIfNeeded(transaction, oldRotation, rotation);
|
mPinnedTaskController.startSeamlessRotationIfNeeded(transaction, oldRotation, rotation);
|
||||||
|
if (!mDisplayRotation.hasSeamlessRotatingWindow()) {
|
||||||
|
// Make sure DisplayRotation#isRotatingSeamlessly() will return false.
|
||||||
|
mDisplayRotation.cancelSeamlessRotation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mWmService.mDisplayManagerInternal.performTraversal(transaction);
|
mWmService.mDisplayManagerInternal.performTraversal(transaction);
|
||||||
@@ -4824,7 +4828,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
|||||||
mInsetsStateController.getImeSourceProvider().checkShowImePostLayout();
|
mInsetsStateController.getImeSourceProvider().checkShowImePostLayout();
|
||||||
|
|
||||||
mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent;
|
mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent;
|
||||||
if (!mWmService.mDisplayFrozen) {
|
if (!mWmService.mDisplayFrozen && !mDisplayRotation.isRotatingSeamlessly()) {
|
||||||
mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId,
|
mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId,
|
||||||
mLastHasContent,
|
mLastHasContent,
|
||||||
mTmpApplySurfaceChangesTransactionState.preferredRefreshRate,
|
mTmpApplySurfaceChangesTransactionState.preferredRefreshRate,
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ class RefreshRatePolicy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final DisplayInfo mDisplayInfo;
|
||||||
|
private final Mode mDefaultMode;
|
||||||
private final Mode mLowRefreshRateMode;
|
private final Mode mLowRefreshRateMode;
|
||||||
private final PackageRefreshRate mNonHighRefreshRatePackages = new PackageRefreshRate();
|
private final PackageRefreshRate mNonHighRefreshRatePackages = new PackageRefreshRate();
|
||||||
private final HighRefreshRateDenylist mHighRefreshRateDenylist;
|
private final HighRefreshRateDenylist mHighRefreshRateDenylist;
|
||||||
@@ -83,7 +85,9 @@ class RefreshRatePolicy {
|
|||||||
|
|
||||||
RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo,
|
RefreshRatePolicy(WindowManagerService wmService, DisplayInfo displayInfo,
|
||||||
HighRefreshRateDenylist denylist) {
|
HighRefreshRateDenylist denylist) {
|
||||||
mLowRefreshRateMode = findLowRefreshRateMode(displayInfo);
|
mDisplayInfo = displayInfo;
|
||||||
|
mDefaultMode = displayInfo.getDefaultMode();
|
||||||
|
mLowRefreshRateMode = findLowRefreshRateMode(displayInfo, mDefaultMode);
|
||||||
mHighRefreshRateDenylist = denylist;
|
mHighRefreshRateDenylist = denylist;
|
||||||
mWmService = wmService;
|
mWmService = wmService;
|
||||||
}
|
}
|
||||||
@@ -92,10 +96,9 @@ class RefreshRatePolicy {
|
|||||||
* Finds the mode id with the lowest refresh rate which is >= 60hz and same resolution as the
|
* Finds the mode id with the lowest refresh rate which is >= 60hz and same resolution as the
|
||||||
* default mode.
|
* default mode.
|
||||||
*/
|
*/
|
||||||
private Mode findLowRefreshRateMode(DisplayInfo displayInfo) {
|
private Mode findLowRefreshRateMode(DisplayInfo displayInfo, Mode defaultMode) {
|
||||||
Mode mode = displayInfo.getDefaultMode();
|
|
||||||
float[] refreshRates = displayInfo.getDefaultRefreshRates();
|
float[] refreshRates = displayInfo.getDefaultRefreshRates();
|
||||||
float bestRefreshRate = mode.getRefreshRate();
|
float bestRefreshRate = defaultMode.getRefreshRate();
|
||||||
mMinSupportedRefreshRate = bestRefreshRate;
|
mMinSupportedRefreshRate = bestRefreshRate;
|
||||||
mMaxSupportedRefreshRate = bestRefreshRate;
|
mMaxSupportedRefreshRate = bestRefreshRate;
|
||||||
for (int i = refreshRates.length - 1; i >= 0; i--) {
|
for (int i = refreshRates.length - 1; i >= 0; i--) {
|
||||||
@@ -121,13 +124,39 @@ class RefreshRatePolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getPreferredModeId(WindowState w) {
|
int getPreferredModeId(WindowState w) {
|
||||||
// If app is animating, it's not able to control refresh rate because we want the animation
|
final int preferredDisplayModeId = w.mAttrs.preferredDisplayModeId;
|
||||||
// to run in default refresh rate.
|
if (preferredDisplayModeId <= 0) {
|
||||||
if (w.isAnimating(TRANSITION | PARENTS)) {
|
// Unspecified, use default mode.
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.mAttrs.preferredDisplayModeId;
|
// If app is animating, it's not able to control refresh rate because we want the animation
|
||||||
|
// to run in default refresh rate. But if the display size of default mode is different
|
||||||
|
// from the using preferred mode, then still keep the preferred mode to avoid disturbing
|
||||||
|
// the animation.
|
||||||
|
if (w.isAnimating(TRANSITION | PARENTS)) {
|
||||||
|
Display.Mode preferredMode = null;
|
||||||
|
for (Display.Mode mode : mDisplayInfo.supportedModes) {
|
||||||
|
if (preferredDisplayModeId == mode.getModeId()) {
|
||||||
|
preferredMode = mode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (preferredMode != null) {
|
||||||
|
final int pW = preferredMode.getPhysicalWidth();
|
||||||
|
final int pH = preferredMode.getPhysicalHeight();
|
||||||
|
if ((pW != mDefaultMode.getPhysicalWidth()
|
||||||
|
|| pH != mDefaultMode.getPhysicalHeight())
|
||||||
|
&& pW == mDisplayInfo.getNaturalWidth()
|
||||||
|
&& pH == mDisplayInfo.getNaturalHeight()) {
|
||||||
|
// Prefer not to change display size when animating.
|
||||||
|
return preferredDisplayModeId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return preferredDisplayModeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -165,15 +194,12 @@ class RefreshRatePolicy {
|
|||||||
// of that mode id.
|
// of that mode id.
|
||||||
final int preferredModeId = w.mAttrs.preferredDisplayModeId;
|
final int preferredModeId = w.mAttrs.preferredDisplayModeId;
|
||||||
if (preferredModeId > 0) {
|
if (preferredModeId > 0) {
|
||||||
DisplayInfo info = w.getDisplayInfo();
|
for (Display.Mode mode : mDisplayInfo.supportedModes) {
|
||||||
if (info != null) {
|
|
||||||
for (Display.Mode mode : info.supportedModes) {
|
|
||||||
if (preferredModeId == mode.getModeId()) {
|
if (preferredModeId == mode.getModeId()) {
|
||||||
return mode.getRefreshRate();
|
return mode.getRefreshRate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (w.mAttrs.preferredRefreshRate > 0) {
|
if (w.mAttrs.preferredRefreshRate > 0) {
|
||||||
return w.mAttrs.preferredRefreshRate;
|
return w.mAttrs.preferredRefreshRate;
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
|
|||||||
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
@@ -258,6 +260,14 @@ public class RefreshRatePolicyTest extends WindowTestsBase {
|
|||||||
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
assertEquals(0, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
||||||
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
||||||
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE);
|
||||||
|
|
||||||
|
// If there will be display size change when switching from preferred mode to default mode,
|
||||||
|
// then keep the current preferred mode during animating.
|
||||||
|
mDisplayInfo = spy(mDisplayInfo);
|
||||||
|
final Mode defaultMode = new Mode(4321 /* width */, 1234 /* height */, LOW_REFRESH_RATE);
|
||||||
|
doReturn(defaultMode).when(mDisplayInfo).getDefaultMode();
|
||||||
|
mPolicy = new RefreshRatePolicy(mWm, mDisplayInfo, mDenylist);
|
||||||
|
assertEquals(LOW_MODE_ID, mPolicy.getPreferredModeId(overrideWindow));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user