diff options
author | Rob Clark <[email protected]> | 2016-07-13 09:49:53 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2016-07-30 09:23:42 -0400 |
commit | 00bed8a794de3d80a46b65b9ab23c6df83e416a8 (patch) | |
tree | 7098b39af0e3a10665314e97487e6773c2c9312f /src/gallium/drivers/freedreno/freedreno_resource.c | |
parent | c44163876a2858aea219a08bd2e048b76953cff9 (diff) |
freedreno: threaded batch flush
With the state accessed from GMEM+submit factored out of fd_context and
into fd_batch, now it is possible to punt this off to a helper thread.
And more importantly, since there are cases where one context might
force the batch-cache to flush another context's batches (ie. when there
are too many in-flight batches), using a per-context helper thread keeps
various different flushes for a given context serialized.
TODO as with batch-cache, there are a few places where we'll need a
mutex to protect critical sections, which is completely missing at the
moment.
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_resource.c')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_resource.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 0e0305885a7..a091f5f1774 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -516,12 +516,18 @@ fd_resource_transfer_map(struct pipe_context *pctx, if (needs_flush) { if (usage & PIPE_TRANSFER_WRITE) { - struct fd_batch *batch; - foreach_batch(batch, &ctx->screen->batch_cache, rsc->batch_mask) - fd_batch_flush(batch); + struct fd_batch *batch, *last_batch = NULL; + foreach_batch(batch, &ctx->screen->batch_cache, rsc->batch_mask) { + fd_batch_reference(&last_batch, batch); + fd_batch_flush(batch, false); + } + if (last_batch) { + fd_batch_sync(last_batch); + fd_batch_reference(&last_batch, NULL); + } assert(rsc->batch_mask == 0); } else { - fd_batch_flush(rsc->write_batch); + fd_batch_flush(rsc->write_batch, true); } assert(!rsc->write_batch); } @@ -1080,7 +1086,7 @@ fd_flush_resource(struct pipe_context *pctx, struct pipe_resource *prsc) struct fd_resource *rsc = fd_resource(prsc); if (rsc->write_batch) - fd_batch_flush(rsc->write_batch); + fd_batch_flush(rsc->write_batch, true); assert(!rsc->write_batch); } |