SF: Use std::map for DisplayDevice lookup

Bug: 74619554
Test: libsurfaceflinger_unittest
Change-Id: I79c5c60c4c9eed450781ccdd62fa98ed1f46c07c
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 4730b79..995a96e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1500,8 +1500,7 @@
     mPreviousPresentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
 
     mHadClientComposition = false;
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         mHadClientComposition = mHadClientComposition ||
                 getBE().mHwc->hasClientComposition(display->getHwcDisplayId());
     }
@@ -1517,8 +1516,7 @@
         return;
 
     const bool repaintEverything = mRepaintEverything;
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (display->isPoweredOn()) {
             // transform the dirty region into this screen's coordinate space
             const Region dirtyRegion = display->getDirtyRegion(repaintEverything);
@@ -1542,8 +1540,7 @@
         usleep(mDebugRegion * 1000);
     }
 
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (!display->isPoweredOn()) {
             continue;
         }
@@ -1565,8 +1562,7 @@
 void SurfaceFlinger::logLayerStats() {
     ATRACE_CALL();
     if (CC_UNLIKELY(mLayerStats.isEnabled())) {
-        for (size_t i = 0; i < mDisplays.size(); ++i) {
-            const auto& display = mDisplays[i];
+        for (const auto& [token, display] : mDisplays) {
             if (display->isPrimary()) {
                 mLayerStats.logLayerStats(dumpVisibleLayersProtoInfo(*display));
                 return;
@@ -1771,12 +1767,12 @@
         mVisibleRegionsDirty = false;
         invalidateHwcGeometry();
 
-        for (size_t i = 0; i < mDisplays.size(); ++i) {
+        for (const auto& pair : mDisplays) {
+            const auto& display = pair.second;
             Region opaqueRegion;
             Region dirtyRegion;
             Vector<sp<Layer>> layersSortedByZ;
             Vector<sp<Layer>> layersNeedingFences;
-            const auto& display = mDisplays[i];
             const Transform& tr = display->getTransform();
             const Rect bounds = display->getBounds();
             if (display->isPoweredOn()) {
@@ -1905,8 +1901,7 @@
     ATRACE_CALL();
     ALOGV("setUpHWComposer");
 
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         bool dirty = !display->getDirtyRegion(mRepaintEverything).isEmpty();
         bool empty = display->getVisibleLayersSortedByZ().size() == 0;
         bool wasEmpty = !display->lastCompositionHadVisibleLayers;
@@ -1935,8 +1930,7 @@
     // build the h/w work list
     if (CC_UNLIKELY(mGeometryInvalid)) {
         mGeometryInvalid = false;
-        for (size_t i = 0; i < mDisplays.size(); ++i) {
-            const auto& display = mDisplays[i];
+        for (const auto& [token, display] : mDisplays) {
             const auto hwcId = display->getHwcDisplayId();
             if (hwcId >= 0) {
                 const Vector<sp<Layer>>& currentLayers = display->getVisibleLayersSortedByZ();
@@ -1959,8 +1953,7 @@
     }
 
     // Set the per-frame data
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         const auto hwcId = display->getHwcDisplayId();
 
         if (hwcId < 0) {
@@ -2004,8 +1997,7 @@
 
     mDrawingState.colorMatrixChanged = false;
 
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (!display->isPoweredOn()) {
             continue;
         }
@@ -2021,8 +2013,7 @@
     ALOGV("doComposition");
 
     const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (display->isPoweredOn()) {
             // transform the dirty region into this screen's coordinate space
             const Region dirtyRegion = display->getDirtyRegion(repaintEverything);
@@ -2045,8 +2036,7 @@
     const nsecs_t now = systemTime();
     mDebugInSwapBuffers = now;
 
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (!display->isPoweredOn()) {
             continue;
         }
@@ -2322,7 +2312,7 @@
                 }
                 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
                     mEventThread->onHotplugReceived(draw[i].type, false);
-                mDisplays.removeItem(draw.keyAt(i));
+                mDisplays.erase(draw.keyAt(i));
             } else {
                 // this display is in both lists. see if something changed.
                 const DisplayDeviceState& state(curr[j]);
@@ -2337,7 +2327,7 @@
                     if (const auto display = getDisplayDeviceLocked(displayToken)) {
                         display->disconnect(getHwComposer());
                     }
-                    mDisplays.removeItem(displayToken);
+                    mDisplays.erase(displayToken);
                     mDrawingState.displays.removeItemsAt(i);
                     dc--;
                     // at this point we must loop to the next item
@@ -2417,9 +2407,9 @@
 
                 const wp<IBinder>& displayToken = curr.keyAt(i);
                 if (dispSurface != nullptr) {
-                    mDisplays.add(displayToken,
-                                  setupNewDisplayDeviceInternal(displayToken, hwcId, state,
-                                                                dispSurface, producer));
+                    mDisplays.emplace(displayToken,
+                                      setupNewDisplayDeviceInternal(displayToken, hwcId, state,
+                                                                    dispSurface, producer));
                     if (!state.isVirtual()) {
                         mEventThread->onHotplugReceived(state.type, true);
                     }
@@ -2483,7 +2473,7 @@
         // happened yet, so we must use the current state layer list
         // (soon to become the drawing state list).
         //
-        sp<const DisplayDevice> display;
+        sp<const DisplayDevice> hintDisplay;
         uint32_t currentlayerStack = 0;
         bool first = true;
         mCurrentState.traverseInZOrder([&](Layer* layer) {
@@ -2496,34 +2486,33 @@
                 // figure out if this layerstack is mirrored
                 // (more than one display) if so, pick the default display,
                 // if not, pick the only display it's on.
-                display = nullptr;
-                for (size_t i = 0; i < mDisplays.size(); ++i) {
-                    if (layer->belongsToDisplay(mDisplays[i]->getLayerStack(),
-                                                mDisplays[i]->isPrimary())) {
-                        if (display) {
-                            display = nullptr;
+                hintDisplay = nullptr;
+                for (const auto& [token, display] : mDisplays) {
+                    if (layer->belongsToDisplay(display->getLayerStack(), display->isPrimary())) {
+                        if (hintDisplay) {
+                            hintDisplay = nullptr;
                             break;
                         } else {
-                            display = mDisplays[i];
+                            hintDisplay = display;
                         }
                     }
                 }
             }
 
-            if (!display) {
+            if (!hintDisplay) {
                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
                 // redraw after transform hint changes. See bug 8508397.
 
                 // could be null when this layer is using a layerStack
                 // that is not visible on any display. Also can occur at
                 // screen off/on times.
-                display = getDefaultDisplayDeviceLocked();
+                hintDisplay = getDefaultDisplayDeviceLocked();
             }
 
-            // disp can be null if there is no display available at all to get
+            // could be null if there is no display available at all to get
             // the transform hint from.
-            if (display) {
-                layer->updateTransformHint(display);
+            if (hintDisplay) {
+                layer->updateTransformHint(hintDisplay);
             }
 
             first = false;
@@ -2566,8 +2555,7 @@
 
 void SurfaceFlinger::updateCursorAsync()
 {
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (display->getHwcDisplayId() < 0) {
             continue;
         }
@@ -2744,8 +2732,7 @@
 }
 
 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         if (layer->belongsToDisplay(display->getLayerStack(), display->isPrimary())) {
             display->dirtyRegion.orSelf(dirty);
         }
@@ -4030,8 +4017,7 @@
 }
 
 void SurfaceFlinger::dumpDisplayIdentificationData(String8& result) const {
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         const int32_t hwcId = display->getHwcDisplayId();
         const auto displayId = getHwComposer().getHwcDisplayId(hwcId);
         if (!displayId) {
@@ -4079,8 +4065,7 @@
 
     // TODO: print out if wide-color mode is active or not
 
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         const int32_t hwcId = display->getHwcDisplayId();
         if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
             continue;
@@ -4217,8 +4202,7 @@
     colorizer.bold(result);
     result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
     colorizer.reset(result);
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         display->dump(result);
     }
     result.append("\n");
@@ -4273,8 +4257,7 @@
     /*
      * HWC layer minidump
      */
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        const auto& display = mDisplays[i];
+    for (const auto& [token, display] : mDisplays) {
         const int32_t hwcId = display->getHwcDisplayId();
         if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
             continue;
@@ -4319,9 +4302,9 @@
 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
     // Note: mStateLock is held here
     wp<IBinder> displayToken;
-    for (size_t i = 0; i < mDisplays.size(); ++i) {
-        if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
-            displayToken = mDisplays.keyAt(i);
+    for (const auto& [token, display] : mDisplays) {
+        if (display->getHwcDisplayId() == id) {
+            displayToken = token;
             break;
         }
     }