From a4e0b02f85b0d39107c850b13b75a6273b51808c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 25 Oct 2021 21:01:08 -0400 Subject: [PATCH] mesa: skip strlen when hashing strings for ProgramResourceHash Reviewed-by: Timothy Arceri Part-of: --- 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 4ecb4f4..9121531 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 1811ee7..c7c8acf 100644 --- a/src/util/hash_table.c +++ b/src/util/hash_table.c @@ -659,13 +659,18 @@ _mesa_hash_u32(const void *key) 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 8079d10..d19c195 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); -- 2.7.4