diff options
| -rw-r--r-- | src/glsl/ir_function_inlining.cpp | 14 | ||||
| -rw-r--r-- | src/glsl/ir_validate.cpp | 15 | ||||
| -rw-r--r-- | src/mesa/shader/hash_table.c | 14 | ||||
| -rw-r--r-- | src/mesa/shader/hash_table.h | 24 | 
4 files changed, 41 insertions, 26 deletions
| diff --git a/src/glsl/ir_function_inlining.cpp b/src/glsl/ir_function_inlining.cpp index 1adf67868e..b3d1f1d167 100644 --- a/src/glsl/ir_function_inlining.cpp +++ b/src/glsl/ir_function_inlining.cpp @@ -33,9 +33,7 @@  #include "ir_function_inlining.h"  #include "ir_expression_flattening.h"  #include "glsl_types.h" -extern "C" {  #include "hash_table.h" -}  class ir_function_inlining_visitor : public ir_hierarchical_visitor {  public: @@ -60,16 +58,6 @@ public:  }; -unsigned int hash_func(const void *key) -{ -   return (unsigned int)(uintptr_t)key; -} - -int hash_compare_func(const void *key1, const void *key2) -{ -   return key1 == key2 ? 0 : 1; -} -  bool  automatic_inlining_predicate(ir_instruction *ir)  { @@ -124,7 +112,7 @@ ir_call::generate_inline(ir_instruction *next_ir)     ir_variable *retval = NULL;     struct hash_table *ht; -   ht = hash_table_ctor(0, hash_func, hash_compare_func); +   ht = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare);     num_parameters = 0;     foreach_iter(exec_list_iterator, iter_sig, this->callee->parameters) diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index 1953852487..7582d57e7c 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -36,26 +36,15 @@  #include <inttypes.h>  #include "ir.h"  #include "ir_hierarchical_visitor.h" -extern "C" {  #include "hash_table.h" -} - -static unsigned int hash_func(const void *key) -{ -   return (unsigned int)(uintptr_t)key; -} - -static int hash_compare_func(const void *key1, const void *key2) -{ -   return key1 == key2 ? 0 : 1; -}  class ir_validate : public ir_hierarchical_visitor {  public:     ir_validate()     { -      this->ht = hash_table_ctor(0, hash_func, hash_compare_func); +      this->ht = hash_table_ctor(0, hash_table_pointer_hash, +				 hash_table_pointer_compare);        this->callback = ir_validate::validate_ir;        this->data = ht; diff --git a/src/mesa/shader/hash_table.c b/src/mesa/shader/hash_table.c index fa6ba2bfdf..933e300abd 100644 --- a/src/mesa/shader/hash_table.c +++ b/src/mesa/shader/hash_table.c @@ -157,3 +157,17 @@ hash_table_string_hash(const void *key)      return hash;  } + + +unsigned +hash_table_pointer_hash(const void *key) +{ +   return (unsigned)((uintptr_t) key / sizeof(void *)); +} + + +int +hash_table_pointer_compare(const void *key1, const void *key2) +{ +   return key1 == key2 ? 0 : 1; +} diff --git a/src/mesa/shader/hash_table.h b/src/mesa/shader/hash_table.h index 881e756f08..0552691464 100644 --- a/src/mesa/shader/hash_table.h +++ b/src/mesa/shader/hash_table.h @@ -118,6 +118,30 @@ extern unsigned hash_table_string_hash(const void *key);   */  #define hash_table_string_compare ((hash_compare_func_t) strcmp) + +/** + * Compute hash value of a pointer + * + * \param key  Pointer to be used as a hash key + * + * \note + * The memory pointed to by \c key is \b never accessed.  The value of \c key + * itself is used as the hash key + * + * \sa hash_table_pointer_compare + */ +unsigned +hash_table_pointer_hash(const void *key); + + +/** + * Compare two pointers used as keys + * + * \sa hash_table_pointer_hash + */ +int +hash_table_pointer_compare(const void *key1, const void *key2); +  #ifdef __cplusplus  };  #endif | 
