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

Commit 49ccf2c7 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Specify max framerate when hinting surfaceflinger

Bug: 300019131
Test: atest SystemPerformanceHinterTests
Change-Id: Ib82af6977a526c23836e77f330985036afd6cfa7
parent b37f31dd
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.window;

import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.Surface.FRAME_RATE_CATEGORY_DEFAULT;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.SurfaceControl.FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN;
import static android.view.SurfaceControl.FRAME_RATE_SELECTION_STRATEGY_SELF;

@@ -29,8 +31,6 @@ import android.os.Trace;
import android.util.Log;
import android.view.SurfaceControl;

import com.android.internal.annotations.VisibleForTesting;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Random;
@@ -148,7 +148,6 @@ public class SystemPerformanceHinter {
     * Constructor for the hinter.
     * @hide
     */
    @VisibleForTesting
    public SystemPerformanceHinter(@NonNull Context context,
            @Nullable DisplayRootProvider displayRootProvider,
            @Nullable Supplier<SurfaceControl.Transaction> transactionSupplier) {
@@ -208,11 +207,14 @@ public class SystemPerformanceHinter {
        boolean transactionChanged = false;
        // Per-display flags
        if (nowEnabled(oldPerDisplayFlags, newPerDisplayFlags, HINT_SF_FRAME_RATE)) {
            mTransaction.setFrameRateSelectionStrategy(
                    mDisplayRootProvider.getRootForDisplay(session.displayId),
            SurfaceControl displaySurfaceControl = mDisplayRootProvider.getRootForDisplay(
                    session.displayId);
            mTransaction.setFrameRateSelectionStrategy(displaySurfaceControl,
                    FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN);
            mTransaction.setFrameRateCategory(displaySurfaceControl, FRAME_RATE_CATEGORY_HIGH);
            transactionChanged = true;
            Trace.beginAsyncSection("PerfHint-framerate-" + session.reason, session.traceCookie);
            Trace.beginAsyncSection("PerfHint-framerate-" + session.displayId + "-"
                    + session.reason, session.traceCookie);
        }

        // Global flags
@@ -226,7 +228,7 @@ public class SystemPerformanceHinter {
            Trace.beginAsyncSection("PerfHint-adpf-" + session.reason, session.traceCookie);
        }
        if (transactionChanged) {
            mTransaction.apply();
            mTransaction.applyAsyncUnsafe();
        }
    }

@@ -245,9 +247,11 @@ public class SystemPerformanceHinter {
        boolean transactionChanged = false;
        // Per-display flags
        if (nowDisabled(oldPerDisplayFlags, newPerDisplayFlags, HINT_SF_FRAME_RATE)) {
            mTransaction.setFrameRateSelectionStrategy(
                    mDisplayRootProvider.getRootForDisplay(session.displayId),
            SurfaceControl displaySurfaceControl = mDisplayRootProvider.getRootForDisplay(
                    session.displayId);
            mTransaction.setFrameRateSelectionStrategy(displaySurfaceControl,
                    FRAME_RATE_SELECTION_STRATEGY_SELF);
            mTransaction.setFrameRateCategory(displaySurfaceControl, FRAME_RATE_CATEGORY_DEFAULT);
            transactionChanged = true;
            Trace.endAsyncSection("PerfHint-framerate-" + session.reason, session.traceCookie);
        }
@@ -263,7 +267,7 @@ public class SystemPerformanceHinter {
            Trace.endAsyncSection("PerfHint-adpf-" + session.reason, session.traceCookie);
        }
        if (transactionChanged) {
            mTransaction.apply();
            mTransaction.applyAsyncUnsafe();
        }
    }

+55 −15
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.window;

import static android.os.PerformanceHintManager.Session.CPU_LOAD_RESET;
import static android.os.PerformanceHintManager.Session.CPU_LOAD_UP;
import static android.view.Surface.FRAME_RATE_CATEGORY_DEFAULT;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.SurfaceControl.FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN;
import static android.view.SurfaceControl.FRAME_RATE_SELECTION_STRATEGY_SELF;
import static android.window.SystemPerformanceHinter.HINT_ADPF;
@@ -150,7 +152,10 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN));
        verify(mTransaction).apply();
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH));
        verify(mTransaction).applyAsyncUnsafe();
    }

    @Test
