diff options
author | Sungtak Lee <taklee@google.com> | 2019-03-02 16:40:47 -0800 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-04-03 01:13:44 +0000 |
commit | 8f7b62748e4a0569e4f2d4d8101b377595e1ccf0 (patch) | |
tree | 2d1f1e788d365ed12208b8b96ab537c888b2dfdc | |
parent | 4012cda2aec03e440d2c61fd8ac0b99de763c306 (diff) | |
download | native-8f7b62748e4a0569e4f2d4d8101b377595e1ccf0.tar.gz |
RESTRICT AUTOMERGE BQ: retain buffer drop from BufferQueueProducer
Retain buffer drop from BufferQueueProducer::queueBuffer unless dequeue
timeout is set positive.
Bug: 122433957
Change-Id: I8432a7ad386836498e632c67953ad49c6be008bb
(cherry picked from commit fe8713cbb23b1a3f543ed18ce85ddfaecf513831)
-rw-r--r-- | libs/gui/BufferQueueCore.cpp | 1 | ||||
-rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 16 | ||||
-rw-r--r-- | libs/gui/include/gui/BufferQueueCore.h | 5 | ||||
-rw-r--r-- | libs/gui/include/gui/IGraphicBufferProducer.h | 4 |
4 files changed, 21 insertions, 5 deletions
diff --git a/libs/gui/BufferQueueCore.cpp b/libs/gui/BufferQueueCore.cpp index bb703da3dd..7dddd8b2c4 100644 --- a/libs/gui/BufferQueueCore.cpp +++ b/libs/gui/BufferQueueCore.cpp @@ -73,6 +73,7 @@ BufferQueueCore::BufferQueueCore() : mActiveBuffers(), mDequeueCondition(), mDequeueBufferCannotBlock(false), + mQueueBufferCanDrop(false), mDefaultBufferFormat(PIXEL_FORMAT_RGBA_8888), mDefaultWidth(1), mDefaultHeight(1), diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index c96a2dd6a3..c01b2b6598 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -872,7 +872,7 @@ status_t BufferQueueProducer::queueBuffer(int slot, item.mFence = acquireFence; item.mFenceTime = acquireFenceTime; item.mIsDroppable = mCore->mAsyncMode || - mCore->mDequeueBufferCannotBlock || + mCore->mQueueBufferCanDrop || (mCore->mSharedBufferMode && mCore->mSharedBufferSlot == slot); item.mSurfaceDamage = surfaceDamage; item.mQueuedBuffer = true; @@ -1213,9 +1213,10 @@ status_t BufferQueueProducer::connect(const sp<IProducerListener>& listener, mCore->mConnectedPid = IPCThreadState::self()->getCallingPid(); mCore->mBufferHasBeenQueued = false; mCore->mDequeueBufferCannotBlock = false; - if (mDequeueTimeout < 0) { - mCore->mDequeueBufferCannotBlock = - mCore->mConsumerControlledByApp && producerControlledByApp; + mCore->mQueueBufferCanDrop = false; + if (mCore->mConsumerControlledByApp && producerControlledByApp) { + mCore->mDequeueBufferCannotBlock = mDequeueTimeout < 0; + mCore->mQueueBufferCanDrop = mDequeueTimeout <= 0; } mCore->mAllowAllocation = true; @@ -1486,7 +1487,12 @@ status_t BufferQueueProducer::setDequeueTimeout(nsecs_t timeout) { } mDequeueTimeout = timeout; - mCore->mDequeueBufferCannotBlock = false; + if (timeout >= 0) { + mCore->mDequeueBufferCannotBlock = false; + if (timeout != 0) { + mCore->mQueueBufferCanDrop = false; + } + } VALIDATE_CONSISTENCY(); return NO_ERROR; diff --git a/libs/gui/include/gui/BufferQueueCore.h b/libs/gui/include/gui/BufferQueueCore.h index 537c957746..f91babca11 100644 --- a/libs/gui/include/gui/BufferQueueCore.h +++ b/libs/gui/include/gui/BufferQueueCore.h @@ -225,6 +225,11 @@ private: // consumer are controlled by the application. bool mDequeueBufferCannotBlock; + // mQueueBufferCanDrop indicates whether queueBuffer is allowd to drop + // buffers in non-async mode. This flag is set during connect when both the + // producer and consumer are controlled by application. + bool mQueueBufferCanDrop; + // mDefaultBufferFormat can be set so it will override the buffer format // when it isn't specified in dequeueBuffer. PixelFormat mDefaultBufferFormat; diff --git a/libs/gui/include/gui/IGraphicBufferProducer.h b/libs/gui/include/gui/IGraphicBufferProducer.h index 887654e05b..2f8a154faa 100644 --- a/libs/gui/include/gui/IGraphicBufferProducer.h +++ b/libs/gui/include/gui/IGraphicBufferProducer.h @@ -584,6 +584,10 @@ public: // non-blocking mode and its corresponding spare buffer (which is used to // ensure a buffer is always available). // + // N.B. queueBuffer will stop buffer dropping behavior if timeout is + // strictly positive. If timeout is zero or negative, previous buffer + // dropping behavior will not be changed. + // // Return of a value other than NO_ERROR means an error has occurred: // * BAD_VALUE - Failure to adjust the number of available slots. This can // happen because of trying to allocate/deallocate the async |