diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 7 | ||||
| -rw-r--r-- | libs/gui/IGraphicBufferProducer.cpp | 2 | ||||
| -rw-r--r-- | libs/gui/Surface.cpp | 6 |
3 files changed, 10 insertions, 5 deletions
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<android::Fence>* 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<sp<GraphicBuffer>> buffers; - for (size_t i = 0; i < newBufferCount; ++i) { + for (size_t i = 0; i < newBufferCount; ++i) { sp<GraphicBuffer> graphicBuffer = new GraphicBuffer( allocWidth, allocHeight, allocFormat, BQ_LAYER_COUNT, allocUsage, allocName); diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 0749fde1ad..0b3796056d 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -355,7 +355,7 @@ public: data.writeUint32(height); data.writeInt32(static_cast<int32_t>(format)); data.writeUint64(usage); - status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply); + status_t result = remote()->transact(ALLOCATE_BUFFERS, data, &reply, TF_ONE_WAY); if (result != NO_ERROR) { ALOGE("allocateBuffers failed to transact: %d", result); } diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 339bd0fa4e..2de14c8846 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -464,8 +464,12 @@ int Surface::setSwapInterval(int interval) { if (interval > maxSwapInterval) interval = maxSwapInterval; + const bool wasSwapIntervalZero = mSwapIntervalZero; mSwapIntervalZero = (interval == 0); - mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero); + + if (mSwapIntervalZero != wasSwapIntervalZero) { + mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero); + } return NO_ERROR; } |