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

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

Return fence from acquireBuffer

Change-Id: Iab22054c1dc4fd84affab3cc5bbdcd5a1e689666
parent c777b0b3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -202,6 +202,9 @@ public:

        // mBuf is the slot index of this buffer
        int mBuf;

        // mFence is a fence that will signal when the buffer is idle.
        sp<Fence> mFence;
    };

    // The following public functions is the consumer facing interface
+2 −0
Original line number Diff line number Diff line
@@ -885,11 +885,13 @@ status_t BufferQueue::acquireBuffer(BufferItem *buffer) {
        buffer->mFrameNumber = mSlots[buf].mFrameNumber;
        buffer->mTimestamp = mSlots[buf].mTimestamp;
        buffer->mBuf = buf;
        buffer->mFence = mSlots[buf].mFence;
        mSlots[buf].mAcquireCalled = true;

        mSlots[buf].mBufferState = BufferSlot::ACQUIRED;
        mQueue.erase(front);
        mDequeueCondition.broadcast();
        mSlots[buf].mFence.clear();

        ATRACE_INT(mConsumerName.string(), mQueue.size());
    } else {
+9 −0
Original line number Diff line number Diff line
@@ -114,6 +114,15 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
        mBufferSlot[buf] = b.mGraphicBuffer;
    }

    if (b.mFence.get()) {
        err = b.mFence->wait(Fence::TIMEOUT_NEVER);
        if (err != OK) {
            CC_LOGE("Failed to wait for fence of acquired buffer: %s (%d)",
                    strerror(-err), err);
            return err;
        }
    }

    err = mBufferSlot[buf]->lock(
        GraphicBuffer::USAGE_SW_READ_OFTEN,
        b.mCrop,
+10 −4
Original line number Diff line number Diff line
@@ -236,8 +236,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) {
        // not accept this buffer. this is used by SurfaceFlinger to
        // reject buffers which have the wrong size
        if (rejecter && rejecter->reject(mEGLSlots[buf].mGraphicBuffer, item)) {
            mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR,
                    Fence::NO_FENCE);
            mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence);
            glBindTexture(mTexTarget, mTexName);
            return NO_ERROR;
        }
@@ -261,6 +260,14 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) {
            }
        }

        // Temporary; fence will be provided to clients soon
        if (item.mFence.get()) {
            err = item.mFence->wait(Fence::TIMEOUT_NEVER);
            if (err != OK) {
                ST_LOGE("updateTexImage: failure waiting for fence: %d", err);
            }
        }

        if (err == NO_ERROR) {
            GLint error;
            while ((error = glGetError()) != GL_NO_ERROR) {
@@ -284,8 +291,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) {
        if (err != NO_ERROR) {
            // Release the buffer we just acquired.  It's not safe to
            // release the old buffer, so instead we just drop the new frame.
            mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR,
                    Fence::NO_FENCE);
            mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence);
            return err;
        }

+10 −0
Original line number Diff line number Diff line
@@ -106,6 +106,16 @@ void FramebufferSurface::onFirstRef() {
                    if (item.mGraphicBuffer != 0) {
                        self->mBuffers[item.mBuf] = item.mGraphicBuffer;
                    }
                    if (item.mFence.get()) {
                        err = item.mFence->wait(Fence::TIMEOUT_NEVER);
                        if (err) {
                            ALOGE("failed waiting for buffer's fence: %d", err);
                            self->mBufferQueue->releaseBuffer(item.mBuf,
                                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR,
                                    item.mFence);
                            return;
                        }
                    }
                    self->fbDev->post(self->fbDev, self->mBuffers[item.mBuf]->handle);
                    if (self->mCurrentBufferIndex >= 0) {
                        self->mBufferQueue->releaseBuffer(self->mCurrentBufferIndex,