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

Commit fcc0d7a0 authored by Ram Indani's avatar Ram Indani Committed by Android (Google) Code Review
Browse files

Merge "DM: Send one event for onModeAndFrameRateOverridesChanged event" into main

parents 6067f470 a143dae1
Loading
Loading
Loading
Loading
+76 −13
Original line number Diff line number Diff line
@@ -1252,17 +1252,30 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            updateDeviceInfoLocked();
        }

        public void onActiveDisplayModeChangedLocked(int sfModeId, float renderFrameRate,
        private void onActiveDisplayModeChangedLocked(int sfModeId, float renderFrameRate,
                long appVsyncOffsetNanos, long presentationDeadlineNanos) {
            if (updateActiveModeLocked(sfModeId, renderFrameRate, appVsyncOffsetNanos,
                    presentationDeadlineNanos)) {
            if (updateActiveModeAndFrameOverrideChangedLocked(sfModeId, renderFrameRate,
                    appVsyncOffsetNanos, presentationDeadlineNanos, mFrameRateOverrides)) {
                updateDeviceInfoLocked();
            }
        }

        public void onFrameRateOverridesChanged(
        private void onFrameRateOverridesChangedLocked(
                DisplayEventReceiver.FrameRateOverride[] overrides) {
            if (updateFrameRateOverridesLocked(overrides)) {
            if (updateActiveModeAndFrameOverrideChangedLocked(mActiveSfDisplayMode.id,
                    mActiveRenderFrameRate, mAppVsyncOffsetNanos, mPresentationDeadlineNanos,
                    overrides)) {
                updateDeviceInfoLocked();
            }
        }

        private void onModeAndFrameRateOverridesChangedLocked(
                int sfModeId, float renderFrameRate,
                long appVsyncOffsetNanos, long presentationDeadlineNanos,
                DisplayEventReceiver.FrameRateOverride[] overrides) {
            if (updateActiveModeAndFrameOverrideChangedLocked(sfModeId,
                    renderFrameRate, appVsyncOffsetNanos,
                    presentationDeadlineNanos, overrides)) {
                updateDeviceInfoLocked();
            }
        }
@@ -1303,6 +1316,31 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            return true;
        }

        private boolean updateActiveModeAndFrameOverrideChangedLocked(int activeSfModeId,
                float renderFrameRate, long appVsyncOffsetNanos,
                long presentationDeadlineNanos,
                DisplayEventReceiver.FrameRateOverride[] overrides) {
            if (mActiveSfDisplayMode.id == activeSfModeId
                    && mActiveRenderFrameRate == renderFrameRate
                    && mAppVsyncOffsetNanos == appVsyncOffsetNanos
                    && mPresentationDeadlineNanos == presentationDeadlineNanos
                    && Arrays.equals(overrides, mFrameRateOverrides)
            ) {
                return false;
            }
            mActiveSfDisplayMode = getModeById(mSfDisplayModes, activeSfModeId);
            mActiveModeId = findMatchingModeIdLocked(activeSfModeId);
            if (mActiveModeId == INVALID_MODE_ID) {
                Slog.w(TAG, "In unknown mode after setting allowed modes"
                        + ", activeModeId=" + activeSfModeId);
            }
            mActiveRenderFrameRate = renderFrameRate;
            mAppVsyncOffsetNanos = appVsyncOffsetNanos;
            mPresentationDeadlineNanos = presentationDeadlineNanos;
            mFrameRateOverrides = overrides;
            return true;
        }

        public boolean updateHdcpLevelsLocked(int connectedLevel, int maxLevel) {
            if (connectedLevel > maxLevel) {
                Slog.w(TAG, "HDCP connected level: " + connectedLevel
@@ -1747,7 +1785,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                    }
                    return;
                }
                device.onFrameRateOverridesChanged(overrides);
                device.onFrameRateOverridesChangedLocked(overrides);
            }
        }

@@ -1756,15 +1794,40 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                int modeId, long renderPeriod, long appVsyncOffsetNanos,
                long presentationDeadlineNanos,
                DisplayEventReceiver.FrameRateOverride[] overrides) {
            if (getFeatureFlags().isSingleAppEventForModeAndFrameRateOverrideEnabled()) {
                if (DEBUG) {
                    Slog.d(TAG, "onModeAndFrameRateOverridesChanged("
                            + "timestampNanos=" + timestampNanos
                            + ", physicalDisplayId=" + physicalDisplayId
                            + ", modeId=" + modeId
                            + ", renderPeriod=" + renderPeriod
                            + ", appVsyncOffsetNanos=" + appVsyncOffsetNanos
                            + ", presentationDeadlineNanos=" + presentationDeadlineNanos
                            + ", overrides=" + Arrays.toString(overrides) + ")");
                }
                synchronized (getSyncRoot()) {
                    LocalDisplayDevice device = mDevices.get(physicalDisplayId);
                    if (device == null) {
                        if (DEBUG) {
                            Slog.d(TAG, "Received onModeAndFrameRateOverridesChanged"
                                    + " for unhandled physical display: "
                                    + "physicalDisplayId=" + physicalDisplayId);
                        }
                        return;
                    }
                    float renderFrameRate = 1e9f / renderPeriod;
                    device.onModeAndFrameRateOverridesChangedLocked(modeId, renderFrameRate,
                            appVsyncOffsetNanos, presentationDeadlineNanos, overrides);
                }
            } else {
                if (DEBUG) {
                    Slog.d(TAG, "onModeAndFrameRateOverridesChanged");
                }
            //TODO(b/415850294) App should not get two callbacks when
            // onModeAndFrameRateOverridesChanged is executed.
                onModeChanged(timestampNanos, physicalDisplayId, modeId, renderPeriod,
                        appVsyncOffsetNanos, presentationDeadlineNanos);
                onFrameRateOverridesChanged(timestampNanos, physicalDisplayId, overrides);
            }
        }

        @Override
        public void onHdcpLevelsChanged(long physicalDisplayId, int connectedLevel, int maxLevel) {
+10 −0
Original line number Diff line number Diff line
@@ -259,6 +259,11 @@ public class DisplayManagerFlags {
            Flags::minmodeCapBrightnessEnabled
    );

    private final FlagState mIsSingleAppEventForModeAndFrameRateOverrideEnabled = new FlagState(
            Flags.FLAG_ENABLE_SINGLE_APP_EVENT_FOR_MODE_AND_FRAME_RATE_OVERRIDE,
            Flags::enableSingleAppEventForModeAndFrameRateOverride
    );

    /** Returns whether power throttling clamper is enabled on not. */
    public boolean isPowerThrottlingClamperEnabled() {
        return mPowerThrottlingClamperFlagState.isEnabled();
@@ -506,6 +511,10 @@ public class DisplayManagerFlags {
        return mIsMinmodeCapBrightnessEnabled.isEnabled();
    }

    public boolean isSingleAppEventForModeAndFrameRateOverrideEnabled() {
        return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled();
    }

    /**
     * dumps all flagstates
     * @param pw printWriter
@@ -559,6 +568,7 @@ public class DisplayManagerFlags {
        pw.println(" " + mEnableUpdatedDisplayConnectionDialogFlagState);
        pw.println(" " + mIsLoggingForDisplayEventsEnabled);
        pw.println(" " + mIsMinmodeCapBrightnessEnabled);
        pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled);
    }

    private static class FlagState {
+10 −0
Original line number Diff line number Diff line
@@ -425,3 +425,13 @@ flag {
      purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "enable_single_app_event_for_mode_and_frame_rate_override"
    namespace: "display_manager"
    description: "Enable single app event for mode and frame rate override changed event."
    bug: "415850294"
    metadata {
      purpose: PURPOSE_BUGFIX
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -943,6 +943,7 @@ public class LocalDisplayAdapterTest {
    @Test
    public void testOnModeAndFrameRateOverridesChanged() throws Exception {
        doReturn(true).when(mFlags).isDispatchDisplayModeWithVsyncOffsetsEnabled();
        doReturn(true).when(mFlags).isSingleAppEventForModeAndFrameRateOverrideEnabled();
        long appVsyncOffsetNanosMode1 = 100;
        long presentationDeadlineNanosMode1 = 200;
        long appVsyncOffsetNanosMode2 = 101;
@@ -985,7 +986,7 @@ public class LocalDisplayAdapterTest {
        // Returns the values captured from the OnModeAndFrameRateOverridesChanged event.
        assertEquals(newAppVsyncOffsetNanos, displayDeviceInfo.appVsyncOffsetNanos);
        assertEquals(newPresentationDeadlineNanos, displayDeviceInfo.presentationDeadlineNanos);
        assertThat(mListener.changedDisplays.size()).isEqualTo(2);
        assertThat(mListener.changedDisplays.size()).isEqualTo(1);
        activeMode = getModeById(displayDeviceInfo, displayDeviceInfo.modeId);
        assertThat(activeMode.matches(1920, 1080, 120f)).isTrue();
    }