Mesa (master): zink: destroy gfx program when a shader is freed
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Jul 18 10:46:45 UTC 2020
Module: Mesa
Branch: master
Commit: 7116decfce3a6d6cff2dee3f18ec29796abfbcd5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7116decfce3a6d6cff2dee3f18ec29796abfbcd5
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Jun 3 11:08:34 2020 -0400
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 <antonio.caggiano at collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5887>
---
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 <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
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
More information about the mesa-commit
mailing list