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

Commit 87a67847 authored by Andy McFadden's avatar Andy McFadden
Browse files

Always release a buffer

In GLConsumer's updateAndReleaseLocked(), we must release either
the previously-acquired buffer or the newly-acquired buffer.

Bug 13755224

Change-Id: I96adc255400ed008ba6e6ac1725ab3514c7cc8ba
parent 98e5bf2c
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -350,20 +350,24 @@ status_t GLConsumer::updateAndReleaseLocked(const BufferQueue::BufferItem& item)
{
    status_t err = NO_ERROR;

    int buf = item.mBuf;

    if (!mAttached) {
        ST_LOGE("updateAndRelease: GLConsumer is not attached to an OpenGL "
                "ES context");
        releaseBufferLocked(buf, mSlots[buf].mGraphicBuffer,
                mEglDisplay, EGL_NO_SYNC_KHR);
        return INVALID_OPERATION;
    }

    // Confirm state.
    err = checkAndUpdateEglStateLocked();
    if (err != NO_ERROR) {
        releaseBufferLocked(buf, mSlots[buf].mGraphicBuffer,
                mEglDisplay, EGL_NO_SYNC_KHR);
        return err;
    }

    int buf = item.mBuf;

    // If the mEglSlot entry is empty, create an EGLImage for the gralloc
    // buffer currently in the slot in ConsumerBase.
    //
@@ -377,6 +381,12 @@ status_t GLConsumer::updateAndReleaseLocked(const BufferQueue::BufferItem& item)
        if (image == EGL_NO_IMAGE_KHR) {
            ST_LOGW("updateAndRelease: unable to createImage on display=%p slot=%d",
                  mEglDisplay, buf);
            const sp<GraphicBuffer>& gb = mSlots[buf].mGraphicBuffer;
            ST_LOGW("buffer size=%ux%u st=%u usage=0x%x fmt=%d",
                gb->getWidth(), gb->getHeight(), gb->getStride(),
                gb->getUsage(), gb->getPixelFormat());
            releaseBufferLocked(buf, mSlots[buf].mGraphicBuffer,
                    mEglDisplay, EGL_NO_SYNC_KHR);
            return UNKNOWN_ERROR;
        }
        mEglSlots[buf].mEglImage = image;