From a1fb2e9c2794e5304c5e1f636b1638bb89a9a075 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 10 May 2021 06:50:49 -0400 Subject: [PATCH] zink: use u_live_shader_cache let the duplicated shader madness end Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_compiler.h | 2 + src/gallium/drivers/zink/zink_program.c | 51 +++++++++++++++--------- src/gallium/drivers/zink/zink_program.h | 5 +++ src/gallium/drivers/zink/zink_screen.c | 4 ++ src/gallium/drivers/zink/zink_screen.h | 3 ++ 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index a38df2a7ef7..844aee95d05 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -29,6 +29,7 @@ #include "compiler/nir/nir.h" #include "compiler/shader_info.h" +#include "util/u_live_shader_cache.h" #include #include "zink_descriptors.h" @@ -66,6 +67,7 @@ struct nir_shader * zink_tgsi_to_nir(struct pipe_screen *screen, const struct tgsi_token *tokens); struct zink_shader { + struct util_live_shader base; unsigned shader_id; struct nir_shader *nir; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 9901ab4cbc8..0c3709c6177 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1031,12 +1031,6 @@ zink_bind_tes_state(struct pipe_context *pctx, bind_stage(ctx, PIPE_SHADER_TESS_EVAL, cso); } -static void -zink_delete_shader_state(struct pipe_context *pctx, void *cso) -{ - zink_shader_free(zink_context(pctx), cso); -} - static void * zink_create_cs_state(struct pipe_context *pctx, const struct pipe_compute_state *shader) @@ -1057,10 +1051,16 @@ zink_bind_cs_state(struct pipe_context *pctx, bind_stage(zink_context(pctx), PIPE_SHADER_COMPUTE, cso); } -static void * +void +zink_delete_shader_state(struct pipe_context *pctx, void *cso) +{ + zink_shader_free(zink_context(pctx), cso); +} + +void * zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader) { - struct nir_shader *nir; + nir_shader *nir; if (shader->type != PIPE_SHADER_IR_NIR) nir = zink_tgsi_to_nir(pctx->screen, shader->tokens); else @@ -1069,28 +1069,43 @@ zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader return zink_shader_create(zink_screen(pctx->screen), nir, &shader->stream_output); } +static void +zink_delete_cached_shader_state(struct pipe_context *pctx, void *cso) +{ + struct zink_screen *screen = zink_screen(pctx->screen); + util_shader_reference(pctx, &screen->shaders, &cso, NULL); +} + +static void * +zink_create_cached_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader) +{ + bool cache_hit; + struct zink_screen *screen = zink_screen(pctx->screen); + return util_live_shader_cache_get(pctx, &screen->shaders, shader, &cache_hit); +} + void zink_program_init(struct zink_context *ctx) { - ctx->base.create_vs_state = zink_create_gfx_shader_state; + ctx->base.create_vs_state = zink_create_cached_shader_state; ctx->base.bind_vs_state = zink_bind_vs_state; - ctx->base.delete_vs_state = zink_delete_shader_state; + ctx->base.delete_vs_state = zink_delete_cached_shader_state; - ctx->base.create_fs_state = zink_create_gfx_shader_state; + ctx->base.create_fs_state = zink_create_cached_shader_state; ctx->base.bind_fs_state = zink_bind_fs_state; - ctx->base.delete_fs_state = zink_delete_shader_state; + ctx->base.delete_fs_state = zink_delete_cached_shader_state; - ctx->base.create_gs_state = zink_create_gfx_shader_state; + ctx->base.create_gs_state = zink_create_cached_shader_state; ctx->base.bind_gs_state = zink_bind_gs_state; - ctx->base.delete_gs_state = zink_delete_shader_state; + ctx->base.delete_gs_state = zink_delete_cached_shader_state; - ctx->base.create_tcs_state = zink_create_gfx_shader_state; + ctx->base.create_tcs_state = zink_create_cached_shader_state; ctx->base.bind_tcs_state = zink_bind_tcs_state; - ctx->base.delete_tcs_state = zink_delete_shader_state; + ctx->base.delete_tcs_state = zink_delete_cached_shader_state; - ctx->base.create_tes_state = zink_create_gfx_shader_state; + ctx->base.create_tes_state = zink_create_cached_shader_state; ctx->base.bind_tes_state = zink_bind_tes_state; - ctx->base.delete_tes_state = zink_delete_shader_state; + ctx->base.delete_tes_state = zink_delete_cached_shader_state; ctx->base.create_compute_state = zink_create_cs_state; ctx->base.bind_compute_state = zink_bind_cs_state; diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 7449926d14c..56feaa9a344 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -128,6 +128,11 @@ zink_desc_type_from_vktype(VkDescriptorType type) } +void +zink_delete_shader_state(struct pipe_context *pctx, void *cso); +void * +zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader); + unsigned zink_program_num_bindings_typed(const struct zink_program *pg, enum zink_descriptor_type type, bool is_compute); diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index e8a670120b1..70f37a6fbbd 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -31,6 +31,7 @@ #include "zink_format.h" #include "zink_framebuffer.h" #include "zink_instance.h" +#include "zink_program.h" #include "zink_public.h" #include "zink_resource.h" #include "nir_to_spirv/nir_to_spirv.h" // for SPIRV_VERSION @@ -1012,6 +1013,8 @@ zink_destroy_screen(struct pipe_screen *pscreen) simple_mtx_destroy(&screen->mem_cache_mtx); vkDestroyPipelineCache(screen->dev, screen->pipeline_cache, NULL); + util_live_shader_cache_deinit(&screen->shaders); + if (screen->sem) vkDestroySemaphore(screen->dev, screen->sem, NULL); if (screen->prev_sem) @@ -1654,6 +1657,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config) #endif // VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME check_base_requirements(screen); + util_live_shader_cache_init(&screen->shaders, zink_create_gfx_shader_state, zink_delete_shader_state); screen->base.get_name = zink_get_name; screen->base.get_vendor = zink_get_vendor; diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index ed1745a4d58..d188234bd49 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -35,6 +35,7 @@ #include "util/disk_cache.h" #include "util/log.h" #include "util/simple_mtx.h" +#include "util/u_live_shader_cache.h" #include @@ -88,6 +89,8 @@ struct zink_screen { struct disk_cache *disk_cache; cache_key disk_cache_key; + struct util_live_shader_cache shaders; + simple_mtx_t mem_cache_mtx; struct hash_table *resource_mem_cache;