diff options
author | Marek Olšák <[email protected]> | 2016-06-11 19:32:53 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-07-05 00:47:13 +0200 |
commit | 84824935cf28b72bac9f73787aadf20b95dea230 (patch) | |
tree | 23f8199806dcc944d80abcb6146f4e0f328bfab9 | |
parent | 850cd953b16a12c85d39a454302da38b00cfe68c (diff) |
radeonsi: don't lock shader cache mutex during compilation
to allow multiple shaders to be compiled simultaneously.
ALso, shader-db can again use all 4 cores.
v2: Remove the pipe_mutex_unlock call in the error path.
Reviewed-by: Nicolai Hähnle <[email protected]> (v1)
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index a2453c23c7f..799aa5708c1 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -186,8 +186,14 @@ static bool si_shader_cache_insert_shader(struct si_screen *sscreen, void *tgsi_binary, struct si_shader *shader) { - void *hw_binary = si_get_shader_binary(shader); + void *hw_binary; + struct hash_entry *entry; + entry = _mesa_hash_table_search(sscreen->shader_cache, tgsi_binary); + if (entry) + return false; /* already added */ + + hw_binary = si_get_shader_binary(shader); if (!hw_binary) return false; @@ -1117,22 +1123,26 @@ void si_init_shader_selector_async(void *job, int thread_index) if (tgsi_binary && si_shader_cache_load_shader(sscreen, tgsi_binary, shader)) { FREE(tgsi_binary); + pipe_mutex_unlock(sscreen->shader_cache_mutex); } else { + pipe_mutex_unlock(sscreen->shader_cache_mutex); + /* Compile the shader if it hasn't been loaded from the cache. */ if (si_compile_tgsi_shader(sscreen, tm, shader, false, debug) != 0) { FREE(shader); FREE(tgsi_binary); - pipe_mutex_unlock(sscreen->shader_cache_mutex); fprintf(stderr, "radeonsi: can't compile a main shader part\n"); return; } - if (tgsi_binary && - !si_shader_cache_insert_shader(sscreen, tgsi_binary, shader)) - FREE(tgsi_binary); + if (tgsi_binary) { + pipe_mutex_lock(sscreen->shader_cache_mutex); + if (!si_shader_cache_insert_shader(sscreen, tgsi_binary, shader)) + FREE(tgsi_binary); + pipe_mutex_unlock(sscreen->shader_cache_mutex); + } } - pipe_mutex_unlock(sscreen->shader_cache_mutex); sel->main_shader_part = shader; } |