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

Commit 7043a7df authored by Chavi Weingarten's avatar Chavi Weingarten
Browse files

Provide function to mirror display for screenrecord.

The current mirroring for shell screenrecording is by using the layer
stack mirroring. However, we want to port all layerStack mirroring to
use layer mirroring. This add a new function that allows the root layers
of a display to get mirrored by passing in a specified displayId.

The code will iterate though the layers and find root layers that are
rendered onto the desired display. SF will then clone the roots and set
them as a child of a new ContainerLayer that will be at the root of all
the mirrored roots. This is because a display may have multiple root
layers.

Test: adb shell screenrecord
Bug: 237664947
Change-Id: I31151527f5377079e2293be2c995f6a3316639da
parent b438a9f8
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2177,6 +2177,16 @@ sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFr
    return nullptr;
}

sp<SurfaceControl> SurfaceComposerClient::mirrorDisplay(DisplayId displayId) {
    gui::MirrorSurfaceResult result;
    const binder::Status status = mClient->mirrorDisplay(displayId.value, &result);
    const status_t err = statusTFromBinderStatus(status);
    if (err == NO_ERROR) {
        return new SurfaceControl(this, result.handle, result.layerId);
    }
    return nullptr;
}

status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
    if (mStatus != NO_ERROR) {
        return mStatus;
+2 −0
Original line number Diff line number Diff line
@@ -59,4 +59,6 @@ interface ISurfaceComposerClient {
    FrameStats getLayerFrameStats(IBinder handle);

    MirrorSurfaceResult mirrorSurface(IBinder mirrorFromHandle);

    MirrorSurfaceResult mirrorDisplay(long displayId);
}
+3 −0
Original line number Diff line number Diff line
@@ -174,6 +174,9 @@ public:
    MOCK_METHOD(binder::Status, mirrorSurface,
                (const sp<IBinder>& mirrorFromHandle, gui::MirrorSurfaceResult* outResult),
                (override));

    MOCK_METHOD(binder::Status, mirrorDisplay,
                (int64_t displayId, gui::MirrorSurfaceResult* outResult), (override));
};

class FakeDisplayEventDispatcher : public DisplayEventDispatcher {
+2 −0
Original line number Diff line number Diff line
@@ -341,6 +341,8 @@ public:
    //      B               B'
    sp<SurfaceControl> mirrorSurface(SurfaceControl* mirrorFromSurface);

    sp<SurfaceControl> mirrorDisplay(DisplayId displayId);

    //! Create a virtual display
    static sp<IBinder> createDisplay(const String8& displayName, bool secure);

+15 −0
Original line number Diff line number Diff line
@@ -147,5 +147,20 @@ binder::Status Client::mirrorSurface(const sp<IBinder>& mirrorFromHandle,
    return binderStatusFromStatusT(status);
}

binder::Status Client::mirrorDisplay(int64_t displayId, gui::MirrorSurfaceResult* outResult) {
    sp<IBinder> handle;
    int32_t layerId;
    LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this),
                           "MirrorRoot-" + std::to_string(displayId), 0 /* flags */,
                           gui::LayerMetadata());
    std::optional<DisplayId> id = DisplayId::fromValue(static_cast<uint64_t>(displayId));
    status_t status = mFlinger->mirrorDisplay(*id, args, &handle, &layerId);
    if (status == NO_ERROR) {
        outResult->handle = handle;
        outResult->layerId = layerId;
    }
    return binderStatusFromStatusT(status);
}

// ---------------------------------------------------------------------------
}; // namespace android
Loading