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