From a92442225ca8d9ba1a2f5be06b9715b3679ecaa8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 14 May 2021 16:02:52 -0400 Subject: [PATCH] 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 Part-of: --- 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 {