diff options
author | Rob Clark <[email protected]> | 2018-02-10 14:12:11 -0500 |
---|---|---|
committer | Rob Clark <[email protected]> | 2018-02-10 14:54:58 -0500 |
commit | 831fb29252859c8aaf2bc1c2573a83f30d664204 (patch) | |
tree | 5fdedb81251d1e5c660ea3addf8a1d6c4729f41a /src/gallium/drivers/freedreno/freedreno_batch.c | |
parent | c57ed8e01cb40ef9a422346c3d304c1a3cc1f418 (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_batch.c')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_batch.c | 13 |
1 files changed, 13 insertions, 0 deletions
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) |