aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-01-15 20:49:06 -0500
committerMarek Olšák <[email protected]>2020-01-24 20:29:29 -0500
commit2fd3bb23ab7eb2fc7f911fceda7c5d4e86f451ae (patch)
tree4be9aed13c817b52728854238768b3b7514c5fe6 /src/gallium
parent0db74f479b9c5efe52c5d021fe04ba5ce1f4e1bd (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')
-rw-r--r--src/gallium/drivers/radeonsi/si_state_shaders.c70
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)