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

Commit 51d3d176 authored by Riley Andrews's avatar Riley Andrews Committed by Android (Google) Code Review
Browse files

Merge "Within CpuConsumer, use gralloc lockAsync/unlockAsync" into lmp-dev

parents a54f3b2f d53e0523
Loading
Loading
Loading
Loading
+60 −31
Original line number Diff line number Diff line
@@ -93,18 +93,38 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {

    int buf = b.mBuf;

    void *bufferPointer = NULL;
    android_ycbcr ycbcr = android_ycbcr();

    if (b.mFence.get()) {
        err = b.mFence->waitForever("CpuConsumer::lockNextBuffer");
        if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
                HAL_PIXEL_FORMAT_YCbCr_420_888) {
            err = mSlots[buf].mGraphicBuffer->lockAsyncYCbCr(
                GraphicBuffer::USAGE_SW_READ_OFTEN,
                b.mCrop,
                &ycbcr,
                b.mFence->dup());

            if (err != OK) {
            CC_LOGE("Failed to wait for fence of acquired buffer: %s (%d)",
                CC_LOGE("Unable to lock YCbCr buffer for CPU reading: %s (%d)",
                        strerror(-err), err);
                return err;
            }
    }

    void *bufferPointer = NULL;
    android_ycbcr ycbcr = android_ycbcr();
            bufferPointer = ycbcr.y;
        } else {
            err = mSlots[buf].mGraphicBuffer->lockAsync(
                GraphicBuffer::USAGE_SW_READ_OFTEN,
                b.mCrop,
                &bufferPointer,
                b.mFence->dup());

            if (err != OK) {
                CC_LOGE("Unable to lock buffer for CPU reading: %s (%d)",
                        strerror(-err), err);
                return err;
            }
        }
    } else {
        if (mSlots[buf].mGraphicBuffer->getPixelFormat() ==
                HAL_PIXEL_FORMAT_YCbCr_420_888) {
            err = mSlots[buf].mGraphicBuffer->lockYCbCr(
@@ -130,6 +150,7 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) {
                return err;
            }
        }
    }

    size_t lockedIdx = 0;
    for (; lockedIdx < mMaxLockedBuffers; lockedIdx++) {
@@ -189,14 +210,22 @@ status_t CpuConsumer::unlockBuffer(const LockedBuffer &nativeBuffer) {

status_t CpuConsumer::releaseAcquiredBufferLocked(int lockedIdx) {
    status_t err;
    int fd = -1;

    err = mAcquiredBuffers[lockedIdx].mGraphicBuffer->unlock();
    err = mAcquiredBuffers[lockedIdx].mGraphicBuffer->unlockAsync(&fd);
    if (err != OK) {
        CC_LOGE("%s: Unable to unlock graphic buffer %d", __FUNCTION__,
                lockedIdx);
        return err;
    }
    int buf = mAcquiredBuffers[lockedIdx].mSlot;
    if (CC_LIKELY(fd != -1)) {
        sp<Fence> fence(new Fence(fd));
        addReleaseFenceLocked(
            mAcquiredBuffers[lockedIdx].mSlot,
            mSlots[buf].mGraphicBuffer,
            fence);
    }

    // release the buffer if it hasn't already been freed by the BufferQueue.
    // This can happen, for example, when the producer of this buffer