Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +76 −13 Original line number Diff line number Diff line Loading @@ -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(); } } Loading Loading @@ -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 Loading Loading @@ -1747,7 +1785,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } return; } device.onFrameRateOverridesChanged(overrides); device.onFrameRateOverridesChangedLocked(overrides); } } Loading @@ -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) { Loading services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -506,6 +511,10 @@ public class DisplayManagerFlags { return mIsMinmodeCapBrightnessEnabled.isEnabled(); } public boolean isSingleAppEventForModeAndFrameRateOverrideEnabled() { return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled(); } /** * dumps all flagstates * @param pw printWriter Loading Loading @@ -559,6 +568,7 @@ public class DisplayManagerFlags { pw.println(" " + mEnableUpdatedDisplayConnectionDialogFlagState); pw.println(" " + mIsLoggingForDisplayEventsEnabled); pw.println(" " + mIsMinmodeCapBrightnessEnabled); pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled); } private static class FlagState { Loading services/core/java/com/android/server/display/feature/display_flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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 } } services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +76 −13 Original line number Diff line number Diff line Loading @@ -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(); } } Loading Loading @@ -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 Loading Loading @@ -1747,7 +1785,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } return; } device.onFrameRateOverridesChanged(overrides); device.onFrameRateOverridesChangedLocked(overrides); } } Loading @@ -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) { Loading
services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -506,6 +511,10 @@ public class DisplayManagerFlags { return mIsMinmodeCapBrightnessEnabled.isEnabled(); } public boolean isSingleAppEventForModeAndFrameRateOverrideEnabled() { return mIsSingleAppEventForModeAndFrameRateOverrideEnabled.isEnabled(); } /** * dumps all flagstates * @param pw printWriter Loading Loading @@ -559,6 +568,7 @@ public class DisplayManagerFlags { pw.println(" " + mEnableUpdatedDisplayConnectionDialogFlagState); pw.println(" " + mIsLoggingForDisplayEventsEnabled); pw.println(" " + mIsMinmodeCapBrightnessEnabled); pw.println(" " + mIsSingleAppEventForModeAndFrameRateOverrideEnabled); } private static class FlagState { Loading
services/core/java/com/android/server/display/feature/display_flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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 } }
services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading