[Mesa-dev] [PATCH] mesa/util: add a hash table wrapper which support 64-bit keys

Nicolai Hähnle nhaehnle at gmail.com
Tue Jun 13 16:07:06 UTC 2017


On 13.06.2017 14:01, Grazvydas Ignotas wrote:
> On Tue, Jun 13, 2017 at 10:58 AM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> Needed for bindless handles which are represented using
>> 64-bit unsigned integers. All hash table implementations should
>> be uniformized later on.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/util/hash_table.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++
>>   src/util/hash_table.h |  25 +++++++++
>>   2 files changed, 174 insertions(+)
>>
>> diff --git a/src/util/hash_table.c b/src/util/hash_table.c
>> index 9e643af8b23..c2b9210218a 100644
>> --- a/src/util/hash_table.c
>> +++ b/src/util/hash_table.c
>> @@ -47,6 +47,7 @@
>>   #include "hash_table.h"
>>   #include "ralloc.h"
>>   #include "macros.h"
>> +#include "main/hash.h"
>>
>>   static const uint32_t deleted_key_value;
>>
>> @@ -502,3 +503,151 @@ _mesa_key_pointer_equal(const void *a, const void *b)
>>   {
>>      return a == b;
>>   }
>> +
>> +/**
>> + * Hash table wrapper which supports 64-bit keys.
>> + *
>> + * TODO: unify all hash table implementations.
>> + */
>> +#if !defined(MESA_ARCH_X86_64)
>> +
>> +struct hash_key_u64 {
>> +   uint64_t value;
>> +};
>> +
>> +static uint32_t
>> +key_u64_hash(const void *key)
>> +{
>> +   return _mesa_hash_data(key, sizeof(struct hash_key_u64));
>> +}
>> +
>> +static bool
>> +key_u64_equals(const void *a, const void *b)
>> +{
>> +   struct hash_key_u64 *aa = (struct hash_key_u64 *)a;
> 
> const struct hash_key_u64, and then you can drop the cast.
> 
>> +   struct hash_key_u64 *bb = (struct hash_key_u64 *)b;
>> +
>> +   return aa->value == bb->value;
>> +}
>> +
>> +#endif
>> +
>> +struct hash_table_u64 *
>> +_mesa_hash_table_u64_create(void *mem_ctx)
>> +{
>> +   struct hash_table_u64 *ht;
>> +
>> +   ht = CALLOC_STRUCT(hash_table_u64);
>> +   if (!ht)
>> +      return NULL;
>> +
>> +#if !defined(MESA_ARCH_X86_64)
> 
> I can't seem to find anything defining MESA_ARCH_X86_64 anywhere.

That's stuck in one of Samuel's other pending patches :)


> There is also nothing x86-64 specific here, what about doing
> 
>    if (sizeof(void *) == 8) {
> 
> and letting the compiler optimizer to drop the other case?

I like that suggestion, actually, it makes sure both paths will always 
build without compiler error.

With or without your suggestions, the patch is

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


>> +   ht->table = _mesa_hash_table_create(mem_ctx, key_u64_hash, key_u64_equals);
>> +#else
>> +   ht->table = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
>> +                                       _mesa_key_pointer_equal);
>> +#endif
> 
> Gražvydas
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list