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@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11691>
This commit is contained in:
parent
49caf1a094
commit
a92442225c
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue