Loading include/gui/IGraphicBufferConsumer.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -267,6 +267,8 @@ public: // discardFreeBuffers releases all currently-free buffers held by the BufferQueue, in order to // discardFreeBuffers releases all currently-free buffers held by the BufferQueue, in order to // reduce the memory consumption of the BufferQueue to the minimum possible without // reduce the memory consumption of the BufferQueue to the minimum possible without // discarding data. // discarding data. // The consumer invoking this method is responsible for calling getReleasedBuffers() after this // call to free up any of its locally cached buffers. virtual status_t discardFreeBuffers() = 0; virtual status_t discardFreeBuffers() = 0; // dump state into a string // dump state into a string Loading libs/gui/BufferQueueProducer.cpp +34 −26 Original line number Original line Diff line number Diff line Loading @@ -629,6 +629,8 @@ status_t BufferQueueProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, return BAD_VALUE; return BAD_VALUE; } } sp<IConsumerListener> listener; { Mutex::Autolock lock(mCore->mMutex); Mutex::Autolock lock(mCore->mMutex); if (mCore->mIsAbandoned) { if (mCore->mIsAbandoned) { Loading Loading @@ -663,6 +665,12 @@ status_t BufferQueueProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, *outFence = mSlots[found].mFence; *outFence = mSlots[found].mFence; mCore->clearBufferSlotLocked(found); mCore->clearBufferSlotLocked(found); VALIDATE_CONSISTENCY(); VALIDATE_CONSISTENCY(); listener = mCore->mConsumerListener; } if (listener != NULL) { listener->onBuffersReleased(); } return NO_ERROR; return NO_ERROR; } } Loading libs/gui/ConsumerBase.cpp +12 −1 Original line number Original line Diff line number Diff line Loading @@ -253,7 +253,18 @@ status_t ConsumerBase::discardFreeBuffers() { CB_LOGE("discardFreeBuffers: ConsumerBase is abandoned!"); CB_LOGE("discardFreeBuffers: ConsumerBase is abandoned!"); return NO_INIT; return NO_INIT; } } return mConsumer->discardFreeBuffers(); status_t err = mConsumer->discardFreeBuffers(); if (err != OK) { return err; } uint64_t mask; mConsumer->getReleasedBuffers(&mask); for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { if (mask & (1ULL << i)) { freeBufferLocked(i); } } return OK; } } void ConsumerBase::dumpState(String8& result) const { void ConsumerBase::dumpState(String8& result) const { Loading Loading
include/gui/IGraphicBufferConsumer.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -267,6 +267,8 @@ public: // discardFreeBuffers releases all currently-free buffers held by the BufferQueue, in order to // discardFreeBuffers releases all currently-free buffers held by the BufferQueue, in order to // reduce the memory consumption of the BufferQueue to the minimum possible without // reduce the memory consumption of the BufferQueue to the minimum possible without // discarding data. // discarding data. // The consumer invoking this method is responsible for calling getReleasedBuffers() after this // call to free up any of its locally cached buffers. virtual status_t discardFreeBuffers() = 0; virtual status_t discardFreeBuffers() = 0; // dump state into a string // dump state into a string Loading
libs/gui/BufferQueueProducer.cpp +34 −26 Original line number Original line Diff line number Diff line Loading @@ -629,6 +629,8 @@ status_t BufferQueueProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, return BAD_VALUE; return BAD_VALUE; } } sp<IConsumerListener> listener; { Mutex::Autolock lock(mCore->mMutex); Mutex::Autolock lock(mCore->mMutex); if (mCore->mIsAbandoned) { if (mCore->mIsAbandoned) { Loading Loading @@ -663,6 +665,12 @@ status_t BufferQueueProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, *outFence = mSlots[found].mFence; *outFence = mSlots[found].mFence; mCore->clearBufferSlotLocked(found); mCore->clearBufferSlotLocked(found); VALIDATE_CONSISTENCY(); VALIDATE_CONSISTENCY(); listener = mCore->mConsumerListener; } if (listener != NULL) { listener->onBuffersReleased(); } return NO_ERROR; return NO_ERROR; } } Loading
libs/gui/ConsumerBase.cpp +12 −1 Original line number Original line Diff line number Diff line Loading @@ -253,7 +253,18 @@ status_t ConsumerBase::discardFreeBuffers() { CB_LOGE("discardFreeBuffers: ConsumerBase is abandoned!"); CB_LOGE("discardFreeBuffers: ConsumerBase is abandoned!"); return NO_INIT; return NO_INIT; } } return mConsumer->discardFreeBuffers(); status_t err = mConsumer->discardFreeBuffers(); if (err != OK) { return err; } uint64_t mask; mConsumer->getReleasedBuffers(&mask); for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { if (mask & (1ULL << i)) { freeBufferLocked(i); } } return OK; } } void ConsumerBase::dumpState(String8& result) const { void ConsumerBase::dumpState(String8& result) const { Loading