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

Commit c5c5a14c authored by Jesse Hall's avatar Jesse Hall
Browse files

Only set acquire fences on overlay layers

Change-Id: I08e8173f83580de5a4e43a0ba5ea03e5ec6e8782
parent dc5b485f
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -300,20 +300,21 @@ void Layer::setPerFrameData(HWComposer::HWCLayerInterface& layer) {
    // NOTE: buffer can be NULL if the client never drew into this
    // layer yet, or if we ran out of memory
    layer.setBuffer(buffer);
}

void Layer::setAcquireFence(HWComposer::HWCLayerInterface& layer) {
    int fenceFd = -1;
    if (mNeedHwcFence) {
        sp<Fence> fence = mSurfaceTexture->getCurrentFence();
        if (fence.get()) {
            int fenceFd = fence->dup();
            fenceFd = fence->dup();
            if (fenceFd == -1) {
                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
            }
            layer.setAcquireFenceFd(fenceFd);
        }
        mNeedHwcFence = false;
    } else {
        layer.setAcquireFenceFd(-1);
    }
    layer.setAcquireFenceFd(fenceFd);
}

void Layer::onDraw(const DisplayHardware& hw, const Region& clip) const
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public:
    // LayerBase interface
    virtual void setGeometry(HWComposer::HWCLayerInterface& layer);
    virtual void setPerFrameData(HWComposer::HWCLayerInterface& layer);
    virtual void setAcquireFence(HWComposer::HWCLayerInterface& layer);
    virtual void onDraw(const DisplayHardware& hw, const Region& clip) const;
    virtual uint32_t doTransaction(uint32_t transactionFlags);
    virtual void lockPageFlip(bool& recomputeVisibleRegions);
+4 −0
Original line number Diff line number Diff line
@@ -299,6 +299,10 @@ void LayerBase::setPerFrameData(HWComposer::HWCLayerInterface& layer) {
    layer.setBuffer(0);
}

void LayerBase::setAcquireFence(HWComposer::HWCLayerInterface& layer) {
    layer.setAcquireFenceFd(-1);
}

void LayerBase::setFiltering(bool filtering)
{
    mFiltering = filtering;
+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ public:

    virtual void setGeometry(HWComposer::HWCLayerInterface& layer);
    virtual void setPerFrameData(HWComposer::HWCLayerInterface& layer);

    virtual void setAcquireFence(HWComposer::HWCLayerInterface& layer);

    /**
     * draw - performs some global clipping optimizations
+15 −2
Original line number Diff line number Diff line
@@ -528,12 +528,25 @@ void SurfaceFlinger::postFramebuffer()
    // h/w composer.

    const DisplayHardware& hw(getDefaultDisplayHardware());
    HWComposer& hwc(hw.getHwComposer());
    size_t numLayers = mVisibleLayersSortedByZ.size();
    const nsecs_t now = systemTime();
    mDebugInSwapBuffers = now;

    if (hwc.initCheck() == NO_ERROR) {
        HWComposer::LayerListIterator cur = hwc.begin();
        const HWComposer::LayerListIterator end = hwc.end();
        for (size_t i = 0; cur != end && i < numLayers; ++i, ++cur) {
            if (cur->getCompositionType() == HWC_OVERLAY) {
                mVisibleLayersSortedByZ[i]->setAcquireFence(*cur);
            } else {
                cur->setAcquireFenceFd(-1);
            }
        }
    }

    hw.flip(mSwapRegion);

    size_t numLayers = mVisibleLayersSortedByZ.size();
    HWComposer& hwc(hw.getHwComposer());
    if (hwc.initCheck() == NO_ERROR) {
        HWComposer::LayerListIterator cur = hwc.begin();
        const HWComposer::LayerListIterator end = hwc.end();