diff options
author | Jesse Hall <jessehall@google.com> | 2012-06-22 19:58:47 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-06-22 19:58:47 -0700 |
commit | b7c839b1103f72f8eb89fc0e19f7805969fc622f (patch) | |
tree | 075c491472c6584c30920dbb26f8c97811e2f882 /libs | |
parent | a277b7a4d7fa162d2d88f4701d44cedbe6dbfc56 (diff) | |
parent | f78575400977f644cf0b12beb2fa5fc278b6ed4c (diff) | |
download | frameworks_native-b7c839b1103f72f8eb89fc0e19f7805969fc622f.zip frameworks_native-b7c839b1103f72f8eb89fc0e19f7805969fc622f.tar.gz frameworks_native-b7c839b1103f72f8eb89fc0e19f7805969fc622f.tar.bz2 |
Merge "Pass fences from BufferQueue to SurfaceTextureClient"
Diffstat (limited to 'libs')
-rw-r--r-- | libs/gui/BufferQueue.cpp | 17 | ||||
-rw-r--r-- | libs/gui/ISurfaceTexture.cpp | 17 | ||||
-rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 12 |
3 files changed, 28 insertions, 18 deletions
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index 23ac882..40e43a1 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -294,8 +294,8 @@ status_t BufferQueue::requestBuffer(int slot, sp<GraphicBuffer>* buf) { return NO_ERROR; } -status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, - uint32_t format, uint32_t usage) { +status_t BufferQueue::dequeueBuffer(int *outBuf, sp<Fence>& outFence, + uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { ATRACE_CALL(); ST_LOGV("dequeueBuffer: w=%d h=%d fmt=%#x usage=%#x", w, h, format, usage); @@ -307,7 +307,6 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, status_t returnFlags(OK); EGLDisplay dpy = EGL_NO_DISPLAY; EGLSyncKHR fence = EGL_NO_SYNC_KHR; - sp<Fence> releaseFence; { // Scope for the lock Mutex::Autolock lock(mMutex); @@ -490,7 +489,7 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, dpy = mSlots[buf].mEglDisplay; fence = mSlots[buf].mFence; - releaseFence = mSlots[buf].mReleaseFence; + outFence = mSlots[buf].mReleaseFence; mSlots[buf].mFence = EGL_NO_SYNC_KHR; mSlots[buf].mReleaseFence.clear(); } // end lock scope @@ -508,16 +507,6 @@ status_t BufferQueue::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, eglDestroySyncKHR(dpy, fence); } - if (releaseFence.get()) { - int err = releaseFence->wait(1000); - if (err == -ETIME) { - ALOGE("dequeueBuffer: timeout waiting for release fence"); - } else if (err != NO_ERROR) { - ALOGE("dequeueBuffer: error waiting for sync fence: %d", err); - } - releaseFence.clear(); - } - ST_LOGV("dequeueBuffer: returning slot=%d buf=%p flags=%#x", *outBuf, mSlots[*outBuf].mGraphicBuffer->handle, returnFlags); diff --git a/libs/gui/ISurfaceTexture.cpp b/libs/gui/ISurfaceTexture.cpp index 3eb5e7a..c8fef06 100644 --- a/libs/gui/ISurfaceTexture.cpp +++ b/libs/gui/ISurfaceTexture.cpp @@ -81,8 +81,8 @@ public: return result; } - virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, - uint32_t format, uint32_t usage) { + virtual status_t dequeueBuffer(int *buf, sp<Fence>& fence, + uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { Parcel data, reply; data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); data.writeInt32(w); @@ -94,6 +94,12 @@ public: return result; } *buf = reply.readInt32(); + fence.clear(); + bool hasFence = reply.readInt32(); + if (hasFence) { + fence = new Fence(); + reply.read(*fence.get()); + } result = reply.readInt32(); return result; } @@ -205,8 +211,13 @@ status_t BnSurfaceTexture::onTransact( uint32_t format = data.readInt32(); uint32_t usage = data.readInt32(); int buf; - int result = dequeueBuffer(&buf, w, h, format, usage); + sp<Fence> fence; + int result = dequeueBuffer(&buf, fence, w, h, format, usage); reply->writeInt32(buf); + reply->writeInt32(fence.get() != NULL); + if (fence.get() != NULL) { + reply->write(*fence.get()); + } reply->writeInt32(result); return NO_ERROR; } break; diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 8195de9..57bc604 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -198,7 +198,8 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer, int buf = -1; int reqW = mReqWidth ? mReqWidth : mUserWidth; int reqH = mReqHeight ? mReqHeight : mUserHeight; - status_t result = mSurfaceTexture->dequeueBuffer(&buf, reqW, reqH, + sp<Fence> fence; + status_t result = mSurfaceTexture->dequeueBuffer(&buf, fence, reqW, reqH, mReqFormat, mReqUsage); if (result < 0) { ALOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)" @@ -219,6 +220,15 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer, return result; } } + + if (fence.get()) { + status_t err = fence->wait(Fence::TIMEOUT_NEVER); + if (err != OK) { + ALOGE("dequeueBuffer: error waiting for fence: %d", err); + } + fence.clear(); + } + *buffer = gbuf.get(); *fenceFd = -1; return OK; |