Return fence to client in dequeuBuffer

Change-Id: Ic19750793ad993f0e85391f3cabd743ba565d4c9
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 57bc604..84f2ff4 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -222,15 +222,18 @@
     }
 
     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 5c17d10..08340f2 100644
--- a/libs/ui/Fence.cpp
+++ b/libs/ui/Fence.cpp
@@ -62,6 +62,10 @@
     return sp<Fence>(new Fence(result));
 }
 
+int Fence::dup() const {
+    return ::dup(mFenceFd);
+}
+
 size_t Fence::getFlattenedSize() const {
     return 0;
 }