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

Commit 3ce46044 authored by Dan Stoza's avatar Dan Stoza
Browse files

libgui: Allow for pending releases in GLConsumer

Adds the ability for GLConsumer to record a pending release instead of
releasing the buffer immediately. This will be used by SurfaceFlinger
to latch a new buffer without having to immediately release the old
one, since it needs to get a fence from HWC before releasing.

Change-Id: I8cc3ce7d5ff80e2ea4b4d681b028db042352d229
parent 651bf314
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -253,10 +253,25 @@ protected:

    static bool isExternalFormat(PixelFormat format);

    struct PendingRelease {
        PendingRelease() : isPending(false), currentTexture(-1),
                graphicBuffer(), display(nullptr), fence(nullptr) {}

        bool isPending;
        int currentTexture;
        sp<GraphicBuffer> graphicBuffer;
        EGLDisplay display;
        EGLSyncKHR fence;
    };

    // This releases the buffer in the slot referenced by mCurrentTexture,
    // then updates state to refer to the BufferItem, which must be a
    // newly-acquired buffer.
    status_t updateAndReleaseLocked(const BufferItem& item);
    // newly-acquired buffer. If pendingRelease is not null, the parameters
    // which would have been passed to releaseBufferLocked upon the successful
    // completion of the method will instead be returned to the caller, so that
    // it may call releaseBufferLocked itself later.
    status_t updateAndReleaseLocked(const BufferItem& item,
            PendingRelease* pendingRelease = nullptr);

    // Binds mTexName and the current buffer to mTexTarget.  Uses
    // mCurrentTexture if it's set, mCurrentTextureImage if not.  If the
+19 −9
Original line number Diff line number Diff line
@@ -370,7 +370,8 @@ status_t GLConsumer::releaseBufferLocked(int buf,
    return err;
}

status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item)
status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item,
        PendingRelease* pendingRelease)
{
    status_t err = NO_ERROR;

@@ -432,6 +433,7 @@ status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item)

    // release old buffer
    if (mCurrentTexture != BufferQueue::INVALID_BUFFER_SLOT) {
        if (pendingRelease == nullptr) {
            status_t status = releaseBufferLocked(
                    mCurrentTexture, mCurrentTextureImage->graphicBuffer(),
                    mEglDisplay, mEglSlots[mCurrentTexture].mEglFence);
@@ -441,6 +443,14 @@ status_t GLConsumer::updateAndReleaseLocked(const BufferItem& item)
                err = status;
                // keep going, with error raised [?]
            }
        } else {
            pendingRelease->currentTexture = mCurrentTexture;
            pendingRelease->graphicBuffer =
                    mCurrentTextureImage->graphicBuffer();
            pendingRelease->display = mEglDisplay;
            pendingRelease->fence = mEglSlots[mCurrentTexture].mEglFence;
            pendingRelease->isPending = true;
        }
    }

    // Update the GLConsumer state.