From: Rob Clark Date: Sat, 10 Feb 2018 19:12:11 +0000 (-0500) Subject: freedreno: small fix for flushing dependent batches X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=831fb29252859c8aaf2bc1c2573a83f30d664204;p=mesa.git freedreno: small fix for flushing dependent batches Flush a resource's previous write_batch synchronously. Because a resource's associated batches are not updated until after the flush thread submits rendering to the kernel, this was causing a bit of confusion in the following loop. This fixes a bug that appeared with recent stk. Perhaps we need to re-work things a bit to clear out dependent patches in the ctx's thread and use a fence to deal with the period between when a flush is queued and when it is submitted to the kernel. But this will do until time permits a larger refactor. Signed-off-by: Rob Clark --- diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c index e44e8e5403e..9918c259e48 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.c +++ b/src/gallium/drivers/freedreno/freedreno_batch.c @@ -405,6 +405,19 @@ fd_batch_resource_used(struct fd_batch *batch, struct fd_resource *rsc, bool wri if (rsc->batch_mask != (1 << batch->idx)) { struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache; struct fd_batch *dep; + + if (rsc->write_batch && rsc->write_batch != batch) { + struct fd_batch *b = NULL; + fd_batch_reference(&b, rsc->write_batch); + + mtx_unlock(&batch->ctx->screen->lock); + fd_batch_flush(b, true, false); + mtx_lock(&batch->ctx->screen->lock); + + fd_bc_invalidate_batch(b, false); + fd_batch_reference_locked(&b, NULL); + } + foreach_batch(dep, cache, rsc->batch_mask) { struct fd_batch *b = NULL; if (dep == batch)