Adaptive refresh rate

Starting in Android 15, the adaptive refresh rate (ARR) feature enables the display refresh rate to adapt to the content frame rate, using discrete VSync steps.

The ARR feature offers the following benefits:

  • Reducing power consumption: By default, ARR enables devices to operate at rates lower than their maximum refresh rates, transitioning to higher rates only when essential for the user experience, which minimizes unnecessary power consumption.

  • Reducing jank: ARR eliminates the need for mode switching, which is a known cause for jank.

Overview

On non-ARR panels, the display refreshes at a fixed cadence determined by the active display mode.

On ARR panels, the display VSync rate and refresh rate are decoupled, allowing refresh rates to change within one display mode, based on content update cadence. The panels can run at refresh rates that are divisors of the panel's tearing effect (TE). OEMs have the flexibility to implement ARR based on their preferred power trade-offs.

The following figure is a display with vsyncPeriod of 240 Hz and minFrameIntervalNs (maximum refresh rate) of 120 Hz. VSync occurs every 4.16 ms. A frame can be presented at any multiples of VSync after the minFrameIntervalNs from the last frame.

arr-example

Figure 1. Example of ARR.

Implementation

Android 15 supports ARR with new Hardware Composer (HWC) HAL APIs and platform changes. To enable ARR, OEMs must support kernel and system changes on devices running Android 15 and later, and implement version 3 of the android.hardware.graphics.composer3 APIs, as listed in the following sections.

See Pixel's reference implementation of the APIs that support ARR for more information.

DisplayConfiguration.aidl

The DisplayConfiguration.aidl API specifies the display configuration using display attributes, along with the following attributes for ARR:

  • Optional vrrConfig: If set, ARR is enabled for specific configurations. If set to null, the display mode is set to non-ARR modes such as multiple refresh rate (MRR). With this attribute, a display can be configured as either MRR or ARR, but not both.
  • vsyncPeriod: The VSync rate of the display. On ARR displays, this value is used to derive the supported discrete refresh rates.

    Vendors must set the DisplayConfiguration.vsyncPeriod value for all devices. For non-ARR displays, DisplayConfiguration.vsyncPeriod is the display refresh rate. If a device supports 120 Hz, then this value must be 8.3 ms.

    For ARR displays, DisplayConfiguration.vsyncPeriod is the TE signal frequency. If a device has a minFrameIntervalNs of 8.3 ms but the TE is 240 Hz, this value must be 4.16 ms.

VrrConfig.aidl

The VrrConfig.aidl API includes the following attributes:

IComposerClient.notifyExpectedPresent provides a hint for a frame that is likely to be presented, so that the display can adapt its self-refresh period accordingly. frameIntervalNs represents the present cadence that follows after the expectedPresentTime. For example, if notifyExpectedPresent is called with expectedPresentTime N and frameIntervalNs of 16.6 ms, then the next frame is at N + 16.6 ms after the present time N. After the present time N, the frame cadence is 16.6 ms until there are further changes.

IComposerClient.notifyExpectedPresent is called only when DisplayConfiguration.notifyExpectedPresentConfig is set, and if one of the following timing conditions occurs:

  • Out-of-cadence present time: The expected presentation time of the next frame deviates from the display's regular refresh rate defined by frameIntervalNs.
  • Timeout exceeded: The time interval between the previous frames is greater than or equal to notifyExpectedPresentConfig.timeoutNs.

DisplayCommand.frameIntervalNs

DisplayCommand.frameIntervalNs provides a hint about the cadence for the upcoming frames in nanoseconds.

Testing

Use onRefreshRateChangedDebug for debugging. This method notifies the client that the refresh rate of the display has changed.

Use the TouchLatency test app for manual testing as shown in Figure 2:

touchlatency-app

Figure 2. TouchLatency test app.

In the test app, use the slider to adjust the render rate to various values of divisor refresh rates of your display's refresh rate. Observe how the frame rate changes with respect to the rate requested.