summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shane <shanewong@google.com> 2024-04-19 04:26:51 +0000
committer Shane <shanewong@google.com> 2024-04-24 01:44:17 +0000
commit5621c36b8be809fc84bc4617362c5dc9ecf851f3 (patch)
tree120171d8f6a1e4789f66bafc33f3b241116539f0
parent2bd7c3602d88ad9e34954dc64e3e9b0348383984 (diff)
Reduce votePreferredFrameRate calls in View and enable velocity mapping for ScrollView
Reduce votePreferredFrameRate calls in View by changing where to make the calls in updateDisplayListIfDirty. Also, this change should enable velocity mapping for ScrollView. Bug: 334006209 Bug: 335324287 Test: atest ViewRootImplTest Change-Id: Iff194844aa16a02048cc39aa10c47542d973610f
-rw-r--r--core/java/android/view/View.java34
-rw-r--r--core/java/android/view/ViewRootImpl.java2
-rw-r--r--core/tests/coretests/src/android/view/ViewFrameRateTest.java1
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java45
4 files changed, 50 insertions, 32 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a355f552d6ff..2a1eb97e95bc 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -3809,6 +3809,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* 1 PFLAG4_IS_COUNTED_AS_SENSITIVE
* 1 PFLAG4_HAS_DRAWN
* 1 PFLAG4_HAS_MOVED
+ * 1 PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION
* |-------|-------|-------|-------|
*/
@@ -3954,6 +3955,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
private static final int PFLAG4_HAS_MOVED = 0x10000000;
+ /**
+ * Whether the invalidateViewProperty is involked at current frame.
+ */
+ private static final int PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION = 0x20000000;
+
/* End of masks for mPrivateFlags4 */
/** @hide */
@@ -20945,6 +20951,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
} else {
damageInParent();
}
+ mPrivateFlags4 |= PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION;
}
/**
@@ -23641,14 +23648,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
return renderNode;
}
- // For VRR to vote the preferred frame rate
- if (sToolkitSetFrameRateReadOnlyFlagValue
- && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
- votePreferredFrameRate();
- }
-
- mPrivateFlags4 = (mPrivateFlags4 & ~PFLAG4_HAS_MOVED) | PFLAG4_HAS_DRAWN;
-
if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
|| !renderNode.hasDisplayList()
|| (mRecreateDisplayList)) {
@@ -23691,6 +23690,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
+ // // For VRR to vote the preferred frame rate
+ if (sToolkitSetFrameRateReadOnlyFlagValue
+ && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+ votePreferredFrameRate();
+ }
+
+ mPrivateFlags4 |= PFLAG4_HAS_DRAWN;
+
// Fast path for layouts with no backgrounds
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
dispatchDraw(canvas);
@@ -23710,10 +23717,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
setDisplayListProperties(renderNode);
}
} else {
+ if ((mPrivateFlags4 & PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION)
+ == PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION) {
+ // For VRR to vote the preferred frame rate
+ if (sToolkitSetFrameRateReadOnlyFlagValue
+ && sToolkitFrameRateViewEnablingReadOnlyFlagValue) {
+ votePreferredFrameRate();
+ }
+ mPrivateFlags4 &= ~PFLAG4_HAS_VIEW_PROPERTY_INVALIDATION;
+ }
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
}
-
+ mPrivateFlags4 &= ~PFLAG4_HAS_MOVED;
mFrameContentVelocity = -1;
return renderNode;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e2ed2b8097f5..6b79efcd30f5 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -12707,7 +12707,7 @@ public final class ViewRootImpl implements ViewParent,
if (frameRateCategory > mPreferredFrameRateCategory) {
mPreferredFrameRateCategory = frameRateCategory;
mFrameRateCategoryChangeReason = reason;
-// mFrameRateCategoryView = view == null ? "-" : view.getClass().getSimpleName();
+ // mFrameRateCategoryView = view == null ? "-" : view.getClass().getSimpleName();
}
mHasInvalidation = true;
mDrawnThisFrame = true;
diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
index 0bf9a4cd47f6..4b9aaaed403b 100644
--- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java
+++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
@@ -419,6 +419,7 @@ public class ViewFrameRateTest {
FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY
})
public void frameRateAndCategory() throws Throwable {
+ mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
waitForFrameRateCategoryToSettle();
mActivityRule.runOnUiThread(() -> {
mMovingView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_LOW);
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index ccebd0336ea6..20fb6e3025ef 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -754,39 +754,39 @@ public class ViewRootImplTest {
@RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
FLAG_TOOLKIT_FRAME_RATE_VIEW_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_aggregate() {
- View mView1 = new View(sContext);
- attachViewToWindow(mView1);
- ViewRootImpl viewRootImpl = mView1.getViewRootImpl();
+ mView = new View(sContext);
+ attachViewToWindow(mView);
+ mViewRootImpl = mView.getViewRootImpl();
sInstrumentation.runOnMainSync(() -> {
assertEquals(FRAME_RATE_CATEGORY_DEFAULT,
- viewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.getPreferredFrameRateCategory());
});
// reset the frame rate category counts
for (int i = 0; i < 5; i++) {
sInstrumentation.runOnMainSync(() -> {
- mView1.setRequestedFrameRate(mView1.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
- mView1.invalidate();
+ mView.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE);
+ mView.invalidate();
});
sInstrumentation.waitForIdleSync();
}
sInstrumentation.runOnMainSync(() -> {
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_LOW, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_NORMAL, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_LOW, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_NORMAL, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
assertEquals(FRAME_RATE_CATEGORY_HIGH_HINT,
- viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
- viewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
- assertEquals(FRAME_RATE_CATEGORY_HIGH, viewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_HIGH_HINT, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_NORMAL, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
+ mViewRootImpl.votePreferredFrameRateCategory(FRAME_RATE_CATEGORY_LOW, 0, null);
+ assertEquals(FRAME_RATE_CATEGORY_HIGH, mViewRootImpl.getPreferredFrameRateCategory());
});
}
@@ -947,8 +947,9 @@ public class ViewRootImplTest {
mView.invalidate();
runAfterDraw(() -> {
if (toolkitFrameRateVelocityMappingReadOnly()) {
- assertEquals(FRAME_RATE_CATEGORY_LOW,
- mViewRootImpl.getLastPreferredFrameRateCategory());
+ int expected = toolkitFrameRateBySizeReadOnly()
+ ? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
+ assertEquals(expected, mViewRootImpl.getLastPreferredFrameRateCategory());
assertTrue(mViewRootImpl.getLastPreferredFrameRate() >= 60f);
} else {
assertEquals(FRAME_RATE_CATEGORY_HIGH,