diff options
author | Boris Brezillon <[email protected]> | 2019-09-15 12:14:22 +0200 |
---|---|---|
committer | Boris Brezillon <[email protected]> | 2019-10-03 16:55:38 -0400 |
commit | 40a07bfbd746cca261194aba19a48589e0e32db6 (patch) | |
tree | 54c5baa32c72edad92c20880e1fc5554c1271023 /src | |
parent | 819738e4af1ab0625e17c6fa555e5e23d737c5a0 (diff) |
panfrost: Add a panfrost_freeze_batch() helper
We'll soon need to freeze a batch not only when it's flushed, but also
when another batch depends on us, so let's add a helper to avoid
duplicating the logic.
Signed-off-by: Boris Brezillon <[email protected]>
Reviewed-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/panfrost/pan_job.c | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 55780dd3d9d..872c846207b 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -99,21 +99,58 @@ panfrost_create_batch(struct panfrost_context *ctx, } static void +panfrost_freeze_batch(struct panfrost_batch *batch) +{ + struct panfrost_context *ctx = batch->ctx; + struct hash_entry *entry; + + /* Remove the entry in the FBO -> batch hash table if the batch + * matches. This way, next draws/clears targeting this FBO will trigger + * the creation of a new batch. + */ + entry = _mesa_hash_table_search(ctx->batches, &batch->key); + if (entry && entry->data == batch) + _mesa_hash_table_remove(ctx->batches, entry); + + /* If this is the bound batch, the panfrost_context parameters are + * relevant so submitting it invalidates those parameters, but if it's + * not bound, the context parameters are for some other batch so we + * can't invalidate them. + */ + if (ctx->batch == batch) { + panfrost_invalidate_frame(ctx); + ctx->batch = NULL; + } +} + +#ifndef NDEBUG +static bool panfrost_batch_is_frozen(struct panfrost_batch *batch) +{ + struct panfrost_context *ctx = batch->ctx; + struct hash_entry *entry; + + entry = _mesa_hash_table_search(ctx->batches, &batch->key); + if (entry && entry->data == batch) + return false; + + if (ctx->batch == batch) + return false; + + return true; +} +#endif + +static void panfrost_free_batch(struct panfrost_batch *batch) { if (!batch) return; - struct panfrost_context *ctx = batch->ctx; + assert(panfrost_batch_is_frozen(batch)); hash_table_foreach(batch->bos, entry) panfrost_bo_unreference((struct panfrost_bo *)entry->key); - _mesa_hash_table_remove_key(ctx->batches, &batch->key); - - if (ctx->batch == batch) - ctx->batch = NULL; - /* The out_sync fence lifetime is different from the the batch one * since other batches might want to wait on a fence of already * submitted/signaled batch. All we need to do here is make sure the @@ -529,19 +566,8 @@ panfrost_batch_submit(struct panfrost_batch *batch) fprintf(stderr, "panfrost_batch_submit failed: %d\n", ret); out: - /* If this is the bound batch, the panfrost_context parameters are - * relevant so submitting it invalidates those paramaters, but if it's - * not bound, the context parameters are for some other batch so we - * can't invalidate them. - */ - if (ctx->batch == batch) - panfrost_invalidate_frame(ctx); - - /* The job has been submitted, let's invalidate the current FBO job - * cache. - */ + panfrost_freeze_batch(batch); assert(!ctx->batch || batch == ctx->batch); - ctx->batch = NULL; /* We always stall the pipeline for correct results since pipelined * rendering is quite broken right now (to be fixed by the panfrost_job |