From c85ce2531e12adaabbd44cbceffdf81e65d1ca14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 27 Jun 2021 17:57:56 -0400 Subject: [PATCH] radeonsi: align pipe_resource & sampler_view allocations to a cache line It eliminates "False Sharing" for atomic operations. (see wikipedia) Reviewed-By: Mike Blumenkrantz Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_buffer.c | 14 ++++++-------- src/gallium/drivers/radeonsi/si_state.c | 4 ++-- src/gallium/drivers/radeonsi/si_texture.c | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c index 98925a33c6a..1c45c534488 100644 --- a/src/gallium/drivers/radeonsi/si_buffer.c +++ b/src/gallium/drivers/radeonsi/si_buffer.c @@ -218,12 +218,12 @@ static void si_resource_destroy(struct pipe_screen *screen, struct pipe_resource 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); + FREE_CL(buffer); } else if (buf->flags & SI_RESOURCE_AUX_PLANE) { struct si_auxiliary_texture *tex = (struct si_auxiliary_texture *)buf; radeon_bo_reference(((struct si_screen*)screen)->ws, &tex->buffer, NULL); - FREE(tex); + FREE_CL(tex); } else { struct si_texture *tex = (struct si_texture *)buf; struct si_resource *resource = &tex->buffer; @@ -234,7 +234,7 @@ static void si_resource_destroy(struct pipe_screen *screen, struct pipe_resource si_resource_reference(&tex->cmask_buffer, NULL); } radeon_bo_reference(((struct si_screen*)screen)->ws, &resource->buf, NULL); - FREE(tex); + FREE_CL(tex); } } @@ -560,9 +560,7 @@ static void si_buffer_subdata(struct pipe_context *ctx, struct pipe_resource *bu static struct si_resource *si_alloc_buffer_struct(struct pipe_screen *screen, const struct pipe_resource *templ) { - struct si_resource *buf; - - buf = MALLOC_STRUCT(si_resource); + struct si_resource *buf = MALLOC_STRUCT_CL(si_resource); buf->b.b = *templ; buf->b.b.next = NULL; @@ -594,7 +592,7 @@ static struct pipe_resource *si_buffer_create(struct pipe_screen *screen, if (!si_alloc_resource(sscreen, buf)) { threaded_resource_deinit(&buf->b.b); - FREE(buf); + FREE_CL(buf); return NULL; } @@ -644,7 +642,7 @@ static struct pipe_resource *si_buffer_from_user_memory(struct pipe_screen *scre buf->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0); if (!buf->buf) { threaded_resource_deinit(&buf->b.b); - FREE(buf); + FREE_CL(buf); return NULL; } diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 03ed99ce56c..f77e7f48cfa 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -4321,7 +4321,7 @@ struct pipe_sampler_view *si_create_sampler_view_custom(struct pipe_context *ctx unsigned force_level) { struct si_context *sctx = (struct si_context *)ctx; - struct si_sampler_view *view = CALLOC_STRUCT(si_sampler_view); + struct si_sampler_view *view = CALLOC_STRUCT_CL(si_sampler_view); struct si_texture *tex = (struct si_texture *)texture; unsigned base_level, first_level, last_level; unsigned char state_swizzle[4]; @@ -4455,7 +4455,7 @@ static void si_sampler_view_destroy(struct pipe_context *ctx, struct pipe_sample struct si_sampler_view *view = (struct si_sampler_view *)state; pipe_resource_reference(&state->texture, NULL); - FREE(view); + FREE_CL(view); } static bool wrap_mode_uses_border_color(unsigned wrap, bool linear_filter) diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c index f17fe14309a..d335128c3ab 100644 --- a/src/gallium/drivers/radeonsi/si_texture.c +++ b/src/gallium/drivers/radeonsi/si_texture.c @@ -896,7 +896,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen, return NULL; } - tex = CALLOC_STRUCT(si_texture); + tex = CALLOC_STRUCT_CL(si_texture); if (!tex) goto error; @@ -1129,7 +1129,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen, return tex; error: - FREE(tex); + FREE_CL(tex); return NULL; } @@ -1584,7 +1584,7 @@ static struct pipe_resource *si_texture_from_handle(struct pipe_screen *screen, return NULL; if (whandle->plane >= util_format_get_num_planes(whandle->format)) { - struct si_auxiliary_texture *tex = CALLOC_STRUCT(si_auxiliary_texture); + struct si_auxiliary_texture *tex = CALLOC_STRUCT_CL(si_auxiliary_texture); if (!tex) return NULL; tex->b.b = *templ;