From 0a3e7847012108f047a6582ebfb88026d640277f Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 17 Jul 2018 13:48:33 +0200 Subject: Do not block on allocating buffers There is really no point in doing that because this can be done in an async way such that the first and subsequent dequeueBuffer still don't block because at that point allocation is very likely done. Furthermore, avoid calling setAsyncMode initially, as it will also block RT on buffer allocation. However, the default is false in any case, so we really don't need to call it. Also, only allocate one buffer at a time and don't block in dequeueBuffer on allocating buffers. It will likely have one buffer available already, and there is no point in waiting for other buffers to be allocated. Test: Press home with memory contention, observe less delay. Test: General smoke testing for increased jank Bug: 111517695 Change-Id: I9deb435013b2503178d2fe032151c1aaedd667af --- libs/gui/BufferQueueProducer.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'libs/gui/BufferQueueProducer.cpp') diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index c8021e4d54..c96a2dd6a3 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -381,7 +381,6 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp* ou { // Autolock scope Mutex::Autolock lock(mCore->mMutex); - mCore->waitWhileAllocatingLocked(); if (format == 0) { format = mCore->mDefaultBufferFormat; @@ -1345,7 +1344,9 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height, return; } - newBufferCount = mCore->mFreeSlots.size(); + // Only allocate one buffer at a time to reduce risks of overlapping an allocation from + // both allocateBuffers and dequeueBuffer. + newBufferCount = mCore->mFreeSlots.empty() ? 0 : 1; if (newBufferCount == 0) { return; } @@ -1360,7 +1361,7 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height, } // Autolock scope Vector> buffers; - for (size_t i = 0; i < newBufferCount; ++i) { + for (size_t i = 0; i < newBufferCount; ++i) { sp graphicBuffer = new GraphicBuffer( allocWidth, allocHeight, allocFormat, BQ_LAYER_COUNT, allocUsage, allocName); -- cgit v1.2.3-59-g8ed1b