diff options
Diffstat (limited to 'libs/gui/BufferQueueConsumer.cpp')
-rw-r--r-- | libs/gui/BufferQueueConsumer.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp index da6143c59f..7f7a0437f1 100644 --- a/libs/gui/BufferQueueConsumer.cpp +++ b/libs/gui/BufferQueueConsumer.cpp @@ -94,7 +94,10 @@ status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer, ++numAcquiredBuffers; } } - if (numAcquiredBuffers >= mCore->mMaxAcquiredBufferCount + 1) { + const bool acquireNonDroppableBuffer = mCore->mAllowExtraAcquire && + numAcquiredBuffers == mCore->mMaxAcquiredBufferCount + 1; + if (numAcquiredBuffers >= mCore->mMaxAcquiredBufferCount + 1 && + !acquireNonDroppableBuffer) { BQ_LOGE("acquireBuffer: max acquired buffer count reached: %d (max %d)", numAcquiredBuffers, mCore->mMaxAcquiredBufferCount); return INVALID_OPERATION; @@ -254,6 +257,9 @@ status_t BufferQueueConsumer::acquireBuffer(BufferItem* outBuffer, outBuffer->mIsStale = false; outBuffer->mAutoRefresh = mCore->mSharedBufferMode && mCore->mAutoRefresh; + } else if (acquireNonDroppableBuffer && front->mIsDroppable) { + BQ_LOGV("acquireBuffer: front buffer is not droppable"); + return NO_BUFFER_AVAILABLE; } else { slot = front->mSlot; *outBuffer = *front; @@ -824,4 +830,9 @@ status_t BufferQueueConsumer::dumpState(const String8& prefix, String8* outResul return NO_ERROR; } +void BufferQueueConsumer::setAllowExtraAcquire(bool allow) { + std::lock_guard<std::mutex> lock(mCore->mMutex); + mCore->mAllowExtraAcquire = allow; +} + } // namespace android |