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