From 2fd3bb23ab7eb2fc7f911fceda7c5d4e86f451ae Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 15 Jan 2020 20:49:06 -0500 Subject: [PATCH] radeonsi: restructure si_shader_cache_load_shader Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- .../drivers/radeonsi/si_state_shaders.c | 70 ++++++++----------- 1 file 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) -- 2.30.2