diff options
| author | 2021-12-10 02:47:26 +0000 | |
|---|---|---|
| committer | 2021-12-13 23:55:04 +0000 | |
| commit | 3e7b0969ab06258b986b71d80700d9777700277c (patch) | |
| tree | e6a113c202eb4ac383ffa6444f614e39e76e90aa | |
| parent | 40eb40302d0840a4637ddb264edcff84276e1a7b (diff) | |
RefreshRatePolicy: set both min and max refresh rate when camera is used
If app is using Camera, we set both the min and max refresh rate to the camera's
preferred refresh rate to make sure we don't end up with a refresh rate lower
than the camera capture rate, which will lead to dropping camera frames.
Bug: 206056272
Change-Id: I5b6c49242fb6b87d662d26a29b2f159c052d386c
Test: android.hardware.cts.CameraGLTest
| -rw-r--r-- | services/core/java/com/android/server/wm/RefreshRatePolicy.java | 14 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java | 12 |
2 files changed, 21 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java index b63843dd20d4..7bddb620c94d 100644 --- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java +++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java @@ -164,7 +164,19 @@ class RefreshRatePolicy { return 0; } - return w.mAttrs.preferredMinDisplayRefreshRate; + if (w.mAttrs.preferredMinDisplayRefreshRate > 0) { + return w.mAttrs.preferredMinDisplayRefreshRate; + } + + String packageName = w.getOwningPackage(); + // If app is using Camera, we set both the min and max refresh rate to the camera's + // preferred refresh rate to make sure we don't end up with a refresh rate lower + // than the camera capture rate, which will lead to dropping camera frames. + if (mNonHighRefreshRatePackages.contains(packageName)) { + return mLowRefreshRateMode.getRefreshRate(); + } + + return 0; } float getPreferredMaxRefreshRate(WindowState w) { diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java index c4cccf022322..19247604ad10 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java @@ -104,7 +104,8 @@ public class RefreshRatePolicyTest extends WindowTestsBase { mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); - assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); + assertEquals(LOW_REFRESH_RATE, + mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); mPolicy.removeNonHighRefreshRatePackage("com.android.test"); @@ -165,7 +166,8 @@ public class RefreshRatePolicyTest extends WindowTestsBase { assertEquals(HI_MODE_ID, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(HI_REFRESH_RATE, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); - assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); + assertEquals(LOW_REFRESH_RATE, + mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); } @@ -180,7 +182,8 @@ public class RefreshRatePolicyTest extends WindowTestsBase { assertEquals(0, mPolicy.getPreferredModeId(overrideWindow)); assertEquals(HI_REFRESH_RATE, mPolicy.getPreferredRefreshRate(overrideWindow), FLOAT_TOLERANCE); - assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); + assertEquals(LOW_REFRESH_RATE, + mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); } @@ -257,7 +260,8 @@ public class RefreshRatePolicyTest extends WindowTestsBase { mPolicy.addNonHighRefreshRatePackage("com.android.test"); assertEquals(0, mPolicy.getPreferredModeId(cameraUsingWindow)); assertEquals(0, mPolicy.getPreferredRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); - assertEquals(0, mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); + assertEquals(LOW_REFRESH_RATE, + mPolicy.getPreferredMinRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); assertEquals(LOW_REFRESH_RATE, mPolicy.getPreferredMaxRefreshRate(cameraUsingWindow), FLOAT_TOLERANCE); |