diff options
author | Dan Stoza <stoza@google.com> | 2014-03-28 15:19:08 -0700 |
---|---|---|
committer | Dan Stoza <stoza@google.com> | 2014-03-31 14:10:07 -0700 |
commit | d1c103655533321b5c74fbefff656838a8196153 (patch) | |
tree | 1b24ea69dfa297e1da50f1e58f88f36d423bcc67 /libs | |
parent | b1363d37fc6a661508fad106eb7698c5850a6c17 (diff) | |
download | frameworks_native-d1c103655533321b5c74fbefff656838a8196153.zip frameworks_native-d1c103655533321b5c74fbefff656838a8196153.tar.gz frameworks_native-d1c103655533321b5c74fbefff656838a8196153.tar.bz2 |
BufferQueue: Hook up IProducerListener
Actually call the producer listener's callback during
IGraphicBufferConsumer::releaseBuffer
Change-Id: Idfa6bb08d62629cd3a198318e6c6fd6a731e73ef
Diffstat (limited to 'libs')
-rw-r--r-- | libs/gui/BufferQueueConsumer.cpp | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp index 756cd61..995ed5e 100644 --- a/libs/gui/BufferQueueConsumer.cpp +++ b/libs/gui/BufferQueueConsumer.cpp @@ -22,6 +22,7 @@ #include <gui/BufferQueueConsumer.h> #include <gui/BufferQueueCore.h> #include <gui/IConsumerListener.h> +#include <gui/IProducerListener.h> namespace android { @@ -261,42 +262,52 @@ status_t BufferQueueConsumer::releaseBuffer(int slot, uint64_t frameNumber, return BAD_VALUE; } - Mutex::Autolock lock(mCore->mMutex); + sp<IProducerListener> listener; + { // Autolock scope + Mutex::Autolock lock(mCore->mMutex); - // If the frame number has changed because the buffer has been reallocated, - // we can ignore this releaseBuffer for the old buffer - if (frameNumber != mSlots[slot].mFrameNumber) { - return STALE_BUFFER_SLOT; - } + // If the frame number has changed because the buffer has been reallocated, + // we can ignore this releaseBuffer for the old buffer + if (frameNumber != mSlots[slot].mFrameNumber) { + return STALE_BUFFER_SLOT; + } - // Make sure this buffer hasn't been queued while acquired by the consumer - BufferQueueCore::Fifo::iterator current(mCore->mQueue.begin()); - while (current != mCore->mQueue.end()) { - if (current->mSlot == slot) { - BQ_LOGE("releaseBuffer: buffer slot %d pending release is " - "currently queued", slot); + // Make sure this buffer hasn't been queued while acquired by the consumer + BufferQueueCore::Fifo::iterator current(mCore->mQueue.begin()); + while (current != mCore->mQueue.end()) { + if (current->mSlot == slot) { + BQ_LOGE("releaseBuffer: buffer slot %d pending release is " + "currently queued", slot); + return BAD_VALUE; + } + ++current; + } + + if (mSlots[slot].mBufferState == BufferSlot::ACQUIRED) { + mSlots[slot].mEglDisplay = eglDisplay; + mSlots[slot].mEglFence = eglFence; + mSlots[slot].mFence = releaseFence; + mSlots[slot].mBufferState = BufferSlot::FREE; + listener = mCore->mConnectedProducerListener; + BQ_LOGV("releaseBuffer: releasing slot %d", slot); + } else if (mSlots[slot].mNeedsCleanupOnRelease) { + BQ_LOGV("releaseBuffer: releasing a stale buffer slot %d " + "(state = %d)", slot, mSlots[slot].mBufferState); + mSlots[slot].mNeedsCleanupOnRelease = false; + return STALE_BUFFER_SLOT; + } else { + BQ_LOGV("releaseBuffer: attempted to release buffer slot %d " + "but its state was %d", slot, mSlots[slot].mBufferState); return BAD_VALUE; } - ++current; - } - if (mSlots[slot].mBufferState == BufferSlot::ACQUIRED) { - mSlots[slot].mEglDisplay = eglDisplay; - mSlots[slot].mEglFence = eglFence; - mSlots[slot].mFence = releaseFence; - mSlots[slot].mBufferState = BufferSlot::FREE; - } else if (mSlots[slot].mNeedsCleanupOnRelease) { - BQ_LOGV("releaseBuffer: releasing a stale buffer slot %d " - "(state = %d)", slot, mSlots[slot].mBufferState); - mSlots[slot].mNeedsCleanupOnRelease = false; - return STALE_BUFFER_SLOT; - } else { - BQ_LOGV("releaseBuffer: attempted to release buffer slot %d " - "but its state was %d", slot, mSlots[slot].mBufferState); - return BAD_VALUE; - } + mCore->mDequeueCondition.broadcast(); + } // Autolock scope - mCore->mDequeueCondition.broadcast(); + // Call back without lock held + if (listener != NULL) { + listener->onBufferReleased(); + } return NO_ERROR; } |