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

Commit c3973608 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

the visible region sent to HWC was garbage

we used to have a visibleRegion object per layer, but now
it's per screen; so at somepoint the code got changed to
calculate the per-screen visible region on the stack and that's
what got passed to HWC.

we're now setting the visibleRegionScreen at each frame and
freeing at after the HWC set() call. We use the underlaying
SharedBuffer so that in most cases we don't have to allocate,
free or copy memory around.

Bug: 7089478
Change-Id: I24fa556c76613a225d9fe7a6c6b727bb476144d8
parent 50f262fe
Loading
Loading
Loading
Loading
+16 −3
Original line number Original line Diff line number Diff line
@@ -573,9 +573,12 @@ public:
        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
    }
    }
    virtual void setVisibleRegionScreen(const Region& reg) {
    virtual void setVisibleRegionScreen(const Region& reg) {
        getLayer()->visibleRegionScreen.rects =
        // Region::getSharedBuffer creates a reference to the underlying
                reinterpret_cast<hwc_rect_t const *>(
        // SharedBuffer of this Region, this reference is freed
                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
        // in onDisplayed()
        hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen;
        SharedBuffer const* sb = reg.getSharedBuffer(&visibleRegion.numRects);
        visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>(sb->data());
    }
    }
    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
        if (buffer == 0 || buffer->handle == 0) {
        if (buffer == 0 || buffer->handle == 0) {
@@ -586,6 +589,16 @@ public:
            getLayer()->handle = buffer->handle;
            getLayer()->handle = buffer->handle;
        }
        }
    }
    }
    virtual void onDisplayed() {
        hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen;
        SharedBuffer const* sb = SharedBuffer::bufferFromData(visibleRegion.rects);
        if (sb) {
            sb->release();
            // not technically needed but safer
            visibleRegion.numRects = 0;
            visibleRegion.rects = NULL;
        }
    }
};
};


/*
/*
+1 −0
Original line number Original line Diff line number Diff line
@@ -130,6 +130,7 @@ public:
        virtual void setVisibleRegionScreen(const Region& reg) = 0;
        virtual void setVisibleRegionScreen(const Region& reg) = 0;
        virtual void setBuffer(const sp<GraphicBuffer>& buffer) = 0;
        virtual void setBuffer(const sp<GraphicBuffer>& buffer) = 0;
        virtual void setAcquireFenceFd(int fenceFd) = 0;
        virtual void setAcquireFenceFd(int fenceFd) = 0;
        virtual void onDisplayed() = 0;
    };
    };


    /*
    /*
+1 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client)


void Layer::onLayerDisplayed(const sp<const DisplayDevice>& hw,
void Layer::onLayerDisplayed(const sp<const DisplayDevice>& hw,
        HWComposer::HWCLayerInterface* layer) {
        HWComposer::HWCLayerInterface* layer) {
    LayerBaseClient::onLayerDisplayed(hw, layer);
    if (layer) {
    if (layer) {
        mSurfaceTexture->setReleaseFence(layer->getAndResetReleaseFenceFd());
        mSurfaceTexture->setReleaseFence(layer->getAndResetReleaseFenceFd());
    }
    }
+12 −1
Original line number Original line Diff line number Diff line
@@ -288,12 +288,16 @@ void LayerBase::setGeometry(
    // scaling is already applied in transformedBounds
    // scaling is already applied in transformedBounds
    layer.setFrame(transformedBounds);
    layer.setFrame(transformedBounds);
    layer.setCrop(transformedBounds.getBounds());
    layer.setCrop(transformedBounds.getBounds());
    layer.setVisibleRegionScreen(tr.transform(visibleRegion));
}
}


void LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw,
void LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw,
        HWComposer::HWCLayerInterface& layer) {
        HWComposer::HWCLayerInterface& layer) {
    layer.setBuffer(0);
    layer.setBuffer(0);
    // we have to set the visible region on every frame because
    // we currently free it during onLayerDisplayed(), which is called
    // after HWComposer::commit() -- every frame.
    const Transform& tr = hw->getTransform();
    layer.setVisibleRegionScreen(tr.transform(visibleRegion));
}
}


void LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw,
void LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw,
@@ -301,6 +305,13 @@ void LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw,
    layer.setAcquireFenceFd(-1);
    layer.setAcquireFenceFd(-1);
}
}


void LayerBase::onLayerDisplayed(const sp<const DisplayDevice>& hw,
        HWComposer::HWCLayerInterface* layer) {
    if (layer) {
        layer->onDisplayed();
    }
}

void LayerBase::setFiltering(bool filtering)
void LayerBase::setFiltering(bool filtering)
{
{
    mFiltering = filtering;
    mFiltering = filtering;
+1 −1
Original line number Original line Diff line number Diff line
@@ -218,7 +218,7 @@ public:
    /** called after page-flip
    /** called after page-flip
     */
     */
    virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw,
    virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw,
            HWComposer::HWCLayerInterface* layer) { }
            HWComposer::HWCLayerInterface* layer);


    /** called before composition.
    /** called before composition.
     * returns true if the layer has pending updates.
     * returns true if the layer has pending updates.