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

Commit 9e8915c6 authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "Intoroducing RequestedRefreshRateVote" into main

parents db708ebb e5339e5c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2263,6 +2263,7 @@ public final class Display {
            this(modeId, width, height, refreshRate, vsyncRate, false, alternativeRefreshRates,
                    supportedHdrTypes);
        }

        /**
         * @hide
         */
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ public final class DisplayInfo implements Parcelable {

    /**
     * The supported modes that will be exposed externally.
     * Might have different set of modes that supportedModes for VRR displays
     * Might have different set of modes than supportedModes for VRR displays
     */
    public Display.Mode[] appsSupportedModes = Display.Mode.EMPTY_ARRAY;

+1 −1
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@ abstract class DisplayAdapter {
            float[] alternativeRefreshRates,
            @Display.HdrCapabilities.HdrType int[] supportedHdrTypes) {
        return new Display.Mode(NEXT_DISPLAY_MODE_ID.getAndIncrement(), width, height, refreshRate,
                vsyncRate, false, alternativeRefreshRates, supportedHdrTypes);
                vsyncRate, /* isSynthetic= */ false, alternativeRefreshRates, supportedHdrTypes);
    }

    public interface Listener {
+1 −1
Original line number Diff line number Diff line
@@ -353,7 +353,7 @@ public class DisplayManagerFlags {
    }

    /**
     * @return Whether to ignore preferredRefreshRate app request or not
     * @return Whether to ignore preferredRefreshRate app request conversion to display mode or not
     */
    public boolean ignoreAppPreferredRefreshRateRequest() {
        return mIgnoreAppPreferredRefreshRate.isEnabled();
+60 −96
Original line number Diff line number Diff line
@@ -1254,13 +1254,9 @@ public class DisplayModeDirector {
     *  Responsible for keeping track of app requested refresh rates per display
     */
    public final class AppRequestObserver {
        private final SparseArray<Display.Mode> mAppRequestedModeByDisplay;
        private final SparseArray<RefreshRateRange> mAppPreferredRefreshRateRangeByDisplay;
        private final boolean mIgnorePreferredRefreshRate;

        AppRequestObserver(DisplayManagerFlags flags) {
            mAppRequestedModeByDisplay = new SparseArray<>();
            mAppPreferredRefreshRateRangeByDisplay = new SparseArray<>();
            mIgnorePreferredRefreshRate = flags.ignoreAppPreferredRefreshRateRequest();
        }

@@ -1269,104 +1265,84 @@ public class DisplayModeDirector {
         */
        public void setAppRequest(int displayId, int modeId, float requestedRefreshRate,
                float requestedMinRefreshRateRange, float requestedMaxRefreshRateRange) {

            if (modeId == 0 && requestedRefreshRate != 0 && !mIgnorePreferredRefreshRate) {
                // Scan supported modes returned to find a mode with the same
                // size as the default display mode but with the specified refresh rate instead.
                Display.Mode mode = findDefaultModeByRefreshRate(displayId, requestedRefreshRate);
                if (mode != null) {
                    modeId = mode.getModeId();
                } else {
                    Slog.e(TAG, "Couldn't find a mode for the requestedRefreshRate: "
                            + requestedRefreshRate + " on Display: " + displayId);
                }
            }

            Display.Mode requestedMode;
            synchronized (mLock) {
                setAppRequestedModeLocked(displayId, modeId);
                setAppPreferredRefreshRateRangeLocked(displayId, requestedMinRefreshRateRange,
                        requestedMaxRefreshRateRange);
            }
                requestedMode = findModeLocked(displayId, modeId, requestedRefreshRate);
            }

        @Nullable
        private Display.Mode findDefaultModeByRefreshRate(int displayId, float refreshRate) {
            Display.Mode[] modes;
            Display.Mode defaultMode;
            synchronized (mLock) {
                modes = mAppSupportedModesByDisplay.get(displayId);
                defaultMode = mDefaultModeByDisplay.get(displayId);
            }
            for (int i = 0; i < modes.length; i++) {
                if (modes[i].matches(defaultMode.getPhysicalWidth(),
                        defaultMode.getPhysicalHeight(), refreshRate)) {
                    return modes[i];
                }
            }
            return null;
        }

        private void setAppRequestedModeLocked(int displayId, int modeId) {
            final Display.Mode requestedMode = findAppModeByIdLocked(displayId, modeId);
            if (Objects.equals(requestedMode, mAppRequestedModeByDisplay.get(displayId))) {
                return;
            }
            final Vote baseModeRefreshRateVote;
            final Vote sizeVote;
            if (requestedMode != null) {
                mAppRequestedModeByDisplay.put(displayId, requestedMode);
                sizeVote = Vote.forSize(requestedMode.getPhysicalWidth(),
                        requestedMode.getPhysicalHeight());
                if (requestedMode.isSynthetic()) {
                    // TODO: for synthetic mode we should not limit frame rate, we must ensure
                    // that frame rate is reachable within other Votes constraints
                    baseModeRefreshRateVote = Vote.forRenderFrameRates(
                            requestedMode.getRefreshRate(), requestedMode.getRefreshRate());
                } else {
                    baseModeRefreshRateVote =
                            Vote.forBaseModeRefreshRate(requestedMode.getRefreshRate());
                }
            } else {
                mAppRequestedModeByDisplay.remove(displayId);
                baseModeRefreshRateVote = null;
                sizeVote = null;
            }
            Vote frameRateVote = getFrameRateVote(
                    requestedMinRefreshRateRange, requestedMaxRefreshRateRange);
            Vote baseModeRefreshRateVote = getBaseModeVote(requestedMode, requestedRefreshRate);
            Vote sizeVote = getSizeVote(requestedMode);

            mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE,
                    frameRateVote);
            mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_BASE_MODE_REFRESH_RATE,
                    baseModeRefreshRateVote);
            mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_SIZE, sizeVote);
        }

        private void setAppPreferredRefreshRateRangeLocked(int displayId,
                float requestedMinRefreshRateRange, float requestedMaxRefreshRateRange) {
            final Vote vote;
        private Display.Mode findModeLocked(int displayId, int modeId, float requestedRefreshRate) {
            Display.Mode mode = null;
            if (modeId != 0) {
                mode = findAppModeByIdLocked(displayId, modeId);
            } else if (requestedRefreshRate != 0 && !mIgnorePreferredRefreshRate) { // modeId == 0
                // Scan supported modes returned to find a mode with the same
                // size as the default display mode but with the specified refresh rate instead.
                mode = findDefaultModeByRefreshRateLocked(displayId, requestedRefreshRate);
                if (mode == null) {
                    Slog.e(TAG, "Couldn't find a mode for the requestedRefreshRate: "
                            + requestedRefreshRate + " on Display: " + displayId);
                }
            }
            return mode;
        }

        private Vote getFrameRateVote(float minRefreshRate, float maxRefreshRate) {
            RefreshRateRange refreshRateRange = null;
            if (requestedMinRefreshRateRange > 0 || requestedMaxRefreshRateRange > 0) {
                float min = requestedMinRefreshRateRange;
                float max = requestedMaxRefreshRateRange > 0
                        ? requestedMaxRefreshRateRange : Float.POSITIVE_INFINITY;
                refreshRateRange = new RefreshRateRange(min, max);
            if (minRefreshRate > 0 || maxRefreshRate > 0) {
                float max = maxRefreshRate > 0
                        ? maxRefreshRate : Float.POSITIVE_INFINITY;
                refreshRateRange = new RefreshRateRange(minRefreshRate, max);
                if (refreshRateRange.min == 0 && refreshRateRange.max == 0) {
                    // requestedMinRefreshRateRange/requestedMaxRefreshRateRange were invalid
                    // minRefreshRate/maxRefreshRate were invalid
                    refreshRateRange = null;
                }
            }
            return refreshRateRange != null
                    ? Vote.forRenderFrameRates(refreshRateRange.min, refreshRateRange.max) : null;
        }

            if (Objects.equals(refreshRateRange,
                    mAppPreferredRefreshRateRangeByDisplay.get(displayId))) {
                return;
        private Vote getSizeVote(@Nullable Display.Mode mode) {
            return mode != null
                    ?  Vote.forSize(mode.getPhysicalWidth(), mode.getPhysicalHeight()) : null;
        }

            if (refreshRateRange != null) {
                mAppPreferredRefreshRateRangeByDisplay.put(displayId, refreshRateRange);
                vote = Vote.forRenderFrameRates(refreshRateRange.min, refreshRateRange.max);
        private Vote getBaseModeVote(@Nullable Display.Mode mode, float requestedRefreshRate) {
            Vote vote = null;
            if (mode != null) {
                if (mode.isSynthetic()) {
                    vote = Vote.forRequestedRefreshRate(mode.getRefreshRate());
                } else {
                mAppPreferredRefreshRateRangeByDisplay.remove(displayId);
                vote = null;
                    vote = Vote.forBaseModeRefreshRate(mode.getRefreshRate());
                }
            mVotesStorage.updateVote(displayId, Vote.PRIORITY_APP_REQUEST_RENDER_FRAME_RATE_RANGE,
                    vote);
            } else if (requestedRefreshRate != 0f && mIgnorePreferredRefreshRate) {
                vote = Vote.forRequestedRefreshRate(requestedRefreshRate);
            } // !mIgnorePreferredRefreshRate case is handled by findModeLocked
            return vote;
        }

        @Nullable
        private Display.Mode findDefaultModeByRefreshRateLocked(int displayId, float refreshRate) {
            Display.Mode[] modes = mAppSupportedModesByDisplay.get(displayId);
            Display.Mode defaultMode = mDefaultModeByDisplay.get(displayId);
            for (int i = 0; i < modes.length; i++) {
                if (modes[i].matches(defaultMode.getPhysicalWidth(),
                        defaultMode.getPhysicalHeight(), refreshRate)) {
                    return modes[i];
                }
            }
            return null;
        }

        private Display.Mode findAppModeByIdLocked(int displayId, int modeId) {
@@ -1384,19 +1360,7 @@ public class DisplayModeDirector {

        private void dumpLocked(PrintWriter pw) {
            pw.println("  AppRequestObserver");
            pw.println("    mAppRequestedModeByDisplay:");
            for (int i = 0; i < mAppRequestedModeByDisplay.size(); i++) {
                final int id = mAppRequestedModeByDisplay.keyAt(i);
                final Display.Mode mode = mAppRequestedModeByDisplay.valueAt(i);
                pw.println("    " + id + " -> " + mode);
            }
            pw.println("    mAppPreferredRefreshRateRangeByDisplay:");
            for (int i = 0; i < mAppPreferredRefreshRateRangeByDisplay.size(); i++) {
                final int id = mAppPreferredRefreshRateRangeByDisplay.keyAt(i);
                final RefreshRateRange refreshRateRange =
                        mAppPreferredRefreshRateRangeByDisplay.valueAt(i);
                pw.println("    " + id + " -> " + refreshRateRange);
            }
            pw.println("    mIgnorePreferredRefreshRate: " + mIgnorePreferredRefreshRate);
        }
    }

Loading