From: Marek Olšák <marek.ol...@amd.com> to allow multiple shaders to be compiled simultaneously. --- src/gallium/drivers/radeonsi/si_state_shaders.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 0fc3db9..e433055 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -179,8 +179,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; @@ -1091,7 +1097,10 @@ 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) { @@ -1102,11 +1111,13 @@ void si_init_shader_selector_async(void *job, int thread_index) 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; } -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev