OSDN Git Service

bufferqueue: workaround: allow NULL fence with queueBuffer (DO NOT MERGE)
authorJesse Hall <jessehall@google.com>
Sun, 19 Oct 2014 04:47:04 +0000 (21:47 -0700)
committerJesse Hall <jessehall@google.com>
Sun, 19 Oct 2014 04:57:10 +0000 (04:57 +0000)
On one device there is a bug, not yet root-caused, that causes fence
fds to not make it across binder from producer to consumer in the
IGraphicBufferProducer::queueBuffer call. Rather than returning an
error, which the producer typically treats as a fatal error, this
change allows the buffer to be queued with no fence. This avoids an
application crash at the risk of (likely single-frame) visible
corruption.

Bug: 17946343
Change-Id: I9ca89f94098c455e1e90f5f58d5336c936b04a9c

libs/gui/BufferQueueProducer.cpp

index a53775f..d2fd3b0 100644 (file)
@@ -522,7 +522,12 @@ status_t BufferQueueProducer::queueBuffer(int slot,
 
     if (fence == NULL) {
         BQ_LOGE("queueBuffer: fence is NULL");
-        return BAD_VALUE;
+        // Temporary workaround for b/17946343: soldier-on instead of returning an error. This
+        // prevents the client from dying, at the risk of visible corruption due to hwcomposer
+        // reading the buffer before the producer is done rendering it. Unless the buffer is the
+        // last frame of an animation, the corruption will be transient.
+        fence = Fence::NO_FENCE;
+        // return BAD_VALUE;
     }
 
     switch (scalingMode) {