summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJamie Gennis <jgennis@google.com>2012-10-17 09:40:21 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-10-17 09:40:21 -0700
commit54c6497530dd42435c2d9aa3e919a501c2c62b6a (patch)
tree2b3bfd497988008dce72705dba7330f439bb48bc
parent53f98e69f2bba93702108b8f188a502900f5eb11 (diff)
parent9097e14443767b37ab0831d46c1090a3960d36e1 (diff)
downloadframeworks_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.cpp36
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