X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_batch.c;h=9918c259e48e9dac69ae8b36d012d1f9be679241;hb=f07154421ac5bb546dbd75fb74e8f2f8883c59c0;hp=2b7e19a6333b6117c28686120c099b54bad3f873;hpb=15ebf387fc43632be0e68365cf92ac8fb1b64a9c;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c index 2b7e19a6333..9918c259e48 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.c +++ b/src/gallium/drivers/freedreno/freedreno_batch.c @@ -55,12 +55,16 @@ batch_init(struct fd_batch *batch) } batch->draw = fd_ringbuffer_new(ctx->pipe, size); - batch->binning = fd_ringbuffer_new(ctx->pipe, size); - batch->gmem = fd_ringbuffer_new(ctx->pipe, size); + if (!batch->nondraw) { + batch->binning = fd_ringbuffer_new(ctx->pipe, size); + batch->gmem = fd_ringbuffer_new(ctx->pipe, size); - fd_ringbuffer_set_parent(batch->gmem, NULL); - fd_ringbuffer_set_parent(batch->draw, batch->gmem); - fd_ringbuffer_set_parent(batch->binning, batch->gmem); + fd_ringbuffer_set_parent(batch->gmem, NULL); + fd_ringbuffer_set_parent(batch->draw, batch->gmem); + fd_ringbuffer_set_parent(batch->binning, batch->gmem); + } else { + fd_ringbuffer_set_parent(batch->draw, NULL); + } batch->in_fence_fd = -1; batch->fence = fd_fence_create(batch); @@ -89,7 +93,7 @@ batch_init(struct fd_batch *batch) } struct fd_batch * -fd_batch_create(struct fd_context *ctx) +fd_batch_create(struct fd_context *ctx, bool nondraw) { struct fd_batch *batch = CALLOC_STRUCT(fd_batch); @@ -100,6 +104,7 @@ fd_batch_create(struct fd_context *ctx) pipe_reference_init(&batch->reference, 1); batch->ctx = ctx; + batch->nondraw = nondraw; batch->resources = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal); @@ -123,8 +128,13 @@ batch_fini(struct fd_batch *batch) fd_fence_ref(NULL, &batch->fence, NULL); fd_ringbuffer_del(batch->draw); - fd_ringbuffer_del(batch->binning); - fd_ringbuffer_del(batch->gmem); + if (!batch->nondraw) { + fd_ringbuffer_del(batch->binning); + fd_ringbuffer_del(batch->gmem); + } else { + debug_assert(!batch->binning); + debug_assert(!batch->gmem); + } if (batch->lrz_clear) { fd_ringbuffer_del(batch->lrz_clear); batch->lrz_clear = NULL; @@ -326,6 +336,7 @@ fd_batch_flush(struct fd_batch *batch, bool sync, bool force) * up used_resources */ struct fd_batch *tmp = NULL; + fd_batch_reference(&tmp, batch); batch_flush(tmp, force); if (sync) @@ -350,8 +361,8 @@ batch_depends_on(struct fd_batch *batch, struct fd_batch *other) return false; } -static void -batch_add_dep(struct fd_batch *batch, struct fd_batch *dep) +void +fd_batch_add_dep(struct fd_batch *batch, struct fd_batch *dep) { if (batch->dependents_mask & (1 << dep->idx)) return; @@ -382,6 +393,9 @@ fd_batch_resource_used(struct fd_batch *batch, struct fd_resource *rsc, bool wri DBG("%p: %s %p", batch, write ? "write" : "read", rsc); + if (write) + rsc->valid = true; + /* note, invalidate write batch, to avoid further writes to rsc * resulting in a write-after-read hazard. */ @@ -391,14 +405,29 @@ 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) + continue; /* note that batch_add_dep could flush and unref dep, so * we need to hold a reference to keep it live for the * fd_bc_invalidate_batch() */ fd_batch_reference(&b, dep); - batch_add_dep(batch, b); + fd_batch_add_dep(batch, b); fd_bc_invalidate_batch(b, false); fd_batch_reference_locked(&b, NULL); } @@ -406,7 +435,7 @@ fd_batch_resource_used(struct fd_batch *batch, struct fd_resource *rsc, bool wri fd_batch_reference_locked(&rsc->write_batch, batch); } else { if (rsc->write_batch) { - batch_add_dep(batch, rsc->write_batch); + fd_batch_add_dep(batch, rsc->write_batch); fd_bc_invalidate_batch(rsc->write_batch, false); } }