diff options
| author | 2024-04-19 04:26:51 +0000 | |
|---|---|---|
| committer | 2024-04-24 01:44:17 +0000 | |
| commit | 5621c36b8be809fc84bc4617362c5dc9ecf851f3 (patch) | |
| tree | 120171d8f6a1e4789f66bafc33f3b241116539f0 | |
| parent | 2bd7c3602d88ad9e34954dc64e3e9b0348383984 (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.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 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, |