---
 src/gallium/drivers/radeonsi/si_state_shaders.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 343cb83..8c00967 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -202,26 +202,36 @@ static bool si_shader_cache_insert_shader(struct 
si_screen *sscreen,
 
        if (_mesa_hash_table_insert(sscreen->shader_cache, tgsi_binary,
                                    hw_binary) == NULL) {
                FREE(hw_binary);
                return false;
        }
 
        if (sscreen->b.disk_shader_cache && insert_into_disk_cache) {
                _mesa_sha1_compute(tgsi_binary, *((uint32_t *)tgsi_binary), 
key);
 
+               size_t hw_binary_size = *((uint32_t *) hw_binary);
+
+               /* The binary could be freed before we write it to disk so
+                * make a copy.
+                */
+               void *hw_binary_cp = malloc(hw_binary_size);
+               memcpy(hw_binary_cp, hw_binary, hw_binary_size);
+
                struct disk_cache_put_job *dc_job =
                        disk_cache_create_put_job(sscreen->b.disk_shader_cache,
-                                                 key, hw_binary,
-                                                 *((uint32_t *) hw_binary),
-                                                 NULL);
-               disk_cache_put(dc_job, 0);
+                                                 key, hw_binary_cp,
+                                                 hw_binary_size, hw_binary_cp);
+               util_queue_fence_init(&dc_job->fence);
+               util_queue_add_job(&sscreen->b.disk_shader_cache->cache_queue,
+                                  dc_job, &dc_job->fence, disk_cache_put,
+                                  disk_cache_destroy_put_job);
        }
 
        return true;
 }
 
 static bool si_shader_cache_load_shader(struct si_screen *sscreen,
                                        void *tgsi_binary,
                                        struct si_shader *shader)
 {
        struct hash_entry *entry =
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to