SF: Enable Layer Caching Texture Pool only for the active display
Limit the memory consuption of the Texture Pool to a single display
Test: atest libcompositionengine_test
Bug: 188839446
Change-Id: I61d73a72bc25e776ef18f4e3fbf2c3373e0257e4
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 5e17828..85162af 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4537,8 +4537,7 @@
if (currentMode == hal::PowerMode::OFF) {
const auto activeDisplay = getDisplayDeviceLocked(mActiveDisplayToken);
if (display->isInternal() && (!activeDisplay || !activeDisplay->isPoweredOn())) {
- mActiveDisplayToken = display->getDisplayToken();
- onActiveDisplayChangedLocked(getDisplayDeviceLocked(mActiveDisplayToken));
+ onActiveDisplayChangedLocked(display);
}
// Keep uclamp in a separate syscall and set it before changing to RT due to b/190237315.
// We can merge the syscall later.
@@ -6957,10 +6956,17 @@
void SurfaceFlinger::onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) {
ATRACE_CALL();
+ if (const auto display = getDisplayDeviceLocked(mActiveDisplayToken)) {
+ display->getCompositionDisplay()->setLayerCachingTexturePoolEnabled(false);
+ }
+
if (!activeDisplay) {
ALOGE("%s: activeDisplay is null", __func__);
return;
}
+ mActiveDisplayToken = activeDisplay->getDisplayToken();
+
+ activeDisplay->getCompositionDisplay()->setLayerCachingTexturePoolEnabled(true);
updateInternalDisplayVsyncLocked(activeDisplay);
mScheduler->setModeChangePending(false);
mScheduler->setRefreshRateConfigs(activeDisplay->holdRefreshRateConfigs());