From 37097b2f3818e3a30319600f3441b96dc1261382 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 12 Jul 2019 13:05:14 -0700 Subject: panfrost: Recycle fixed-size transient BOs The usual case. We use the bitset to mark freedom and seize it. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_allocate.c | 21 ++++++++++++++++++--- src/gallium/drivers/panfrost/pan_job.c | 8 ++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/gallium/drivers/panfrost/pan_allocate.c b/src/gallium/drivers/panfrost/pan_allocate.c index 4febb001033..a0a96c15b94 100644 --- a/src/gallium/drivers/panfrost/pan_allocate.c +++ b/src/gallium/drivers/panfrost/pan_allocate.c @@ -97,12 +97,27 @@ panfrost_allocate_transient(struct panfrost_context *ctx, size_t sz) bool update_offset = false; if (sz < TRANSIENT_SLAB_SIZE) { - /* TODO: Lookup free */ - + /* First, look for a free slot */ + unsigned count = util_dynarray_num_elements(&screen->transient_bo, void *); unsigned index = 0; - if (!bo) + unsigned free = __bitset_ffs( + screen->free_transient, + count / BITSET_WORDBITS); + + if (likely(free)) { + /* Use this one */ + index = free - 1; + + /* It's ours, so no longer free */ + BITSET_CLEAR(screen->free_transient, index); + + /* Grab the BO */ + bo = pan_bo_for_index(screen, index); + } else { + /* Otherwise, create a new BO */ bo = panfrost_create_slab(screen, &index); + } /* Remember we created this */ util_dynarray_append(&batch->transient_indices, unsigned, index); diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index a802030769f..0faefe2157a 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -61,6 +61,14 @@ panfrost_free_job(struct panfrost_context *ctx, struct panfrost_job *job) panfrost_bo_unreference(ctx->base.screen, bo); } + /* Free up the transient BOs we're sitting on */ + struct panfrost_screen *screen = pan_screen(ctx->base.screen); + + util_dynarray_foreach(&job->transient_indices, unsigned, index) { + /* Mark it free */ + BITSET_SET(screen->free_transient, *index); + } + _mesa_hash_table_remove_key(ctx->jobs, &job->key); if (ctx->job == job) -- cgit v1.2.3