[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