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

Reply via email to