Mesa (master): radeonsi: restructure si_shader_cache_load_shader

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 25 01:47:57 UTC 2020


Module: Mesa
Branch: master
Commit: 2fd3bb23ab7eb2fc7f911fceda7c5d4e86f451ae
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2fd3bb23ab7eb2fc7f911fceda7c5d4e86f451ae

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Wed Jan 15 20:49:06 2020 -0500

radeonsi: restructure si_shader_cache_load_shader

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2929>

---

 src/gallium/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)



More information about the mesa-commit mailing list