Mesa (main): zink: split up shader cache per-stage

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 6 18:15:31 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 14 16:02:52 2021 -0400

zink: split up shader cache per-stage

this reduces overhead from lookups by ensuring that the number of entries
in a given table are minimized

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

---

 src/gallium/drivers/zink/zink_program.c | 20 ++++++++++++--------
 src/gallium/drivers/zink/zink_program.h |  2 +-
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index e34a23233eb..c563af7018e 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -236,7 +236,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
    }
    keybox = make_keybox(prog, stage, &key, key.size, &key.base, base_size);
    hash = keybox_hash(keybox);
-   struct hash_entry *entry = _mesa_hash_table_search_pre_hashed(&prog->base.shader_cache,
+   struct hash_entry *entry = _mesa_hash_table_search_pre_hashed(&prog->base.shader_cache[pstage],
                                                                  hash, keybox);
 
    if (entry) {
@@ -258,7 +258,7 @@ get_shader_module_for_stage(struct zink_context *ctx, struct zink_shader *zs, st
       }
       zm->shader = mod;
 
-      _mesa_hash_table_insert_pre_hashed(&prog->base.shader_cache, hash, keybox, zm);
+      _mesa_hash_table_insert_pre_hashed(&prog->base.shader_cache[pstage], hash, keybox, zm);
       if (key.is_default_variant) {
          /* previously returned */
          *default_zm = zm;
@@ -507,7 +507,10 @@ zink_create_gfx_program(struct zink_context *ctx,
       goto fail;
 
    pipe_reference_init(&prog->base.reference, 1);
-   _mesa_hash_table_init(&prog->base.shader_cache, prog, keybox_hash, keybox_equals);
+   for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
+      if (stages[i])
+         _mesa_hash_table_init(&prog->base.shader_cache[i], prog, keybox_hash, keybox_equals);
+   }
 
    init_slot_map(ctx, prog);
 
@@ -595,14 +598,14 @@ zink_create_compute_program(struct zink_context *ctx, struct zink_shader *shader
    pipe_reference_init(&comp->base.reference, 1);
    comp->base.is_compute = true;
    /* TODO: cs shader keys placeholder for now */
-   _mesa_hash_table_init(&comp->base.shader_cache, comp, _mesa_hash_u32, _mesa_key_u32_equal);
+   _mesa_hash_table_init(&comp->base.shader_cache[0], comp, _mesa_hash_u32, _mesa_key_u32_equal);
 
    comp->module = CALLOC_STRUCT(zink_shader_module);
    assert(comp->module);
    pipe_reference_init(&comp->module->reference, 1);
    comp->module->shader = zink_shader_compile(screen, shader, NULL, NULL, NULL);
    assert(comp->module->shader);
-   _mesa_hash_table_insert(&comp->base.shader_cache, &shader->shader_id, comp->module);
+   _mesa_hash_table_insert(&comp->base.shader_cache[0], &shader->shader_id, comp->module);
 
    struct zink_shader_module *zm = NULL;
    zink_shader_module_reference(zink_screen(ctx->base.screen), &zm, comp->module);
@@ -740,8 +743,10 @@ zink_destroy_gfx_program(struct zink_screen *screen,
          _mesa_set_remove_key(prog->shaders[i]->programs, prog);
          prog->shaders[i] = NULL;
       }
-      if (prog->modules[i])
+      if (prog->modules[i]) {
          zink_shader_module_reference(screen, &prog->modules[i], NULL);
+         destroy_shader_cache(screen, &prog->base.shader_cache[i]);
+      }
    }
 
    for (int i = 0; i < ARRAY_SIZE(prog->pipelines); ++i) {
@@ -753,7 +758,6 @@ zink_destroy_gfx_program(struct zink_screen *screen,
       }
       _mesa_hash_table_destroy(prog->pipelines[i], NULL);
    }
-   destroy_shader_cache(screen, &prog->base.shader_cache);
    if (prog->base.pipeline_cache)
       vkDestroyPipelineCache(screen->dev, prog->base.pipeline_cache, NULL);
    screen->descriptor_program_deinit(screen, &prog->base);
@@ -780,7 +784,7 @@ zink_destroy_compute_program(struct zink_screen *screen,
       free(pc_entry);
    }
    _mesa_hash_table_destroy(comp->pipelines, NULL);
-   destroy_shader_cache(screen, &comp->base.shader_cache);
+   destroy_shader_cache(screen, &comp->base.shader_cache[0]);
    if (comp->base.pipeline_cache)
       vkDestroyPipelineCache(screen->dev, comp->base.pipeline_cache, NULL);
    screen->descriptor_program_deinit(screen, &comp->base);
diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h
index 72cf610ad12..89aabdb65bf 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -84,7 +84,7 @@ struct zink_program {
    unsigned num_dsl;
 
    /* the shader cache stores a mapping of zink_shader_key::VkShaderModule */
-   struct hash_table shader_cache;
+   struct hash_table shader_cache[ZINK_SHADER_COUNT];
 };
 
 struct zink_gfx_program {



More information about the mesa-commit mailing list