diff options
| author | 2012-10-17 09:32:42 -0700 | |
|---|---|---|
| committer | 2012-10-17 09:32:43 -0700 | |
| commit | 7f79a2bd5c92bc626890dc16ffb8cd2de934e5fb (patch) | |
| tree | 949af0a177f329b28934ed59110d9e5cd0f72863 | |
| parent | 825a9a2dcd1b3e139dd0677ff46f966fb23f963c (diff) | |
| parent | 1efe099a51e2231bd938a6afcf66e6584deec0f2 (diff) | |
Merge "BufferQueue: alloc without holding the lock" into jb-mr1-dev
| -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 d408476749..590946a854 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 |