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

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Jun 13 16:58:08 UTC 2017



On 06/13/2017 06:07 PM, Nicolai Hähnle wrote:
> 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 :)

Yeah. :)

> 
> 
>> 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.

+1 for that suggestion, and MESA_ARCH_X86_64 is no longer needed with that.

Thanks.

> 
> 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
>>
> 
> 


More information about the mesa-dev mailing list