From 7116decfce3a6d6cff2dee3f18ec29796abfbcd5 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 3 Jun 2020 11:08:34 -0400 Subject: [PATCH] zink: destroy gfx program when a shader is freed there's no sense in having these objects sitting around when they can never be used again requires adding a zink_context* pointer to each program in order to prune the hash table entry Reviewed-by: Antonio Caggiano Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 7 +++++-- src/gallium/drivers/zink/zink_compiler.h | 3 ++- src/gallium/drivers/zink/zink_context.c | 4 ++-- src/gallium/drivers/zink/zink_draw.c | 3 +-- src/gallium/drivers/zink/zink_program.c | 9 +++++---- src/gallium/drivers/zink/zink_program.h | 6 ++---- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 33e7631130b..9b084d2a15c 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -309,11 +309,14 @@ zink_compile_nir(struct zink_screen *screen, struct nir_shader *nir, } void -zink_shader_free(struct zink_screen *screen, struct zink_shader *shader) +zink_shader_free(struct zink_context *ctx, struct zink_shader *shader) { + struct zink_screen *screen = zink_screen(ctx->base.screen); vkDestroyShaderModule(screen->dev, shader->shader_module, NULL); set_foreach(shader->programs, entry) { - zink_gfx_program_remove_shader((void*)entry->key, shader); + struct zink_gfx_program *prog = (void*)entry->key; + _mesa_hash_table_remove_key(ctx->program_cache, prog->stages); + zink_destroy_gfx_program(screen, prog); } _mesa_set_destroy(shader->programs, NULL); FREE(shader); diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index abc1fbc44f6..ed22479ca20 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -32,6 +32,7 @@ #include struct pipe_screen; +struct zink_context; struct zink_screen; struct zink_gfx_program; @@ -71,6 +72,6 @@ zink_compile_nir(struct zink_screen *screen, struct nir_shader *nir, const struct pipe_stream_output_info *so_info); void -zink_shader_free(struct zink_screen *screen, struct zink_shader *shader); +zink_shader_free(struct zink_context *ctx, struct zink_shader *shader); #endif diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index be0c5ad9ebc..a9cbd929e4a 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -323,7 +323,7 @@ static void zink_delete_vs_state(struct pipe_context *pctx, void *cso) { - zink_shader_free(zink_screen(pctx->screen), cso); + zink_shader_free(zink_context(pctx), cso); } static void * @@ -350,7 +350,7 @@ static void zink_delete_fs_state(struct pipe_context *pctx, void *cso) { - zink_shader_free(zink_screen(pctx->screen), cso); + zink_shader_free(zink_context(pctx), cso); } static void diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 7ffd3e800c6..a9d6bcbf08c 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -164,8 +164,7 @@ get_gfx_program(struct zink_context *ctx) ctx->gfx_stages); if (!entry) { struct zink_gfx_program *prog; - prog = zink_create_gfx_program(zink_screen(ctx->base.screen), - ctx->gfx_stages); + prog = zink_create_gfx_program(ctx, ctx->gfx_stages); entry = _mesa_hash_table_insert(ctx->program_cache, prog->stages, prog); if (!entry) return NULL; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index b4827fa56c3..0de286d4691 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -109,9 +109,10 @@ equals_gfx_pipeline_state(const void *a, const void *b) } struct zink_gfx_program * -zink_create_gfx_program(struct zink_screen *screen, +zink_create_gfx_program(struct zink_context *ctx, struct zink_shader *stages[PIPE_SHADER_TYPES - 1]) { + struct zink_screen *screen = zink_screen(ctx->base.screen); struct zink_gfx_program *prog = CALLOC_STRUCT(zink_gfx_program); if (!prog) goto fail; @@ -152,8 +153,8 @@ fail: return NULL; } -void -zink_gfx_program_remove_shader(struct zink_gfx_program *prog, struct zink_shader *shader) +static void +gfx_program_remove_shader(struct zink_gfx_program *prog, struct zink_shader *shader) { enum pipe_shader_type p_stage = pipe_shader_type_from_mesa(shader->info.stage); @@ -174,7 +175,7 @@ zink_destroy_gfx_program(struct zink_screen *screen, for (int i = 0; i < PIPE_SHADER_TYPES - 1; ++i) { if (prog->stages[i]) - zink_gfx_program_remove_shader(prog, prog->stages[i]); + gfx_program_remove_shader(prog, prog->stages[i]); } /* unref all used render-passes */ diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index da52f6009b2..91460aa2341 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -28,6 +28,7 @@ #include "pipe/p_state.h" +struct zink_context; struct zink_screen; struct zink_shader; struct zink_gfx_pipeline_state; @@ -45,7 +46,7 @@ struct zink_gfx_program { }; struct zink_gfx_program * -zink_create_gfx_program(struct zink_screen *screen, +zink_create_gfx_program(struct zink_context *ctx, struct zink_shader *stages[PIPE_SHADER_TYPES - 1]); void @@ -58,7 +59,4 @@ zink_get_gfx_pipeline(struct zink_screen *screen, struct zink_gfx_pipeline_state *state, enum pipe_prim_type mode); -void -zink_gfx_program_remove_shader(struct zink_gfx_program *prog, struct zink_shader *shader); - #endif -- 2.30.2