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

Commit e96cc906 authored by Patrick Williams's avatar Patrick Williams
Browse files

Expose interface for setting stop layer

Bug: 403312802
Flag: com.android.graphics.surfaceflinger.flags.stop_layer
Test: MirrorLayerTest
Change-Id: Ifefc1b5715d9d6fe1865cb3d3b5c9841630cd8c4
parent 42473a6a
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2486,14 +2486,16 @@ status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32
    return err;
}

sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface) {
sp<SurfaceControl> SurfaceComposerClient::mirrorSurface(SurfaceControl* mirrorFromSurface,
                                                        SurfaceControl* stopAt) {
    if (mirrorFromSurface == nullptr) {
        return nullptr;
    }

    sp<IBinder> mirrorFromHandle = mirrorFromSurface->getHandle();
    sp<IBinder> stopAtHandle = stopAt ? stopAt->getHandle() : nullptr;
    gui::CreateSurfaceResult result;
    const binder::Status status = mClient->mirrorSurface(mirrorFromHandle, &result);
    const binder::Status status = mClient->mirrorSurface(mirrorFromHandle, stopAtHandle, &result);
    const status_t err = statusTFromBinderStatus(status);
    if (err == NO_ERROR) {
        return sp<SurfaceControl>::make(this, result.handle, result.layerId,
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ interface ISurfaceComposerClient {
     */
    FrameStats getLayerFrameStats(IBinder handle);

    CreateSurfaceResult mirrorSurface(IBinder mirrorFromHandle);
    CreateSurfaceResult mirrorSurface(IBinder mirrorFromHandle, @nullable IBinder stopAtHandle);

    CreateSurfaceResult mirrorDisplay(long displayId);

+13 −1
Original line number Diff line number Diff line
@@ -389,7 +389,19 @@ public:
    //      A               A'
    //      |               |
    //      B               B'
    sp<SurfaceControl> mirrorSurface(SurfaceControl* mirrorFromSurface);
    //
    // The mirrored hierarchy will exclude all layers z-ordered above the layer specified by
    // stopAt. With stopAt specified as B:
    //
    //  Real Hierarchy    Mirror
    //                      SC (value that's returned)
    //                      |
    //      A               A'
    //      |
    //      B
    //
    sp<SurfaceControl> mirrorSurface(SurfaceControl* mirrorFromSurface,
                                     SurfaceControl* stopAt = nullptr);

    sp<SurfaceControl> mirrorDisplay(DisplayId displayId);

+2 −1
Original line number Diff line number Diff line
@@ -99,10 +99,11 @@ binder::Status Client::getLayerFrameStats(const sp<IBinder>& handle, gui::FrameS
}

binder::Status Client::mirrorSurface(const sp<IBinder>& mirrorFromHandle,
                                     const sp<IBinder>& stopAtHandle,
                                     gui::CreateSurfaceResult* outResult) {
    LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this), "MirrorRoot",
                           0 /* flags */, gui::LayerMetadata());
    status_t status = mFlinger->mirrorLayer(args, mirrorFromHandle, *outResult);
    status_t status = mFlinger->mirrorLayer(args, mirrorFromHandle, stopAtHandle, *outResult);
    return binderStatusFromStatusT(status);
}

+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ private:
                                      gui::FrameStats* outStats) override;

    binder::Status mirrorSurface(const sp<IBinder>& mirrorFromHandle,
                                 const sp<IBinder>& stopAtHandle,
                                 gui::CreateSurfaceResult* outResult) override;

    binder::Status mirrorDisplay(int64_t displayId, gui::CreateSurfaceResult* outResult) override;
Loading