From ad678e18b66f495efa78dc3b9ab99b579945c9e2 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 23 Jul 2013 17:28:53 -0700 Subject: single buffer mode for BufferQueue Bug: 9891035 Change-Id: Id1ab5f911a6dc4c1d8235e65775b3d3635231ad4 --- include/gui/BufferQueue.h | 14 +++++++++++++- include/gui/GLConsumer.h | 13 ++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index 628678f..cfce40d 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -340,6 +340,13 @@ public: // The count must be between 2 and NUM_BUFFER_SLOTS, inclusive. status_t setDefaultMaxBufferCount(int bufferCount); + // disableAsyncBuffer disables the extra buffer used in async mode + // (when both producer and consumer have set their "isControlledByApp" + // flag) and has dequeueBuffer() return WOULD_BLOCK instead. + // + // This can only be called before consumerConnect(). + status_t disableAsyncBuffer(); + // setMaxAcquiredBufferCount sets the maximum number of buffers that can // be acquired by the consumer at one time (default 1). This call will // fail if a producer is connected to the BufferQueue. @@ -364,6 +371,7 @@ public: // NATIVE_WINDOW_TRANSFORM_ROT_90. The default is 0 (no transform). status_t setTransformHint(uint32_t hint); + private: // freeBufferLocked frees the GraphicBuffer and sync resources for the // given slot. @@ -559,10 +567,14 @@ private: bool mConsumerControlledByApp; // mDequeueBufferCannotBlock whether dequeueBuffer() isn't allowed to block. - // this flag is set durring connect() when both consumer and producer are controlled + // this flag is set during connect() when both consumer and producer are controlled // by the application. bool mDequeueBufferCannotBlock; + // mUseAsyncBuffer whether an extra buffer is used in async mode to prevent + // dequeueBuffer() from ever blocking. + bool mUseAsyncBuffer; + // mConnectedApi indicates the producer API that is currently connected // to this BufferQueue. It defaults to NO_CONNECTED_API (= 0), and gets // updated by the connect and disconnect methods. diff --git a/include/gui/GLConsumer.h b/include/gui/GLConsumer.h index 1df5b42..ac4a832 100644 --- a/include/gui/GLConsumer.h +++ b/include/gui/GLConsumer.h @@ -98,6 +98,13 @@ public: // This calls doGLFenceWait to ensure proper synchronization. status_t updateTexImage(); + // releaseTexImage releases the texture acquired in updateTexImage(). + // This is intended to be used in single buffer mode. + // + // This call may only be made while the OpenGL ES context to which the + // target texture belongs is bound to the calling thread. + status_t releaseTexImage(); + // setReleaseFence stores a fence that will signal when the current buffer // is no longer being read. This fence will be returned to the producer // when the current buffer is released by updateTexImage(). Multiple @@ -251,7 +258,7 @@ protected: // This releases the buffer in the slot referenced by mCurrentTexture, // then updates state to refer to the BufferItem, which must be a // newly-acquired buffer. - status_t releaseAndUpdateLocked(const BufferQueue::BufferItem& item); + status_t updateAndReleaseLocked(const BufferQueue::BufferItem& item); // Binds mTexName and the current buffer to mTexTarget. Uses // mCurrentTexture if it's set, mCurrentTextureBuf if not. If the @@ -416,6 +423,10 @@ private: // It is set to false by detachFromContext, and then set to true again by // attachToContext. bool mAttached; + + // mReleasedTexImageBuffer is a dummy buffer used when in single buffer + // mode and releaseTexImage() has been called + sp mReleasedTexImageBuffer; }; // ---------------------------------------------------------------------------- -- cgit v1.1