SF: Parametrize display lookup
The predicate will match not only on layer stack in the next CL.
Bug: 182939859
Test: screencap -d <id or layer stack>
Change-Id: I3d30b282fdf2b80faaedd732f4ff6f032c62ca3d
Merged-In: I3d30b282fdf2b80faaedd732f4ff6f032c62ca3d
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index d76c274..bc5be7b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2212,11 +2212,10 @@
mTunnelModeEnabledReporter->updateTunnelModeStatus();
}
hdrInfoListeners.reserve(mHdrLayerInfoListeners.size());
- for (auto& [key, value] : mHdrLayerInfoListeners) {
- if (value && value->hasListeners()) {
- auto listenersDisplay = getDisplayById(key);
- if (listenersDisplay) {
- hdrInfoListeners.emplace_back(listenersDisplay->getCompositionDisplay(), value);
+ for (const auto& [displayId, reporter] : mHdrLayerInfoListeners) {
+ if (reporter && reporter->hasListeners()) {
+ if (const auto display = getDisplayDeviceLocked(displayId)) {
+ hdrInfoListeners.emplace_back(display->getCompositionDisplay(), reporter);
}
}
}
@@ -5800,34 +5799,6 @@
return NO_ERROR;
}
-sp<DisplayDevice> SurfaceFlinger::getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack) {
- if (const sp<IBinder> displayToken =
- getPhysicalDisplayTokenLocked(PhysicalDisplayId{displayOrLayerStack})) {
- return getDisplayDeviceLocked(displayToken);
- }
- // Couldn't find display by displayId. Try to get display by layerStack since virtual displays
- // may not have a displayId.
- return getDisplayByLayerStack(displayOrLayerStack);
-}
-
-sp<DisplayDevice> SurfaceFlinger::getDisplayById(DisplayId displayId) const {
- for (const auto& [token, display] : mDisplays) {
- if (display->getId() == displayId) {
- return display;
- }
- }
- return nullptr;
-}
-
-sp<DisplayDevice> SurfaceFlinger::getDisplayByLayerStack(uint64_t layerStack) {
- for (const auto& [token, display] : mDisplays) {
- if (display->getLayerStack() == layerStack) {
- return display;
- }
- }
- return nullptr;
-}
-
status_t SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
const sp<IScreenCaptureListener>& captureListener) {
ATRACE_CALL();
@@ -5839,7 +5810,7 @@
if (!args.displayToken) return BAD_VALUE;
- wp<DisplayDevice> displayWeak;
+ wp<const DisplayDevice> displayWeak;
ui::LayerStack layerStack;
ui::Size reqSize(args.width, args.height);
ui::Dataspace dataspace;
@@ -5880,18 +5851,26 @@
captureListener);
}
-status_t SurfaceFlinger::captureDisplay(uint64_t displayOrLayerStack,
+status_t SurfaceFlinger::captureDisplay(uint64_t displayIdOrLayerStack,
const sp<IScreenCaptureListener>& captureListener) {
ui::LayerStack layerStack;
- wp<DisplayDevice> displayWeak;
+ wp<const DisplayDevice> displayWeak;
ui::Size size;
ui::Dataspace dataspace;
{
Mutex::Autolock lock(mStateLock);
- sp<DisplayDevice> display = getDisplayByIdOrLayerStack(displayOrLayerStack);
+ auto display = getDisplayDeviceLocked(PhysicalDisplayId{displayIdOrLayerStack});
+
+ // Fall back to first display whose layer stack matches.
+ if (!display) {
+ const auto layerStack = static_cast<ui::LayerStack>(displayIdOrLayerStack);
+ display = findDisplay(WithLayerStack(layerStack));
+ }
+
if (!display) {
return NAME_NOT_FOUND;
}
+
layerStack = display->getLayerStack();
displayWeak = display;
@@ -5979,7 +5958,7 @@
}
}
- const auto display = getDisplayByLayerStack(parent->getLayerStack());
+ const auto display = findDisplay(WithLayerStack(parent->getLayerStack()));
if (!display) {
return NAME_NOT_FOUND;
}