diff options
| author | 2024-04-24 16:29:30 +0000 | |
|---|---|---|
| committer | 2024-04-24 16:29:30 +0000 | |
| commit | 646de4ae4c68ed15efec6f69dcee43319426e37b (patch) | |
| tree | 6c987f59c248589a2bd8aca1137425ba91d3dcfa | |
| parent | aa61184a74f69fbb615667b2b075f52c3ee2af67 (diff) | |
| parent | 5621c36b8be809fc84bc4617362c5dc9ecf851f3 (diff) | |
Merge "Reduce votePreferredFrameRate calls in View and enable velocity mapping for ScrollView" into main
| -rw-r--r-- | core/java/android/view/View.java | 34 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 2 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewFrameRateTest.java | 1 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/ViewRootImplTest.java | 45 |
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, |