summaryrefslogtreecommitdiffstats
path: root/libs/gui/SurfaceTextureClient.cpp
diff options
context:
space:
mode:
authorJesse Hall <jessehall@google.com>2012-06-14 15:26:33 -0700
committerJesse Hall <jessehall@google.com>2012-06-21 22:21:12 -0700
commitf78575400977f644cf0b12beb2fa5fc278b6ed4c (patch)
tree075c491472c6584c30920dbb26f8c97811e2f882 /libs/gui/SurfaceTextureClient.cpp
parentef19414bd8b77a26f5751f3845be79025a8263fe (diff)
downloadframeworks_native-f78575400977f644cf0b12beb2fa5fc278b6ed4c.tar.gz
frameworks_native-f78575400977f644cf0b12beb2fa5fc278b6ed4c.tar.bz2
frameworks_native-f78575400977f644cf0b12beb2fa5fc278b6ed4c.zip
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
Diffstat (limited to 'libs/gui/SurfaceTextureClient.cpp')
-rw-r--r--libs/gui/SurfaceTextureClient.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 8195de972..57bc604f1 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;