diff options
author | 2012-06-25 13:54:23 -0700 | |
---|---|---|
committer | 2012-06-28 17:08:42 -0700 | |
commit | f9783af225aa3b41ec0af36f90941a714269abb7 (patch) | |
tree | 6d6ff4e211848dddf2314da20cf27548b2bf83c6 | |
parent | b7c839b1103f72f8eb89fc0e19f7805969fc622f (diff) |
Return fence to client in dequeuBuffer
Change-Id: Ic19750793ad993f0e85391f3cabd743ba565d4c9
-rw-r--r-- | include/ui/Fence.h | 5 | ||||
-rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 13 | ||||
-rw-r--r-- | libs/ui/Fence.cpp | 4 |
3 files changed, 17 insertions, 5 deletions
diff --git a/include/ui/Fence.h b/include/ui/Fence.h index 195f2e9e35..3d49e6a140 100644 --- a/include/ui/Fence.h +++ b/include/ui/Fence.h @@ -69,6 +69,11 @@ public: static sp<Fence> merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2); + // Return a duplicate of the fence file descriptor. The caller is + // responsible for closing the returned file descriptor. On error, -1 will + // be returned and errno will indicate the problem. + int dup() const; + // Flattenable interface size_t getFlattenedSize() const; size_t getFdCount() const; diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 57bc604f14..84f2ff4e91 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -222,15 +222,18 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer, } if (fence.get()) { - status_t err = fence->wait(Fence::TIMEOUT_NEVER); - if (err != OK) { - ALOGE("dequeueBuffer: error waiting for fence: %d", err); + *fenceFd = fence->dup(); + if (*fenceFd == -1) { + ALOGE("dequeueBuffer: error duping fence: %d", errno); + // dup() should never fail; something is badly wrong. Soldier on + // and hope for the best; the worst that should happen is some + // visible corruption that lasts until the next frame. } - fence.clear(); + } else { + *fenceFd = -1; } *buffer = gbuf.get(); - *fenceFd = -1; return OK; } diff --git a/libs/ui/Fence.cpp b/libs/ui/Fence.cpp index 5c17d10e78..08340f24b5 100644 --- a/libs/ui/Fence.cpp +++ b/libs/ui/Fence.cpp @@ -62,6 +62,10 @@ sp<Fence> Fence::merge(const String8& name, const sp<Fence>& f1, return sp<Fence>(new Fence(result)); } +int Fence::dup() const { + return ::dup(mFenceFd); +} + size_t Fence::getFlattenedSize() const { return 0; } |