Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5621c36b authored by Shane's avatar Shane
Browse files

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
parent 2bd7c360
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -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;
    }
+1 −0
Original line number Diff line number Diff line
@@ -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);
+23 −22
Original line number Diff line number Diff line
@@ -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,
+1 −1

File changed.

Contains only whitespace changes.