diff options
author | Marek Olšák <[email protected]> | 2020-01-15 20:49:06 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2020-01-24 20:29:29 -0500 |
commit | 2fd3bb23ab7eb2fc7f911fceda7c5d4e86f451ae (patch) | |
tree | 4be9aed13c817b52728854238768b3b7514c5fe6 /src/gallium/drivers | |
parent | 0db74f479b9c5efe52c5d021fe04ba5ce1f4e1bd (diff) |
radeonsi: restructure si_shader_cache_load_shader
Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2929>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 70 |
1 files changed, 31 insertions, 39 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index ffa4289783e..18cc1bd265a 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -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) |