From 7523410a5d3721e84fe96464ff2cf61482137c58 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 26 Aug 2012 13:09:39 -0700 Subject: surfacetexture: Add API to set the min undequeued buffer count * Needed if we want to globally raise the value to reduce jank. Too many buffers causes issues for camera drivers. * Change the value back to 3 globally for QCOM targets. Change-Id: Ifc553fc0ea622974f773550799970b37e80a7c96 --- include/gui/BufferQueue.h | 6 ++++++ include/gui/ISurfaceTexture.h | 2 ++ include/gui/SurfaceTextureClient.h | 2 ++ libs/gui/BufferQueue.cpp | 11 ++++++++++- libs/gui/ISurfaceTexture.cpp | 20 ++++++++++++++++++++ libs/gui/SurfaceTextureClient.cpp | 21 +++++++++++++++++++++ services/surfaceflinger/SurfaceTextureLayer.cpp | 4 ---- 7 files changed, 61 insertions(+), 5 deletions(-) diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index ce78e0bc5..47a46ff11 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -34,7 +34,11 @@ namespace android { class BufferQueue : public BnSurfaceTexture { public: +#ifdef QCOM_HARDWARE + enum { MIN_UNDEQUEUED_BUFFERS = 3 }; +#else enum { MIN_UNDEQUEUED_BUFFERS = 2 }; +#endif enum { NUM_BUFFER_SLOTS = 32 }; enum { NO_CONNECTED_API = 0 }; enum { INVALID_BUFFER_SLOT = -1 }; @@ -143,6 +147,8 @@ public: // for interlaced use cases where the user can pass extra information about // the type of the frame whether it is interlaced or progressive frame. virtual status_t setBuffersSize(int size); + + virtual status_t setMinUndequeuedBufferCount(int count); #endif // connect attempts to connect a producer client API to the BufferQueue. diff --git a/include/gui/ISurfaceTexture.h b/include/gui/ISurfaceTexture.h index 97de091f1..f39a5a0fc 100644 --- a/include/gui/ISurfaceTexture.h +++ b/include/gui/ISurfaceTexture.h @@ -154,6 +154,8 @@ protected: // for interlaced use cases where the user can pass extra information about // the type of the frame whether it is interlaced or progressive frame. virtual status_t setBuffersSize(int size) = 0; + + virtual status_t setMinUndequeuedBufferCount(int count) = 0; #endif // connect attempts to connect a client API to the SurfaceTexture. This diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index b1695e23e..18c44d8cd 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -84,6 +84,7 @@ private: int dispatchSetUsage(va_list args); #ifdef QCOM_HARDWARE int dispatchSetBuffersSize(va_list args); + int dispatchSetMinUndequeuedBufferCount(va_list args); #endif int dispatchLock(va_list args); int dispatchUnlockAndPost(va_list args); @@ -98,6 +99,7 @@ protected: virtual int setSwapInterval(int interval); #ifdef QCOM_HARDWARE virtual int setBuffersSize(int size); + virtual int setMinUndequeuedBufferCount(int count); #endif virtual int connect(int api); diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index b47495fc5..d30306533 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -105,6 +105,8 @@ BufferQueue::BufferQueue( bool allowSynchronousMode, int bufferCount ) : mConsumerName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId()); ST_LOGV("BufferQueue"); + + ALOGI("BufferQueue: minUndequeued=%d", mMinUndequeuedBuffers); sp composer(ComposerService::getComposerService()); mGraphicBufferAlloc = composer->createGraphicBufferAlloc(); if (mGraphicBufferAlloc == 0) { @@ -180,7 +182,7 @@ status_t BufferQueue::setTransformHint(uint32_t hint) { } status_t BufferQueue::setBufferCount(int bufferCount) { - ST_LOGV("setBufferCount: count=%d", bufferCount); + ALOGI("setBufferCount: count=%d", bufferCount); sp listener; { @@ -243,6 +245,13 @@ status_t BufferQueue::setBuffersSize(int size) { mGraphicBufferAlloc->setGraphicBufferSize(size); return NO_ERROR; } + +status_t BufferQueue::setMinUndequeuedBufferCount(int count) { + ALOGI("setMinUndequeuedBufferCount: count=%d", count); + Mutex::Autolock lock(mMutex); + mMinUndequeuedBuffers = count; + return NO_ERROR; +} #endif int BufferQueue::query(int what, int* outValue) diff --git a/libs/gui/ISurfaceTexture.cpp b/libs/gui/ISurfaceTexture.cpp index 623453556..dc00bd69e 100644 --- a/libs/gui/ISurfaceTexture.cpp +++ b/libs/gui/ISurfaceTexture.cpp @@ -40,6 +40,7 @@ enum { SET_SYNCHRONOUS_MODE, #ifdef QCOM_HARDWARE SET_BUFFERS_SIZE, + SET_MIN_UNDEQUEUED_BUFFER_COUNT, #endif CONNECT, DISCONNECT, @@ -160,6 +161,18 @@ public: result = reply.readInt32(); return result; } + + virtual status_t setMinUndequeuedBufferCount(int count) { + Parcel data, reply; + data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); + data.writeInt32(count); + status_t result = remote()->transact(SET_MIN_UNDEQUEUED_BUFFER_COUNT, data, &reply); + if (result != NO_ERROR) { + return result; + } + result = reply.readInt32(); + return result; + } #endif virtual status_t connect(int api, QueueBufferOutput* output) { @@ -270,6 +283,13 @@ status_t BnSurfaceTexture::onTransact( reply->writeInt32(res); return NO_ERROR; } break; + case SET_MIN_UNDEQUEUED_BUFFER_COUNT: { + CHECK_INTERFACE(ISurfaceTexture, data, reply); + int size = data.readInt32(); + status_t res = setMinUndequeuedBufferCount(size); + reply->writeInt32(res); + return NO_ERROR; + } break; #endif case CONNECT: { CHECK_INTERFACE(ISurfaceTexture, data, reply); diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 973a03e31..a425f6936 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -353,6 +353,9 @@ int SurfaceTextureClient::perform(int operation, va_list args) case NATIVE_WINDOW_SET_BUFFERS_SIZE: res = dispatchSetBuffersSize(args); break; + case NATIVE_WINDOW_SET_MIN_UNDEQUEUED_BUFFER_COUNT: + res = dispatchSetMinUndequeuedBufferCount(args); + break; #endif case NATIVE_WINDOW_LOCK: res = dispatchLock(args); @@ -434,6 +437,11 @@ int SurfaceTextureClient::dispatchSetBuffersSize(va_list args) { int size = va_arg(args, int); return setBuffersSize(size); } + +int SurfaceTextureClient::dispatchSetMinUndequeuedBufferCount(va_list args) { + int count = va_arg(args, int); + return setMinUndequeuedBufferCount(count); +} #endif int SurfaceTextureClient::dispatchSetScalingMode(va_list args) { @@ -624,6 +632,19 @@ int SurfaceTextureClient::setBuffersSize(int size) status_t err = mSurfaceTexture->setBuffersSize(size); return NO_ERROR; } + +int SurfaceTextureClient::setMinUndequeuedBufferCount(int count) +{ + ATRACE_CALL(); + ALOGV("SurfaceTextureClient::setMinUndequeuedBufferCount"); + + if (count<0) + return BAD_VALUE; + + Mutex::Autolock lock(mMutex); + status_t err = mSurfaceTexture->setMinUndequeuedBufferCount(count); + return NO_ERROR; +} #endif int SurfaceTextureClient::setScalingMode(int mode) diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 73d1b56ee..9c1b506ec 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -28,11 +28,7 @@ namespace android { SurfaceTextureLayer::SurfaceTextureLayer() -#ifdef QCOM_HARDWARE - : BufferQueue(true, 3) -#else : BufferQueue(true) -#endif { } -- cgit v1.2.3