From 39be47b981c93b4366c7fdd341c064e7f47bfb94 Mon Sep 17 00:00:00 2001 From: Dominik Laskowski Date: Mon, 17 Jun 2024 11:03:30 -0400 Subject: SF: Fix pacesetter promotion for folded mirroring The pacesetter display is demoted/promoted in response to a hotplug. On foldables, the promoted display was hard-coded to the inner display, so a hotplug while folded would incorrectly use that powered-off display as the pacesetter, causing system-wide jank until the next fold/unfold. Bug: 347248313 Flag: EXEMPT bugfix Test: Connect and disconnect external display while folded. Test: Fold and unfold while external display is connected. Test: Pacesetter is still correct on folded/unfolded boot. (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3ff44c7e852f5614514a15dcec78ba7857e5d010) Merged-In: Id5cb29c3cbaa8ed455a15d8be3a32e79a470cce5 Change-Id: Id0a32686c1271163e88a8c586482ee37d42a5bdf --- services/surfaceflinger/SurfaceFlinger.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index cf5f55d7bd..b75be37119 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3717,7 +3717,8 @@ void SurfaceFlinger::processDisplayAdded(const wp& displayToken, ftl::FakeGuard guard(kMainThreadContext); // For hotplug reconnect, renew the registration since display modes have been reloaded. - mScheduler->registerDisplay(display->getPhysicalId(), display->holdRefreshRateSelector()); + mScheduler->registerDisplay(display->getPhysicalId(), display->holdRefreshRateSelector(), + mActiveDisplayId); } if (display->isVirtual()) { @@ -3756,7 +3757,7 @@ void SurfaceFlinger::processDisplayRemoved(const wp& displayToken) { if (display->isVirtual()) { releaseVirtualDisplay(display->getVirtualId()); } else { - mScheduler->unregisterDisplay(display->getPhysicalId()); + mScheduler->unregisterDisplay(display->getPhysicalId(), mActiveDisplayId); } } @@ -4376,7 +4377,8 @@ void SurfaceFlinger::initScheduler(const sp& display) { getFactory(), activeRefreshRate, *mTimeStats); // The pacesetter must be registered before EventThread creation below. - mScheduler->registerDisplay(display->getPhysicalId(), display->holdRefreshRateSelector()); + mScheduler->registerDisplay(display->getPhysicalId(), display->holdRefreshRateSelector(), + mActiveDisplayId); if (FlagManager::getInstance().vrr_config()) { mScheduler->setRenderRate(display->getPhysicalId(), activeMode.fps); } -- cgit v1.2.3-59-g8ed1b