radeonsi: restructure si_shader_cache_load_shader
authorMarek Olšák <marek.olsak@amd.com>
Thu, 16 Jan 2020 01:49:06 +0000 (20:49 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 25 Jan 2020 01:29:29 +0000 (20:29 -0500)
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2929>

src/gallium/drivers/radeonsi/si_state_shaders.c

index ffa4289783ed63794086d27e8c2126dc765bc2f2..18cc1bd265a70ab42ee1eb2086be1eec9a6ab011 100644 (file)
@@ -243,53 +243,45 @@ bool si_shader_cache_load_shader(struct si_screen *sscreen,
 {
        struct hash_entry *entry =
                _mesa_hash_table_search(sscreen->shader_cache, ir_sha1_cache_key);
-       if (!entry) {
-               if (sscreen->disk_shader_cache) {
-                       unsigned char sha1[CACHE_KEY_SIZE];
-
-                       disk_cache_compute_key(sscreen->disk_shader_cache,
-                                              ir_sha1_cache_key, 20, sha1);
-
-                       size_t binary_size;
-                       uint8_t *buffer =
-                               disk_cache_get(sscreen->disk_shader_cache,
-                                              sha1, &binary_size);
-                       if (!buffer)
-                               return false;
 
-                       if (binary_size < sizeof(uint32_t) ||
-                           *((uint32_t*)buffer) != binary_size) {
-                                /* Something has gone wrong discard the item
-                                 * from the cache and rebuild/link from
-                                 * source.
-                                 */
-                               assert(!"Invalid radeonsi shader disk cache "
-                                      "item!");
-
-                               disk_cache_remove(sscreen->disk_shader_cache,
-                                                 sha1);
-                               free(buffer);
+       if (entry) {
+               if (si_load_shader_binary(shader, entry->data)) {
+                       p_atomic_inc(&sscreen->num_shader_cache_hits);
+                       return true;
+               }
+       }
 
-                               return false;
-                       }
+       if (!sscreen->disk_shader_cache)
+               return false;
 
-                       if (!si_load_shader_binary(shader, buffer)) {
+       unsigned char sha1[CACHE_KEY_SIZE];
+       disk_cache_compute_key(sscreen->disk_shader_cache, ir_sha1_cache_key,
+                              20, sha1);
+
+       size_t binary_size;
+       uint8_t *buffer = disk_cache_get(sscreen->disk_shader_cache, sha1,
+                                        &binary_size);
+       if (buffer) {
+               if (binary_size >= sizeof(uint32_t) &&
+                   *((uint32_t*)buffer) == binary_size) {
+                       if (si_load_shader_binary(shader, buffer)) {
                                free(buffer);
-                               return false;
+                               si_shader_cache_insert_shader(sscreen, ir_sha1_cache_key,
+                                                             shader, false);
+                               p_atomic_inc(&sscreen->num_shader_cache_hits);
+                               return true;
                        }
-                       free(buffer);
-
-                       si_shader_cache_insert_shader(sscreen, ir_sha1_cache_key,
-                                                     shader, false);
                } else {
-                       return false;
+                       /* Something has gone wrong discard the item from the cache and
+                        * rebuild/link from source.
+                        */
+                       assert(!"Invalid radeonsi shader disk cache item!");
+                       disk_cache_remove(sscreen->disk_shader_cache, sha1);
                }
-       } else {
-               if (!si_load_shader_binary(shader, entry->data))
-                       return false;
        }
-       p_atomic_inc(&sscreen->num_shader_cache_hits);
-       return true;
+
+       free(buffer);
+       return false;
 }
 
 static uint32_t si_shader_cache_key_hash(const void *key)