mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
panfrost: Recycle fixed-size transient BOs
The usual case. We use the bitset to mark freedom and seize it. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
parent
0f5ad9efcc
commit
37097b2f38
2 changed files with 26 additions and 3 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue