summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2016-06-11 19:32:53 +0200
committerMarek Olšák <[email protected]>2016-07-05 00:47:13 +0200
commit84824935cf28b72bac9f73787aadf20b95dea230 (patch)
tree23f8199806dcc944d80abcb6146f4e0f328bfab9
parent850cd953b16a12c85d39a454302da38b00cfe68c (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.c22
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;
}