zink: destroy gfx program when a shader is freed
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 3 Jun 2020 15:08:34 +0000 (11:08 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sat, 18 Jul 2020 07:51:37 +0000 (07:51 +0000)
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 <antonio.caggiano@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5887>

src/gallium/drivers/zink/zink_compiler.c
src/gallium/drivers/zink/zink_compiler.h
src/gallium/drivers/zink/zink_context.c
src/gallium/drivers/zink/zink_draw.c
src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_program.h

index 33e7631130bd34a1039b4af60214f25111878315..9b084d2a15c43a12b6be0789f492628af862c2c1 100644 (file)
@@ -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);
index abc1fbc44f66bb97b03d76477c6884014a6dce4a..ed22479ca205fcbcac355fb0bb99dd721cc7d180 100644 (file)
@@ -32,6 +32,7 @@
 #include <vulkan/vulkan.h>
 
 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
index be0c5ad9ebc6b7c2c9232c96378673436d1d907a..a9cbd929e4a1fea128d4db0d824d3d3e8f8c569d 100644 (file)
@@ -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
index 7ffd3e800c6425a75c27bc21a6fa69bcea52cb7b..a9d6bcbf08c28946a163997cc92eaa53964b7de3 100644 (file)
@@ -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;
index b4827fa56c3950cd8143eae0e253492e202fc79b..0de286d4691447628f783a55dcc3fb60ce1c2a4f 100644 (file)
@@ -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 */
index da52f6009b2c969aff87dd72e1dc358fd4764c2f..91460aa2341cbdfeebaf2cf4e339b717c6a31dc5 100644 (file)
@@ -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