[Mesa-dev] [PATCH] mesa/util: add a hash table wrapper which support 64-bit keys
Grazvydas Ignotas
notasas at gmail.com
Tue Jun 13 12:01:18 UTC 2017
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.
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?
> + 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
More information about the mesa-dev
mailing list