[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