summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@collabora.com>2019-09-15 12:14:22 +0200
committerBoris Brezillon <boris.brezillon@collabora.com>2019-10-03 16:55:38 -0400
commit40a07bfbd746cca261194aba19a48589e0e32db6 (patch)
tree54c5baa32c72edad92c20880e1fc5554c1271023
parent819738e4af1ab0625e17c6fa555e5e23d737c5a0 (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 <boris.brezillon@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
-rw-r--r--src/gallium/drivers/panfrost/pan_job.c62
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