From 3e7b0969ab06258b986b71d80700d9777700277c Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Fri, 10 Dec 2021 02:47:26 +0000 Subject: 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 --- .../core/java/com/android/server/wm/RefreshRatePolicy.java | 14 +++++++++++++- .../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); -- cgit v1.2.3-59-g8ed1b