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

Commit f3b00125 authored by Jim Shargo's avatar Jim Shargo
Browse files

BufferItemConsumer: Add/expose methods

Removes unneccessary flag surrounding releaseBuffer, which is flag gated
everywhere else.

Adds attachBuffer, which wraps IGBP's version of the same method,
allowing users to attach a buffer to the consumer.

Bug: 393639203
Flag: EXEMPT covered elsewhere
Test: new tests

Change-Id: I13283720f0f91380301d1aca180c4681c16997d7
parent fd4edb2e
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "BufferItemConsumer"
//#define ATRACE_TAG ATRACE_TAG_GRAPHICS
#include <utils/Errors.h>
#include <utils/Log.h>

#include <inttypes.h>
@@ -132,13 +133,36 @@ status_t BufferItemConsumer::acquireBuffer(BufferItem *item,
    return OK;
}

status_t BufferItemConsumer::attachBuffer(const sp<GraphicBuffer>& buffer) {
    if (!buffer) {
        BI_LOGE("BufferItemConsumer::attachBuffer no input buffer specified.");
        return BAD_VALUE;
    }

    Mutex::Autolock _l(mMutex);

    int slot = INVALID_BUFFER_SLOT;
    status_t status = mConsumer->attachBuffer(&slot, buffer);
    if (status != OK) {
        BI_LOGE("BufferItemConsumer::attachBuffer unable to attach buffer %d", status);
        return status;
    }

    mSlots[slot] = {
            .mGraphicBuffer = buffer,
            .mFence = nullptr,
            .mFrameNumber = 0,
    };

    return OK;
}

status_t BufferItemConsumer::releaseBuffer(const BufferItem &item,
        const sp<Fence>& releaseFence) {
    Mutex::Autolock _l(mMutex);
    return releaseBufferSlotLocked(item.mSlot, item.mGraphicBuffer, releaseFence);
}

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
status_t BufferItemConsumer::releaseBuffer(const sp<GraphicBuffer>& buffer,
                                           const sp<Fence>& releaseFence) {
    Mutex::Autolock _l(mMutex);
@@ -154,7 +178,6 @@ status_t BufferItemConsumer::releaseBuffer(const sp<GraphicBuffer>& buffer,

    return releaseBufferSlotLocked(slotIndex, buffer, releaseFence);
}
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)

status_t BufferItemConsumer::releaseBufferSlotLocked(int slotIndex, const sp<GraphicBuffer>& buffer,
                                                     const sp<Fence>& releaseFence) {
+8 −2
Original line number Diff line number Diff line
@@ -96,6 +96,14 @@ class BufferItemConsumer: public ConsumerBase
    status_t acquireBuffer(BufferItem* item, nsecs_t presentWhen,
            bool waitForFence = true);

    // Transfer ownership of a buffer to the BufferQueue. On NO_ERROR, the buffer
    // is considered as if it were acquired. Buffer must not be null.
    //
    // Returns
    //  - BAD_VALUE if buffer is null
    //  - INVALID_OPERATION if too many buffers have already been acquired
    status_t attachBuffer(const sp<GraphicBuffer>& buffer);

    // Returns an acquired buffer to the queue, allowing it to be reused. Since
    // only a fixed number of buffers may be acquired at a time, old buffers
    // must be released by calling releaseBuffer to ensure new buffers can be
@@ -105,10 +113,8 @@ class BufferItemConsumer: public ConsumerBase
    status_t releaseBuffer(const BufferItem &item,
            const sp<Fence>& releaseFence = Fence::NO_FENCE);

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
    status_t releaseBuffer(const sp<GraphicBuffer>& buffer,
                           const sp<Fence>& releaseFence = Fence::NO_FENCE);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)

protected:
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
+23 −0
Original line number Diff line number Diff line
@@ -245,6 +245,29 @@ TEST_F(BufferItemConsumerTest, ResizeAcquireCount) {
    EXPECT_EQ(OK, mBIC->setMaxAcquiredBufferCount(kMaxLockedBuffers - 1));
}

TEST_F(BufferItemConsumerTest, AttachBuffer) {
    ASSERT_EQ(OK, mBIC->setMaxAcquiredBufferCount(1));

    int slot;
    DequeueBuffer(&slot);
    QueueBuffer(slot);
    AcquireBuffer(&slot);

    sp<GraphicBuffer> newBuffer1 = sp<GraphicBuffer>::make(kWidth, kHeight, kFormat, kUsage);
    sp<GraphicBuffer> newBuffer2 = sp<GraphicBuffer>::make(kWidth, kHeight, kFormat, kUsage);

    // For some reason, you can attach an extra buffer?
    // b/400973991 to investigate
    EXPECT_EQ(OK, mBIC->attachBuffer(newBuffer1));
    EXPECT_EQ(INVALID_OPERATION, mBIC->attachBuffer(newBuffer2));

    ReleaseBuffer(slot);

    EXPECT_EQ(OK, mBIC->attachBuffer(newBuffer2));
    EXPECT_EQ(OK, mBIC->releaseBuffer(newBuffer1, Fence::NO_FENCE));
    EXPECT_EQ(OK, mBIC->releaseBuffer(newBuffer2, Fence::NO_FENCE));
}

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
// Test that delete BufferItemConsumer triggers onBufferFreed.
TEST_F(BufferItemConsumerTest, DetachBufferWithBuffer) {