From 9ba17ec21a4258bc93a642142e0afa4a7342c01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 5 May 2021 20:16:31 -0400 Subject: [PATCH] radeonsi: generate buffer_id_unique for u_threaded_context Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_buffer.c | 9 ++++++++- src/gallium/drivers/radeonsi/si_pipe.c | 3 +++ src/gallium/drivers/radeonsi/si_pipe.h | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c index f9945a820a5..7396234c994 100644 --- a/src/gallium/drivers/radeonsi/si_buffer.c +++ b/src/gallium/drivers/radeonsi/si_buffer.c @@ -221,11 +221,13 @@ bool si_alloc_resource(struct si_screen *sscreen, struct si_resource *res) static void si_resource_destroy(struct pipe_screen *screen, struct pipe_resource *buf) { if (buf->target == PIPE_BUFFER) { + struct si_screen *sscreen = (struct si_screen *)screen; struct si_resource *buffer = si_resource(buf); threaded_resource_deinit(buf); util_range_destroy(&buffer->valid_buffer_range); radeon_bo_reference(((struct si_screen*)screen)->ws, &buffer->buf, NULL); + util_idalloc_mt_free(&sscreen->buffer_ids, buffer->b.buffer_id_unique); FREE(buffer); } else if (buf->flags & SI_RESOURCE_AUX_PLANE) { struct si_auxiliary_texture *tex = (struct si_auxiliary_texture *)buf; @@ -303,6 +305,8 @@ void si_replace_buffer_storage(struct pipe_context *ctx, struct pipe_resource *d assert(sdst->domains == ssrc->domains); si_rebind_buffer(sctx, dst); + + util_idalloc_mt_free(&sctx->screen->buffer_ids, delete_buffer_id); } static void si_invalidate_resource(struct pipe_context *ctx, struct pipe_resource *resource) @@ -608,6 +612,8 @@ static struct pipe_resource *si_buffer_create(struct pipe_screen *screen, FREE(buf); return NULL; } + + buf->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids); return &buf->b.b; } @@ -660,7 +666,7 @@ static struct pipe_resource *si_buffer_from_user_memory(struct pipe_screen *scre buf->gpu_address = ws->buffer_get_virtual_address(buf->buf); buf->vram_usage_kb = 0; buf->gart_usage_kb = templ->width0 / 1024; - + buf->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids); return &buf->b.b; } @@ -694,6 +700,7 @@ struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen, res->flags |= RADEON_FLAG_SPARSE; } + res->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids); return &res->b.b; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 6d6bb19e4fa..32d7cd1b95d 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -876,6 +876,8 @@ static void si_destroy_screen(struct pipe_screen *pscreen) disk_cache_destroy(sscreen->disk_shader_cache); util_live_shader_cache_deinit(&sscreen->live_shader_cache); + util_idalloc_mt_fini(&sscreen->buffer_ids); + sscreen->ws->destroy(sscreen->ws); FREE(sscreen); } @@ -1027,6 +1029,7 @@ static struct pipe_screen *radeonsi_screen_create_impl(struct radeon_winsys *ws, return NULL; } + util_idalloc_mt_init_tc(&sscreen->buffer_ids); /* Set functions first. */ sscreen->b.context_create = si_pipe_create_context; diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index b4c37565168..33b0b168a36 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -666,6 +666,8 @@ struct si_screen { unsigned ps_wave_size; unsigned ge_wave_size; unsigned ngg_subgroup_size; + + struct util_idalloc_mt buffer_ids; }; struct si_sampler_view {