diff options
author | Jamie Gennis <jgennis@google.com> | 2012-10-17 09:40:21 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-10-17 09:40:21 -0700 |
commit | 54c6497530dd42435c2d9aa3e919a501c2c62b6a (patch) | |
tree | 2b3bfd497988008dce72705dba7330f439bb48bc | |
parent | 53f98e69f2bba93702108b8f188a502900f5eb11 (diff) | |
parent | 9097e14443767b37ab0831d46c1090a3960d36e1 (diff) | |
download | frameworks_native-54c6497530dd42435c2d9aa3e919a501c2c62b6a.zip frameworks_native-54c6497530dd42435c2d9aa3e919a501c2c62b6a.tar.gz frameworks_native-54c6497530dd42435c2d9aa3e919a501c2c62b6a.tar.bz2 |
am 9097e144: am 7f79a2bd: Merge "BufferQueue: alloc without holding the lock" into jb-mr1-dev
* commit '9097e14443767b37ab0831d46c1090a3960d36e1':
BufferQueue: alloc without holding the lock
-rw-r--r-- | libs/gui/BufferQueue.cpp | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index d408476..590946a 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -385,18 +385,8 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, sp<Fence>& outFence, (uint32_t(buffer->format) != format) || ((uint32_t(buffer->usage) & usage) != usage)) { - status_t error; - sp<GraphicBuffer> graphicBuffer( - mGraphicBufferAlloc->createGraphicBuffer( - w, h, format, usage, &error)); - if (graphicBuffer == 0) { - ST_LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer " - "failed"); - return error; - } - mSlots[buf].mAcquireCalled = false; - mSlots[buf].mGraphicBuffer = graphicBuffer; + mSlots[buf].mGraphicBuffer = NULL; mSlots[buf].mRequestBufferCalled = false; mSlots[buf].mEglFence = EGL_NO_SYNC_KHR; mSlots[buf].mFence.clear(); @@ -412,6 +402,30 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, sp<Fence>& outFence, mSlots[buf].mFence.clear(); } // end lock scope + if (returnFlags & ISurfaceTexture::BUFFER_NEEDS_REALLOCATION) { + status_t error; + sp<GraphicBuffer> graphicBuffer( + mGraphicBufferAlloc->createGraphicBuffer( + w, h, format, usage, &error)); + if (graphicBuffer == 0) { + ST_LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer " + "failed"); + return error; + } + + { // Scope for the lock + Mutex::Autolock lock(mMutex); + + if (mAbandoned) { + ST_LOGE("dequeueBuffer: SurfaceTexture has been abandoned!"); + return NO_INIT; + } + + mSlots[*outBuf].mGraphicBuffer = graphicBuffer; + } + } + + if (eglFence != EGL_NO_SYNC_KHR) { EGLint result = eglClientWaitSyncKHR(dpy, eglFence, 0, 1000000000); // If something goes wrong, log the error, but return the buffer without |