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

Commit fcd5c990 authored by Saurabh Shah's avatar Saurabh Shah
Browse files

frameworks/native: Add support for transparent layers

Add support for marking layers transparent, which SurfaceFlinger
can drop from composition. This is meant to be set by apps, in
situations where the window above a surfaceview is fully transparent.

Change-Id: Ide979d47489a6fc4c6f47f6dd026853d83d484c0
parent d3714c2e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ struct layer_state_t {
    enum {
        eLayerHidden        = 0x01,     // SURFACE_HIDDEN in SurfaceControl.java
        eLayerOpaque        = 0x02,     // SURFACE_OPAQUE
        eLayerTransparent   = 0x80,     // SURFACE_TRANSPARENT
    };

    enum {
@@ -52,6 +53,7 @@ struct layer_state_t {
        eLayerStackChanged          = 0x00000080,
        eCropChanged                = 0x00000100,
        eOpacityChanged             = 0x00000200,
        eTransparencyChanged        = 0x80000000,
    };

    layer_state_t()
+3 −0
Original line number Diff line number Diff line
@@ -316,6 +316,9 @@ status_t Composer::setFlags(const sp<SurfaceComposerClient>& client,
    if (mask & layer_state_t::eLayerHidden) {
        s->what |= layer_state_t::eVisibilityChanged;
    }
    if (mask & layer_state_t::eLayerTransparent) {
        s->what |= layer_state_t::eTransparencyChanged;
    }
    s->flags &= ~mask;
    s->flags |= (flags & mask);
    s->mask |= mask;
+2 −1
Original line number Diff line number Diff line
@@ -1199,7 +1199,8 @@ void Layer::onPostComposition() {

bool Layer::isVisible() const {
    const Layer::State& s(mDrawingState);
    return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
    return !(s.flags & layer_state_t::eLayerHidden) &&
            !(s.flags & layer_state_t::eLayerTransparent) && s.alpha
            && (mActiveBuffer != NULL || mSidebandStream != NULL);
}

+2 −1
Original line number Diff line number Diff line
@@ -2535,7 +2535,8 @@ uint32_t SurfaceFlinger::setClientStateLocked(
                flags |= eTraversalNeeded;
        }
        if ((what & layer_state_t::eVisibilityChanged) ||
                (what & layer_state_t::eOpacityChanged)) {
                (what & layer_state_t::eOpacityChanged) ||
                (what & layer_state_t::eTransparencyChanged)) {
            // TODO: should we just use an eFlagsChanged for this?
            if (layer->setFlags(s.flags, s.mask))
                flags |= eTraversalNeeded;