// acquireBufferLocked fetches the next buffer from the BufferQueue and
// updates the buffer slot for the buffer returned.
//
// Derived classes should override this method to perform any
// initialization that must take place the first time a buffer is assigned
// to a slot.  If it is overridden the derived class's implementation must
// call ConsumerBase::acquireBufferLocked.
status_t ConsumerBase::acquireBufferLocked(BufferItem *item,
        nsecs_t presentWhen, uint64_t maxFrameNumber) {
    ...
    status_t err = mConsumer->acquireBuffer(item, presentWhen, maxFrameNumber);
    if (err != NO_ERROR) {
        return err;
    }

    if (item->mGraphicBuffer != nullptr) {
        if (mSlots[item->mSlot].mGraphicBuffer != nullptr) {
            freeBufferLocked(item->mSlot);
        }
        mSlots[item->mSlot].mGraphicBuffer = item->mGraphicBuffer;
    }

    mSlots[item->mSlot].mFrameNumber = item->mFrameNumber;
    mSlots[item->mSlot].mFence = item->mFence;

    CB_LOGV("acquireBufferLocked: -> slot=%d/%" PRIu64,
            item->mSlot, item->mFrameNumber);

    return OK;
}

调用 BufferQueueConsumer::acquireBuffer() 获取 BufferItem。mGraphicBuffer 不为空,说明该 buffer 没有获取过,更新 mSlots 中相应的 mGraphicBuffer。mSlots 是在 ConsumerBase 中定义的内部类 Slot 数组,它是用来维护获取过的 buffer。

该函数获取的 buffer 会在 BufferLayerConsumer::updateAndReleaseLocked() 中更新 mCurrentTextureBuffer