diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index 57b9f8a33..14f20d716 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -35,10 +35,6 @@ namespace android { class BufferQueue : public BnSurfaceTexture { public: enum { MIN_UNDEQUEUED_BUFFERS = 2 }; - enum { - MIN_ASYNC_BUFFER_SLOTS = MIN_UNDEQUEUED_BUFFERS + 1, - MIN_SYNC_BUFFER_SLOTS = MIN_UNDEQUEUED_BUFFERS - }; enum { NUM_BUFFER_SLOTS = 32 }; enum { NO_CONNECTED_API = 0 }; enum { INVALID_BUFFER_SLOT = -1 }; @@ -99,7 +95,8 @@ public: // by producers and consumers. // allowSynchronousMode specifies whether or not synchronous mode can be // enabled. - BufferQueue(bool allowSynchronousMode = true); + // bufferCount sets the minimum number of undequeued buffers for this queue + BufferQueue( bool allowSynchronousMode = true, int bufferCount = MIN_UNDEQUEUED_BUFFERS); virtual ~BufferQueue(); virtual int query(int what, int* value); @@ -402,6 +399,18 @@ private: // in requestBuffers() if a format of zero is specified. uint32_t mPixelFormat; + // mMinUndequeuedBuffers is a constraint on the number of buffers + // not dequeued at any time + int mMinUndequeuedBuffers; + + // mMinAsyncBufferSlots is a constraint on the minimum mBufferCount + // when this BufferQueue is in asynchronous mode + int mMinAsyncBufferSlots; + + // mMinSyncBufferSlots is a constraint on the minimum mBufferCount + // when this BufferQueue is in synchronous mode + int mMinSyncBufferSlots; + // mBufferCount is the number of buffer slots that the client and server // must maintain. It defaults to MIN_ASYNC_BUFFER_SLOTS and can be changed // by calling setBufferCount or setBufferCountServer diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index b68fa81e3..8c1e5050e 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -104,7 +104,6 @@ protected: virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); virtual int unlockAndPost(); - enum { MIN_UNDEQUEUED_BUFFERS = BufferQueue::MIN_UNDEQUEUED_BUFFERS }; enum { NUM_BUFFER_SLOTS = BufferQueue::NUM_BUFFER_SLOTS }; enum { DEFAULT_FORMAT = PIXEL_FORMAT_RGBA_8888 }; diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index 2d042c83c..84ccb3fec 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -69,13 +69,16 @@ static int32_t createProcessUniqueId() { return android_atomic_inc(&globalCounter); } -BufferQueue::BufferQueue( bool allowSynchronousMode ) : +BufferQueue::BufferQueue( bool allowSynchronousMode, int bufferCount ) : mDefaultWidth(1), mDefaultHeight(1), mPixelFormat(PIXEL_FORMAT_RGBA_8888), - mBufferCount(MIN_ASYNC_BUFFER_SLOTS), + mMinUndequeuedBuffers(bufferCount), + mMinAsyncBufferSlots(bufferCount + 1), + mMinSyncBufferSlots(bufferCount), + mBufferCount(mMinAsyncBufferSlots), mClientBufferCount(0), - mServerBufferCount(MIN_ASYNC_BUFFER_SLOTS), + mServerBufferCount(mMinAsyncBufferSlots), mSynchronousMode(false), mAllowSynchronousMode(allowSynchronousMode), mConnectedApi(NO_CONNECTED_API), @@ -92,6 +95,9 @@ BufferQueue::BufferQueue( bool allowSynchronousMode ) : ST_LOGV("BufferQueue"); sp composer(ComposerService::getComposerService()); mGraphicBufferAlloc = composer->createGraphicBufferAlloc(); + if (mGraphicBufferAlloc == 0) { + ST_LOGE("createGraphicBufferAlloc() failed in BufferQueue()"); + } } BufferQueue::~BufferQueue() { @@ -186,7 +192,7 @@ status_t BufferQueue::setBufferCount(int bufferCount) { } const int minBufferSlots = mSynchronousMode ? - MIN_SYNC_BUFFER_SLOTS : MIN_ASYNC_BUFFER_SLOTS; + mMinSyncBufferSlots : mMinAsyncBufferSlots; if (bufferCount == 0) { mClientBufferCount = 0; bufferCount = (mServerBufferCount >= minBufferSlots) ? @@ -241,7 +247,7 @@ int BufferQueue::query(int what, int* outValue) break; case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: value = mSynchronousMode ? - (MIN_UNDEQUEUED_BUFFERS-1) : MIN_UNDEQUEUED_BUFFERS; + (mMinUndequeuedBuffers-1) : mMinUndequeuedBuffers; break; default: return BAD_VALUE; @@ -317,7 +323,7 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, // wait on mDequeueCondition. const int minBufferCountNeeded = mSynchronousMode ? - MIN_SYNC_BUFFER_SLOTS : MIN_ASYNC_BUFFER_SLOTS; + mMinSyncBufferSlots : mMinAsyncBufferSlots; const bool numberOfBuffersNeedsToChange = !mClientBufferCount && ((mServerBufferCount != mBufferCount) || @@ -384,15 +390,15 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, // See whether a buffer has been queued since the last // setBufferCount so we know whether to perform the - // MIN_UNDEQUEUED_BUFFERS check below. + // mMinUndequeuedBuffers check below. if (mBufferHasBeenQueued) { // make sure the client is not trying to dequeue more buffers // than allowed. const int avail = mBufferCount - (dequeuedCount+1); - if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) { - ST_LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded " + if (avail < (mMinUndequeuedBuffers-int(mSynchronousMode))) { + ST_LOGE("dequeueBuffer: mMinUndequeuedBuffers=%d exceeded " "(dequeued=%d)", - MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode), + mMinUndequeuedBuffers-int(mSynchronousMode), dequeuedCount); return -EBUSY; }