From f78575400977f644cf0b12beb2fa5fc278b6ed4c Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Thu, 14 Jun 2012 15:26:33 -0700 Subject: Pass fences from BufferQueue to SurfaceTextureClient ISurfaceTexture::dequeueBuffer now returns the buffer's fence for the client to wait on. For BufferQueue, this means passing it through Binder so it can be returned to the SurfaceTextureClient. Now SurfaceTextureClient is responsible for waiting on the fence in dequeueBuffer instead of BufferQueue: one step closer to the goal. Change-Id: I677ae758bcd23acee2d784b8cec11b32cccc196d --- libs/gui/SurfaceTextureClient.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'libs/gui/SurfaceTextureClient.cpp') diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 8195de972e..57bc604f14 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; + 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; -- cgit v1.2.3-59-g8ed1b