SF: Generalize immediate mode set to multi-display

When initiating a mode set, HWC may request an immediate mode change, in
which case SF finalizes the change on the same (rather than next) frame.
However, this would only be honored for at most one display, and further
requests would be dropped.

This was a historical hack: The loop used to iterate over mDisplays, and
finalizeDisplayModeChange may recreate/invalidate the DisplayDevice. Now
that the loop is over the immutable mPhysicalDisplays, the DisplayDevice
can be safely recreated within the loop.

Note that the only known user of this code path is ATV, so multi-display
devices should not be affected by this change.

Bug: 255635711
Flag: EXEMPT refactor
Test: DisplayModeSwitchingTest (WithoutRefreshRequired cases)
Change-Id: I842e39c2c5509de99b80fa9561ecb13b66f98c40
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 5b40acf..bba27b2 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1481,8 +1481,6 @@
 void SurfaceFlinger::initiateDisplayModeChanges() {
     ATRACE_CALL();
 
-    std::optional<PhysicalDisplayId> displayToUpdateImmediately;
-
     for (const auto& [displayId, physical] : FTL_FAKE_GUARD(mStateLock, mPhysicalDisplays)) {
         auto desiredModeOpt = mDisplayModeController.getDesiredMode(displayId);
         if (!desiredModeOpt) {
@@ -1536,21 +1534,14 @@
         if (outTimeline.refreshRequired) {
             scheduleComposite(FrameHint::kNone);
         } else {
-            // TODO(b/255635711): Remove `displayToUpdateImmediately` to `finalizeDisplayModeChange`
-            // for all displays. This was only needed when the loop iterated over `mDisplays` rather
-            // than `mPhysicalDisplays`.
-            displayToUpdateImmediately = displayId;
-        }
-    }
+            // HWC has requested to apply the mode change immediately rather than on the next frame.
+            finalizeDisplayModeChange(displayId);
 
-    if (displayToUpdateImmediately) {
-        const auto displayId = *displayToUpdateImmediately;
-        finalizeDisplayModeChange(displayId);
-
-        const auto desiredModeOpt = mDisplayModeController.getDesiredMode(displayId);
-        if (desiredModeOpt &&
-            mDisplayModeController.getActiveMode(displayId) == desiredModeOpt->mode) {
-            applyActiveMode(displayId);
+            const auto desiredModeOpt = mDisplayModeController.getDesiredMode(displayId);
+            if (desiredModeOpt &&
+                mDisplayModeController.getActiveMode(displayId) == desiredModeOpt->mode) {
+                applyActiveMode(displayId);
+            }
         }
     }
 }