Merge "BufferQueue: alloc without holding the lock" into jb-mr1-dev
This commit is contained in:
commit
7f79a2bd5c
@ -385,18 +385,8 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, sp<Fence>& outFence,
|
|||||||
(uint32_t(buffer->format) != format) ||
|
(uint32_t(buffer->format) != format) ||
|
||||||
((uint32_t(buffer->usage) & usage) != usage))
|
((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].mAcquireCalled = false;
|
||||||
mSlots[buf].mGraphicBuffer = graphicBuffer;
|
mSlots[buf].mGraphicBuffer = NULL;
|
||||||
mSlots[buf].mRequestBufferCalled = false;
|
mSlots[buf].mRequestBufferCalled = false;
|
||||||
mSlots[buf].mEglFence = EGL_NO_SYNC_KHR;
|
mSlots[buf].mEglFence = EGL_NO_SYNC_KHR;
|
||||||
mSlots[buf].mFence.clear();
|
mSlots[buf].mFence.clear();
|
||||||
@ -412,6 +402,30 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, sp<Fence>& outFence,
|
|||||||
mSlots[buf].mFence.clear();
|
mSlots[buf].mFence.clear();
|
||||||
} // end lock scope
|
} // 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) {
|
if (eglFence != EGL_NO_SYNC_KHR) {
|
||||||
EGLint result = eglClientWaitSyncKHR(dpy, eglFence, 0, 1000000000);
|
EGLint result = eglClientWaitSyncKHR(dpy, eglFence, 0, 1000000000);
|
||||||
// If something goes wrong, log the error, but return the buffer without
|
// If something goes wrong, log the error, but return the buffer without
|
||||||
|
Loading…
Reference in New Issue
Block a user