summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jian-Syuan (Shane) Wong <shanewong@google.com> 2024-04-24 16:29:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-04-24 16:29:30 +0000
commit646de4ae4c68ed15efec6f69dcee43319426e37b (patch)
tree6c987f59c248589a2bd8aca1137425ba91d3dcfa
parentaa61184a74f69fbb615667b2b075f52c3ee2af67 (diff)
parent5621c36b8be809fc84bc4617362c5dc9ecf851f3 (diff)
Merge "Reduce votePreferredFrameRate calls in View and enable velocity mapping for ScrollView" into main
-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 3f078c869d4c..84cde0d99358 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -12714,7 +12714,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,