Mesa (main): zink: use u_live_shader_cache

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 16 04:59:42 UTC 2021


Module: Mesa
Branch: main
Commit: a1fb2e9c2794e5304c5e1f636b1638bb89a9a075
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a1fb2e9c2794e5304c5e1f636b1638bb89a9a075

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon May 10 06:50:49 2021 -0400

zink: use u_live_shader_cache

let the duplicated shader madness end

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11403>

---

 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 <vulkan/vulkan.h>
 #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 <vulkan/vulkan.h>
 
@@ -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;
 



More information about the mesa-commit mailing list