freedreno: fix eglDupNativeFenceFD error

We can end up with scenarios where last_fence is associated with a batch
that is flushed through some other path before needs_out_fence_fd gets
set.  Resulting in returning a fence that has no backing fd.

The simplest thing is to just skip the optimization to try and avoid
no-op batches when a fence-fd is requested.  This should normally be
just once a frame anyways.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
This commit is contained in:
Rob Clark 2019-11-12 09:01:34 -08:00
parent bd49dedae0
commit d509a46225
1 changed files with 10 additions and 4 deletions

View File

@ -49,6 +49,14 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep,
DBG("%p: flush: flags=%x\n", ctx->batch, flags);
/* In some sequence of events, we can end up with a last_fence that is
* not an "fd" fence, which results in eglDupNativeFenceFDANDROID()
* errors.
*
*/
if (flags & PIPE_FLUSH_FENCE_FD)
fd_fence_ref(&ctx->last_fence, NULL);
/* if no rendering since last flush, ie. app just decided it needed
* a fence, re-use the last one:
*/
@ -63,10 +71,8 @@ fd_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fencep,
/* Take a ref to the batch's fence (batch can be unref'd when flushed: */
fd_fence_ref(&fence, batch->fence);
/* TODO is it worth trying to figure out if app is using fence-fd's, to
* avoid requesting one every batch?
*/
batch->needs_out_fence_fd = true;
if (flags & PIPE_FLUSH_FENCE_FD)
batch->needs_out_fence_fd = true;
if (!ctx->screen->reorder) {
fd_batch_flush(batch, true);