Starting March 27, 2025, we recommend using android-latest-release
instead of aosp-main
to build and contribute to AOSP. For more information, see Changes to AOSP.
Client framebuffer management
Stay organized with collections
Save and categorize content based on your preferences.
Starting with Android 13, new framebuffers, used during
client
composition, are allocated whenever the display resolution changes. This
allocation is performed by SurfaceFlinger on the next invalidate cycle
after a resolution change.
Framebuffer management during resolution switches
Resolution changes occur due to one of the following
two scenarios:
A hotplug event,
initiated by Hardware Composer (HWC), which occurs when swapping from one external
display to a different external display that has a different default resolution.
During a hotplug event, the handles to the old framebuffers are released
when the old display data is deallocated.
A display mode switch initiated by SurfaceFlinger, which occurs when the
user changes the resolution with user settings,
or an app changes the resolution with preferredDisplayModeId
.
During a display mode switch, the handles to existing client framebuffers
are released by SurfaceFlinger before calling setActiveConfig
or setActiveConfigWithConstraints
.
To avoid catastrophic problems, such as memory fragmentation, on devices that
don't reserve enough memory for the old and new framebuffers, it's critical
that HWC ceases to use the old framebuffers and releases any
handles to these framebuffers as shown in the following cases:
Releasing the handles allows the framebuffer memory to be fully deallocated
prior to the allocation of new framebuffers that SurfaceFlinger performs
during the next invalidate cycle.
Recommendations for framebuffer management
If HWC doesn't release handles to old framebuffers in time,
the new framebuffer allocation takes place before the old framebuffer
deallocation. This can cause catastrophic problems when the new allocation fails
due to fragmentation or other issues. Even worse, if
HWC doesn't release these handles at all, a memory leak can
occur.
To avoid catastrophic allocation failures, follow these recommendations:
If HWC needs to continue using the old client framebuffers until the new
client framebuffers are provided, then it’s critical to reserve enough memory
for both the old and new framebuffers, and possibly run defragmentation
algorithms on the framebuffer memory space.
Allocate a dedicated memory pool for the framebuffers that's separate from
the rest of the graphic buffer memory. This is important because between
deallocation and reallocation of the framebuffers, a third-party process can
attempt to allocate graphics memory. If the same graphics memory pool is
used by the framebuffer and if the graphics memory is full, the third-party
process can occupy the graphics memory previously allocated by a framebuffer,
thus leaving insufficient memory for the framebuffer reallocation or, possibly
fragmenting the memory space.
Test framebuffer management
OEMs are advised to test for proper client framebuffer memory management across
resolution switches for their device, described as follows:
For hotplug events, simply unplug and reconnect two different displays with
different resolutions.
For mode switches, use the ModeSwitchingTestActivity
CTS
Verifier test to initiate a mode switch for testing framebuffer memory behavior.
This test can visually identify problems that are hard to detect
programmatically.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-06-26 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-06-26 UTC."],[],[],null,["# Client framebuffer management\n\nStarting with Android 13, new framebuffers, used during\n[client](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl#113)\ncomposition, are allocated whenever the display resolution changes. This\nallocation is performed by SurfaceFlinger on the next *invalidate* cycle\nafter a resolution change.\n\nFramebuffer management during resolution switches\n-------------------------------------------------\n\nResolution changes occur due to one of the following\ntwo scenarios:\n\n- A [hotplug event](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41),\n initiated by Hardware Composer (HWC), which occurs when swapping from one external\n display to a different external display that has a different default resolution.\n\n During a hotplug event, the handles to the old framebuffers are released\n when the old display data is deallocated.\n- A display mode switch initiated by SurfaceFlinger, which occurs when the\n user changes the resolution with [user settings](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android16-release/core/java/android/hardware/display/DisplayManager.java#1209),\n or an app changes the resolution with [`preferredDisplayModeId`](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#preferredDisplayModeId).\n\n During a display mode switch, the handles to existing client framebuffers\n are released by SurfaceFlinger before calling [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nTo avoid catastrophic problems, such as memory fragmentation, on devices that\ndon't reserve enough memory for the old and new framebuffers, it's critical\nthat HWC ceases to use the old framebuffers and releases any\nhandles to these framebuffers as shown in the following cases:\n\n- For hotplug events, immediately before calling [`onHotplug`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41).\n\n- For mode switches, immediately after the call to [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nReleasing the handles allows the framebuffer memory to be fully deallocated\nprior to the allocation of new framebuffers that SurfaceFlinger performs\nduring the next *invalidate* cycle.\n\n### Recommendations for framebuffer management\n\nIf HWC doesn't release handles to old framebuffers in time,\nthe new framebuffer allocation takes place before the old framebuffer\ndeallocation. This can cause catastrophic problems when the new allocation fails\ndue to fragmentation or other issues. Even worse, if\nHWC doesn't release these handles at all, a memory leak can\noccur.\n\nTo avoid catastrophic allocation failures, follow these recommendations:\n\n- If HWC needs to continue using the old client framebuffers until the new\n client framebuffers are provided, then it's critical to reserve enough memory\n for both the old and new framebuffers, and possibly run defragmentation\n algorithms on the framebuffer memory space.\n\n- Allocate a dedicated memory pool for the framebuffers that's separate from\n the rest of the graphic buffer memory. This is important because between\n deallocation and reallocation of the framebuffers, a third-party process can\n attempt to allocate graphics memory. If the same graphics memory pool is\n used by the framebuffer and if the graphics memory is full, the third-party\n process can occupy the graphics memory previously allocated by a framebuffer,\n thus leaving insufficient memory for the framebuffer reallocation or, possibly\n fragmenting the memory space.\n\nTest framebuffer management\n---------------------------\n\nOEMs are advised to test for proper client framebuffer memory management across\nresolution switches for their device, described as follows:\n\n- For hotplug events, simply unplug and reconnect two different displays with\n different resolutions.\n\n- For mode switches, use the [`ModeSwitchingTestActivity`](https://cs.android.com/android/platform/superproject/+/android-latest-release:cts/apps/CtsVerifier/src/com/android/cts/verifier/tv/display/ModeSwitchingTestActivity.java;l=47-53;drc=c80d948aff1e7df5c2dc0ddba0d1cd63a90e4d9c) CTS\n Verifier test to initiate a mode switch for testing framebuffer memory behavior.\n This test can visually identify problems that are hard to detect\n programmatically."]]