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

Commit db66e627 authored by Robert Carr's avatar Robert Carr
Browse files

SurfaceFlinger: Add parent-less relative layering.

This is a temporary functionality for the intermediate state where not
all child-surface like things in WM land are ported to use Child
Surfaces. In particular, we have ported SurfaceView to use child
surfaces and relative Z ordering. However the TV frameworks provide a
View framework component which overlays views over the SurfaceView but
below the main application window. Since we have not ported View
framework surfaces to use child layers, there is nothing the WM or
View Framework can do about this situation. Luckily the WM API's to
have requested this are @hide but we have the one media framework
component using it. In order to solve this issue we provide a method
to set Z ordering relative to another window without inheriting
its coordinate space as a child window would. This way the WM can
recognize these TYPE_APPLICATION_MEDIA_OVERLAY windows and Z-order
them at -1 with respect to the parents (and the SurfaceView can be at
-2).

Test: Included in transaction tests. Also manual test of bug repro steps with accomp frameworks/base CL
Bug: 36693738
Change-Id: I921852d3d34f67f79ec745b9703f9e679867e7a1
parent 1d472756
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -146,6 +146,8 @@ public:
    status_t    setFlags(const sp<IBinder>& id, uint32_t flags, uint32_t mask);
    status_t    setTransparentRegionHint(const sp<IBinder>& id, const Region& transparent);
    status_t    setLayer(const sp<IBinder>& id, int32_t layer);
    status_t    setRelativeLayer(const sp<IBinder>& id,
            const sp<IBinder>& relativeTo, int32_t layer);
    status_t    setAlpha(const sp<IBinder>& id, float alpha=1.0f);
    status_t    setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, float dtdy, float dsdy);
    status_t    setPosition(const sp<IBinder>& id, float x, float y);
+21 −0
Original line number Diff line number Diff line
@@ -62,6 +62,27 @@ public:

    status_t    setLayerStack(uint32_t layerStack);
    status_t    setLayer(int32_t layer);

    // Sets a Z order relative to the Surface specified by "relativeTo" but
    // without becoming a full child of the relative. Z-ordering works exactly
    // as if it were a child however.
    //
    // As a nod to sanity, only non-child surfaces may have a relative Z-order.
    //
    // This overrides any previous and is overriden by any future calls
    // to setLayer.
    //
    // If the relative dissapears, the Surface will have no layer and be
    // invisible, until the next time set(Relative)Layer is called.
    //
    // TODO: This is probably a hack. Currently it exists only to work around
    // some framework usage of the hidden APPLICATION_MEDIA_OVERLAY window type
    // which allows inserting a window between a SurfaceView and it's main application
    // window. However, since we are using child windows for the SurfaceView, but not using
    // child windows elsewhere in O, the WindowManager can't set the layer appropriately.
    // This is only used by the "TvInputService" and following the port of ViewRootImpl
    // to child surfaces, we can then port this and remove this method.
    status_t    setRelativeLayer(const sp<IBinder>& relativeTo, int32_t layer);
    status_t    setPosition(float x, float y);
    status_t    setSize(uint32_t w, uint32_t h);
    status_t    hide();
+4 −1
Original line number Diff line number Diff line
@@ -58,7 +58,8 @@ struct layer_state_t {
        eOverrideScalingModeChanged = 0x00000800,
        eGeometryAppliesWithResize  = 0x00001000,
        eReparentChildren           = 0x00002000,
        eDetachChildren             = 0x00004000
        eDetachChildren             = 0x00004000,
        eRelativeLayerChanged       = 0x00008000
    };

    layer_state_t()
@@ -104,6 +105,8 @@ struct layer_state_t {

            sp<IGraphicBufferProducer> barrierGbp;

            sp<IBinder>     relativeLayerHandle;

            // non POD must be last. see write/read
            Region          transparentRegion;
};
+2 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ status_t layer_state_t::write(Parcel& output) const
    output.writeUint64(frameNumber);
    output.writeInt32(overrideScalingMode);
    output.writeStrongBinder(IInterface::asBinder(barrierGbp));
    output.writeStrongBinder(relativeLayerHandle);
    output.write(transparentRegion);
    return NO_ERROR;
}
@@ -75,6 +76,7 @@ status_t layer_state_t::read(const Parcel& input)
    overrideScalingMode = input.readInt32();
    barrierGbp =
        interface_cast<IGraphicBufferProducer>(input.readStrongBinder());
    relativeLayerHandle = input.readStrongBinder();
    input.read(transparentRegion);
    return NO_ERROR;
}
+21 −0
Original line number Diff line number Diff line
@@ -149,6 +149,8 @@ public:
            uint32_t w, uint32_t h);
    status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
            int32_t z);
    status_t setRelativeLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
            const sp<IBinder>& relativeTo, int32_t z);
    status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
            uint32_t flags, uint32_t mask);
    status_t setTransparentRegionHint(
@@ -343,6 +345,20 @@ status_t Composer::setLayer(const sp<SurfaceComposerClient>& client,
    return NO_ERROR;
}

status_t Composer::setRelativeLayer(const sp<SurfaceComposerClient>& client,
        const sp<IBinder>& id, const sp<IBinder>& relativeTo,
        int32_t z) {
    Mutex::Autolock _l(mLock);
    layer_state_t* s = getLayerStateLocked(client, id);
    if (!s) {
        return BAD_INDEX;
    }
    s->what |= layer_state_t::eRelativeLayerChanged;
    s->relativeLayerHandle = relativeTo;
    s->z = z;
    return NO_ERROR;
}

status_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
        const sp<IBinder>& id, uint32_t flags,
        uint32_t mask) {
@@ -760,6 +776,11 @@ status_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) {
    return getComposer().setLayer(this, id, z);
}

status_t SurfaceComposerClient::setRelativeLayer(const sp<IBinder>& id,
        const sp<IBinder>& relativeTo, int32_t z) {
    return getComposer().setRelativeLayer(this, id, relativeTo, z);
}

status_t SurfaceComposerClient::hide(const sp<IBinder>& id) {
    return getComposer().setFlags(this, id,
            layer_state_t::eLayerHidden,
Loading