@@ -164,7 +169,10 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
        verify(mTransaction).apply();
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT));
        verify(mTransaction).applyAsyncUnsafe();
    }

    @Test
@@ -177,7 +185,7 @@ public class SystemPerformanceHinterTests {

        // Verify we call SF
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
    }

    @Test
@@ -189,7 +197,7 @@ public class SystemPerformanceHinterTests {

        // Verify we call SF
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
    }

    @Test
@@ -231,8 +239,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
    }

@@ -248,8 +259,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }

@@ -265,8 +279,11 @@ public class SystemPerformanceHinterTests {
            verify(mTransaction).setFrameRateSelectionStrategy(
                    eq(mDefaultDisplayRoot),
                    eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
            verify(mTransaction).setFrameRateCategory(
                    eq(mDefaultDisplayRoot),
                    eq(FRAME_RATE_CATEGORY_DEFAULT));
            verify(mTransaction).setEarlyWakeupEnd();
            verify(mTransaction).apply();
            verify(mTransaction).applyAsyncUnsafe();
            verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
        }
    }
@@ -280,8 +297,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
        reset(mTransaction);
        reset(mAdpfSession);
@@ -290,15 +310,17 @@ public class SystemPerformanceHinterTests {
                mHinter.startSession(HINT_ALL, DEFAULT_DISPLAY_ID, TEST_OTHER_REASON);
        // Verify we never call SF and perf manager since session1 is already running
        verify(mTransaction, never()).setFrameRateSelectionStrategy(any(), anyInt());
        verify(mTransaction, never()).setFrameRateCategory(any(), anyInt());
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction, never()).apply();
        verify(mTransaction, never()).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());

        session2.close();
        // Verify we have not cleaned up because session1 is still running
        verify(mTransaction, never()).setFrameRateSelectionStrategy(any(), anyInt());
        verify(mTransaction, never()).setFrameRateCategory(any(), anyInt());
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction, never()).apply();
        verify(mTransaction, never()).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());

        session1.close();
@@ -306,8 +328,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }

@@ -321,8 +346,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH));
        verify(mTransaction).setEarlyWakeupStart();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_UP));
        reset(mTransaction);
        reset(mAdpfSession);
@@ -333,8 +361,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_OVERRIDE_CHILDREN));
        verify(mTransaction).setFrameRateCategory(
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_CATEGORY_HIGH));
        verify(mTransaction, never()).setEarlyWakeupStart();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());
        reset(mTransaction);
        reset(mAdpfSession);
@@ -345,11 +376,17 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
        verify(mTransaction).setFrameRateCategory(
                eq(mDefaultDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT));
        verify(mTransaction, never()).setFrameRateSelectionStrategy(
                eq(mSecondaryDisplayRoot),
                anyInt());
        verify(mTransaction, never()).setFrameRateCategory(
                eq(mSecondaryDisplayRoot),
                anyInt());
        verify(mTransaction, never()).setEarlyWakeupEnd();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession, never()).sendHint(anyInt());
        reset(mTransaction);
        reset(mAdpfSession);
@@ -362,8 +399,11 @@ public class SystemPerformanceHinterTests {
        verify(mTransaction).setFrameRateSelectionStrategy(
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_SELECTION_STRATEGY_SELF));
        verify(mTransaction).setFrameRateCategory(
                eq(mSecondaryDisplayRoot),
                eq(FRAME_RATE_CATEGORY_DEFAULT));
        verify(mTransaction).setEarlyWakeupEnd();
        verify(mTransaction).apply();
        verify(mTransaction).applyAsyncUnsafe();
        verify(mAdpfSession).sendHint(eq(CPU_LOAD_RESET));
    }