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

Commit 24a05e01 authored by Rob Carr's avatar Rob Carr Committed by android-build-merger
Browse files

Merge "SurfaceFlinger: Add exclusion list for captureLayers." into qt-dev

am: dee669c2

Change-Id: I9d010812227862cd79166917e4a24d6142638a34
parents 007a9139 dee669c2
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -141,16 +141,22 @@ public:
        return result;
    }

    virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder,
                                   sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace,
                                   const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                                   float frameScale, bool childrenOnly) {
    virtual status_t captureLayers(
            const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
            const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat,
            const Rect& sourceCrop,
            const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeLayers, float frameScale,
            bool childrenOnly) {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(layerHandleBinder);
        data.writeInt32(static_cast<int32_t>(reqDataspace));
        data.writeInt32(static_cast<int32_t>(reqPixelFormat));
        data.write(sourceCrop);
        data.writeInt32(excludeLayers.size());
        for (auto el : excludeLayers) {
            data.writeStrongBinder(el);
        }
        data.writeFloat(frameScale);
        data.writeBool(childrenOnly);
        status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply);
@@ -1038,11 +1044,20 @@ status_t BnSurfaceComposer::onTransact(
            sp<GraphicBuffer> outBuffer;
            Rect sourceCrop(Rect::EMPTY_RECT);
            data.read(sourceCrop);

            std::unordered_set<sp<IBinder>, SpHash<IBinder>> excludeHandles;
            int numExcludeHandles = data.readInt32();
            excludeHandles.reserve(numExcludeHandles);
            for (int i = 0; i < numExcludeHandles; i++) {
                excludeHandles.emplace(data.readStrongBinder());
            }

            float frameScale = data.readFloat();
            bool childrenOnly = data.readBool();

            status_t res = captureLayers(layerHandleBinder, &outBuffer, reqDataspace,
                                         reqPixelFormat, sourceCrop, frameScale, childrenOnly);
            status_t res =
                    captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat,
                                  sourceCrop, excludeHandles, frameScale, childrenOnly);
            reply->writeInt32(res);
            if (res == NO_ERROR) {
                reply->write(*outBuffer);
+9 −7
Original line number Diff line number Diff line
@@ -1570,18 +1570,20 @@ status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle,
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;
    status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat,
                                    sourceCrop, frameScale, false /* childrenOnly */);
                                    sourceCrop, {}, frameScale, false /* childrenOnly */);
    return ret;
}

status_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle,
                                              const ui::Dataspace reqDataSpace,
status_t ScreenshotClient::captureChildLayers(
        const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace,
        const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
        const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles,
        float frameScale, sp<GraphicBuffer>* outBuffer) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;
    status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat,
                                    sourceCrop, frameScale, true /* childrenOnly */);
    status_t ret =
            s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop,
                             excludeHandles, frameScale, true /* childrenOnly */);
    return ret;
}
// ----------------------------------------------------------------------------
+14 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <stdint.h>
#include <sys/types.h>

#include <binder/IBinder.h>
#include <binder/IInterface.h>

#include <gui/ITransactionCompletedListener.h>
@@ -37,6 +38,7 @@
#include <utils/Vector.h>

#include <optional>
#include <unordered_set>
#include <vector>

namespace android {
@@ -243,6 +245,11 @@ public:
                             sourceCrop, reqWidth, reqHeight, useIdentityTransform, rotation);
    }

    template <class AA>
    struct SpHash {
        size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); }
    };

    /**
     * Capture a subtree of the layer hierarchy, potentially ignoring the root node.
     *
@@ -250,9 +257,11 @@ public:
     * of the buffer. The caller should pick the data space and pixel format
     * that it can consume.
     */
    virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder,
                                   sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace,
                                   const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
    virtual status_t captureLayers(
            const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
            const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat,
            const Rect& sourceCrop,
            const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeHandles,
            float frameScale = 1.0, bool childrenOnly = false) = 0;

    /**
@@ -263,7 +272,7 @@ public:
                           const Rect& sourceCrop, float frameScale = 1.0,
                           bool childrenOnly = false) {
        return captureLayers(layerHandleBinder, outBuffer, ui::Dataspace::V0_SRGB,
                             ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, childrenOnly);
                             ui::PixelFormat::RGBA_8888, sourceCrop, {}, frameScale, childrenOnly);
    }

    /* Clears the frame statistics for animations.
+7 −4
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include <ui/PixelFormat.h>

#include <gui/CpuConsumer.h>
#include <gui/ISurfaceComposer.h>
#include <gui/ITransactionCompletedListener.h>
#include <gui/LayerState.h>
#include <gui/SurfaceControl.h>
@@ -516,9 +517,11 @@ public:
    static status_t captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace,
                                  const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
                                  float frameScale, sp<GraphicBuffer>* outBuffer);
    static status_t captureChildLayers(const sp<IBinder>& layerHandle,
                                       const ui::Dataspace reqDataSpace,
    static status_t captureChildLayers(
            const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace,
            const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
            const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>&
                    excludeHandles,
            float frameScale, sp<GraphicBuffer>* outBuffer);
};

+7 −6
Original line number Diff line number Diff line
@@ -622,12 +622,13 @@ public:
                           bool /*captureSecureLayers*/) override {
        return NO_ERROR;
    }
    virtual status_t captureLayers(const sp<IBinder>& /*parentHandle*/,
                                   sp<GraphicBuffer>* /*outBuffer*/,
                                   const ui::Dataspace /*reqDataspace*/,
                                   const ui::PixelFormat /*reqPixelFormat*/,
                                   const Rect& /*sourceCrop*/, float /*frameScale*/,
                                   bool /*childrenOnly*/) override {
    virtual status_t captureLayers(
            const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/,
            const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/,
            const Rect& /*sourceCrop*/,
            const std::unordered_set<sp<IBinder>,
                                     ISurfaceComposer::SpHash<IBinder>>& /*excludeHandles*/,
            float /*frameScale*/, bool /*childrenOnly*/) override {
        return NO_ERROR;
    }
    status_t clearAnimationFrameStats() override { return NO_ERROR; }
Loading