Mesa (main): mesa: skip strlen when hashing strings for ProgramResourceHash

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 29 12:03:49 UTC 2021


Module: Mesa
Branch: main
Commit: a4e0b02f85b0d39107c850b13b75a6273b51808c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a4e0b02f85b0d39107c850b13b75a6273b51808c

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Mon Oct 25 21:01:08 2021 -0400

mesa: skip strlen when hashing strings for ProgramResourceHash

Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13507>

---

 src/mesa/main/shader_query.cpp |  2 +-
 src/util/hash_table.c          | 11 ++++++++---
 src/util/hash_table.h          |  1 +
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 4ecb4f40938..9121531f436 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -652,7 +652,7 @@ search_resource_hash(struct gl_shader_program *shProg,
       name_copy = (char*) name;
    }
 
-   uint32_t hash = _mesa_hash_string(name_copy);
+   uint32_t hash = _mesa_hash_string_with_length(name_copy, len);
    struct hash_entry *entry =
       _mesa_hash_table_search_pre_hashed(shProg->data->ProgramResourceHash[type],
                                          hash, name_copy);
diff --git a/src/util/hash_table.c b/src/util/hash_table.c
index 1811ee7432f..c7c8acf31a1 100644
--- a/src/util/hash_table.c
+++ b/src/util/hash_table.c
@@ -658,14 +658,19 @@ _mesa_hash_u32(const void *key)
 /** FNV-1a string hash implementation */
 uint32_t
 _mesa_hash_string(const void *_key)
+{
+   return _mesa_hash_string_with_length(_key, strlen((const char *)_key));
+}
+
+uint32_t
+_mesa_hash_string_with_length(const void *_key, unsigned length)
 {
    uint32_t hash = 0;
    const char *key = _key;
-   size_t len = strlen(key);
 #if defined(_WIN64) || defined(__x86_64__)
-   hash = (uint32_t)XXH64(key, len, hash);
+   hash = (uint32_t)XXH64(key, length, hash);
 #else
-   hash = XXH32(key, len, hash);
+   hash = XXH32(key, length, hash);
 #endif
    return hash;
 }
diff --git a/src/util/hash_table.h b/src/util/hash_table.h
index 8079d102d4b..d19c195807f 100644
--- a/src/util/hash_table.h
+++ b/src/util/hash_table.h
@@ -119,6 +119,7 @@ uint32_t _mesa_hash_int(const void *key);
 uint32_t _mesa_hash_uint(const void *key);
 uint32_t _mesa_hash_u32(const void *key);
 uint32_t _mesa_hash_string(const void *key);
+uint32_t _mesa_hash_string_with_length(const void *_key, unsigned length);
 uint32_t _mesa_hash_pointer(const void *pointer);
 
 bool _mesa_key_int_equal(const void *a, const void *b);



More information about the mesa-commit mailing list