Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bb9e656 authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

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
parent 64812298
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -285,4 +285,16 @@ struct DisplayDeviceCreationArgs {
    DisplayModes supportedModes;
    DisplayModes supportedModes;
};
};


// Predicates for display lookup.

struct WithLayerStack {
    explicit WithLayerStack(ui::LayerStack layerStack) : layerStack(layerStack) {}

    bool operator()(const DisplayDevice& display) const {
        return display.getLayerStack() == layerStack;
    }

    ui::LayerStack layerStack;
};

} // namespace android
} // namespace android
+17 −38
Original line number Original line Diff line number Diff line
@@ -2212,11 +2212,10 @@ void SurfaceFlinger::postComposition() {
            mTunnelModeEnabledReporter->updateTunnelModeStatus();
            mTunnelModeEnabledReporter->updateTunnelModeStatus();
        }
        }
        hdrInfoListeners.reserve(mHdrLayerInfoListeners.size());
        hdrInfoListeners.reserve(mHdrLayerInfoListeners.size());
        for (auto& [key, value] : mHdrLayerInfoListeners) {
        for (const auto& [displayId, reporter] : mHdrLayerInfoListeners) {
            if (value && value->hasListeners()) {
            if (reporter && reporter->hasListeners()) {
                auto listenersDisplay = getDisplayById(key);
                if (const auto display = getDisplayDeviceLocked(displayId)) {
                if (listenersDisplay) {
                    hdrInfoListeners.emplace_back(display->getCompositionDisplay(), reporter);
                    hdrInfoListeners.emplace_back(listenersDisplay->getCompositionDisplay(), value);
                }
                }
            }
            }
        }
        }
@@ -5800,34 +5799,6 @@ status_t SurfaceFlinger::setSchedFifo(bool enabled) {
    return NO_ERROR;
    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,
status_t SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
                                        const sp<IScreenCaptureListener>& captureListener) {
                                        const sp<IScreenCaptureListener>& captureListener) {
    ATRACE_CALL();
    ATRACE_CALL();
@@ -5839,7 +5810,7 @@ status_t SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,


    if (!args.displayToken) return BAD_VALUE;
    if (!args.displayToken) return BAD_VALUE;


    wp<DisplayDevice> displayWeak;
    wp<const DisplayDevice> displayWeak;
    ui::LayerStack layerStack;
    ui::LayerStack layerStack;
    ui::Size reqSize(args.width, args.height);
    ui::Size reqSize(args.width, args.height);
    ui::Dataspace dataspace;
    ui::Dataspace dataspace;
@@ -5880,18 +5851,26 @@ status_t SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
                               captureListener);
                               captureListener);
}
}


status_t SurfaceFlinger::captureDisplay(uint64_t displayOrLayerStack,
status_t SurfaceFlinger::captureDisplay(uint64_t displayIdOrLayerStack,
                                        const sp<IScreenCaptureListener>& captureListener) {
                                        const sp<IScreenCaptureListener>& captureListener) {
    ui::LayerStack layerStack;
    ui::LayerStack layerStack;
    wp<DisplayDevice> displayWeak;
    wp<const DisplayDevice> displayWeak;
    ui::Size size;
    ui::Size size;
    ui::Dataspace dataspace;
    ui::Dataspace dataspace;
    {
    {
        Mutex::Autolock lock(mStateLock);
        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) {
        if (!display) {
            return NAME_NOT_FOUND;
            return NAME_NOT_FOUND;
        }
        }

        layerStack = display->getLayerStack();
        layerStack = display->getLayerStack();
        displayWeak = display;
        displayWeak = display;


@@ -5979,7 +5958,7 @@ status_t SurfaceFlinger::captureLayers(const LayerCaptureArgs& args,
            }
            }
        }
        }


        const auto display = getDisplayByLayerStack(parent->getLayerStack());
        const auto display = findDisplay(WithLayerStack(parent->getLayerStack()));
        if (!display) {
        if (!display) {
            return NAME_NOT_FOUND;
            return NAME_NOT_FOUND;
        }
        }
+22 −4
Original line number Original line Diff line number Diff line
@@ -924,10 +924,6 @@ private:
                                    bool canCaptureBlackoutContent, bool regionSampling,
                                    bool canCaptureBlackoutContent, bool regionSampling,
                                    bool grayscale, ScreenCaptureResults&);
                                    bool grayscale, ScreenCaptureResults&);


    sp<DisplayDevice> getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack) REQUIRES(mStateLock);
    sp<DisplayDevice> getDisplayById(DisplayId displayId) const REQUIRES(mStateLock);
    sp<DisplayDevice> getDisplayByLayerStack(uint64_t layerStack) REQUIRES(mStateLock);

    // If the uid provided is not UNSET_UID, the traverse will skip any layers that don't have a
    // If the uid provided is not UNSET_UID, the traverse will skip any layers that don't have a
    // matching ownerUid
    // matching ownerUid
    void traverseLayersInLayerStack(ui::LayerStack, const int32_t uid, const LayerVector::Visitor&);
    void traverseLayersInLayerStack(ui::LayerStack, const int32_t uid, const LayerVector::Visitor&);
@@ -953,6 +949,14 @@ private:
        return it == mDisplays.end() ? nullptr : it->second;
        return it == mDisplays.end() ? nullptr : it->second;
    }
    }


    sp<const DisplayDevice> getDisplayDeviceLocked(PhysicalDisplayId id) const
            REQUIRES(mStateLock) {
        if (const auto token = getPhysicalDisplayTokenLocked(id)) {
            return getDisplayDeviceLocked(token);
        }
        return nullptr;
    }

    sp<const DisplayDevice> getDefaultDisplayDeviceLocked() const REQUIRES(mStateLock) {
    sp<const DisplayDevice> getDefaultDisplayDeviceLocked() const REQUIRES(mStateLock) {
        return const_cast<SurfaceFlinger*>(this)->getDefaultDisplayDeviceLocked();
        return const_cast<SurfaceFlinger*>(this)->getDefaultDisplayDeviceLocked();
    }
    }
@@ -969,6 +973,20 @@ private:
        return getDefaultDisplayDeviceLocked();
        return getDefaultDisplayDeviceLocked();
    }
    }


    // Returns the first display that matches a `bool(const DisplayDevice&)` predicate.
    template <typename Predicate>
    sp<DisplayDevice> findDisplay(Predicate p) const REQUIRES(mStateLock) {
        const auto it = std::find_if(mDisplays.begin(), mDisplays.end(),
                                     [&](const auto& pair) { return p(*pair.second); });

        return it == mDisplays.end() ? nullptr : it->second;
    }

    sp<const DisplayDevice> getDisplayDeviceLocked(DisplayId id) const REQUIRES(mStateLock) {
        // TODO(b/182939859): Replace tokens with IDs for display lookup.
        return findDisplay([id](const auto& display) { return display.getId() == id; });
    }

    // mark a region of a layer stack dirty. this updates the dirty
    // mark a region of a layer stack dirty. this updates the dirty
    // region of all screens presenting this layer stack.
    // region of all screens presenting this layer stack.
    void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty);
    void invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty);