|  |  | @@ -25,7 +25,7 @@ | 
		
	
		
			
			|  |  |  | #include "main/core.h" /* for Elements, MAX2 */ | 
		
	
		
			
			|  |  |  | #include "glsl_parser_extras.h" | 
		
	
		
			
			|  |  |  | #include "glsl_types.h" | 
		
	
		
			
			|  |  |  | #include "program/hash_table.h" | 
		
	
		
			
			|  |  |  | #include "util/hash_table.h" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | mtx_t glsl_type::mutex = _MTX_INITIALIZER_NP; | 
		
	
	
		
			
			|  |  | @@ -329,12 +329,12 @@ _mesa_glsl_release_types(void) | 
		
	
		
			
			|  |  |  | * necessary. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | if (glsl_type::array_types != NULL) { | 
		
	
		
			
			|  |  |  | hash_table_dtor(glsl_type::array_types); | 
		
	
		
			
			|  |  |  | _mesa_hash_table_destroy(glsl_type::array_types, NULL); | 
		
	
		
			
			|  |  |  | glsl_type::array_types = NULL; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (glsl_type::record_types != NULL) { | 
		
	
		
			
			|  |  |  | hash_table_dtor(glsl_type::record_types); | 
		
	
		
			
			|  |  |  | _mesa_hash_table_destroy(glsl_type::record_types, NULL); | 
		
	
		
			
			|  |  |  | glsl_type::record_types = NULL; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
			|  |  | @@ -648,27 +648,28 @@ glsl_type::get_array_instance(const glsl_type *base, unsigned array_size) | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (array_types == NULL) { | 
		
	
		
			
			|  |  |  | array_types = hash_table_ctor(64, hash_table_string_hash, | 
		
	
		
			
			|  |  |  | hash_table_string_compare); | 
		
	
		
			
			|  |  |  | array_types = _mesa_hash_table_create(NULL, _mesa_key_hash_string, | 
		
	
		
			
			|  |  |  | _mesa_key_string_equal); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const glsl_type *t = (glsl_type *) hash_table_find(array_types, key); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (t == NULL) { | 
		
	
		
			
			|  |  |  | const struct hash_entry *entry = _mesa_hash_table_search(array_types, key); | 
		
	
		
			
			|  |  |  | if (entry == NULL) { | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | t = new glsl_type(base, array_size); | 
		
	
		
			
			|  |  |  | const glsl_type *t = new glsl_type(base, array_size); | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | hash_table_insert(array_types, (void *) t, ralloc_strdup(mem_ctx, key)); | 
		
	
		
			
			|  |  |  | entry = _mesa_hash_table_insert(array_types, | 
		
	
		
			
			|  |  |  | ralloc_strdup(mem_ctx, key), | 
		
	
		
			
			|  |  |  | (void *) t); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | assert(t->base_type == GLSL_TYPE_ARRAY); | 
		
	
		
			
			|  |  |  | assert(t->length == array_size); | 
		
	
		
			
			|  |  |  | assert(t->fields.array == base); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_ARRAY); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->length == array_size); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->fields.array == base); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return t; | 
		
	
		
			
			|  |  |  | return (glsl_type *) entry->data; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -722,19 +723,13 @@ glsl_type::record_compare(const glsl_type *b) const | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int | 
		
	
		
			
			|  |  |  | bool | 
		
	
		
			
			|  |  |  | glsl_type::record_key_compare(const void *a, const void *b) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | const glsl_type *const key1 = (glsl_type *) a; | 
		
	
		
			
			|  |  |  | const glsl_type *const key2 = (glsl_type *) b; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* Return zero is the types match (there is zero difference) or non-zero | 
		
	
		
			
			|  |  |  | * otherwise. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | if (strcmp(key1->name, key2->name) != 0) | 
		
	
		
			
			|  |  |  | return 1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return !key1->record_compare(key2); | 
		
	
		
			
			|  |  |  | return strcmp(key1->name, key2->name) == 0 && key1->record_compare(key2); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -772,25 +767,27 @@ glsl_type::get_record_instance(const glsl_struct_field *fields, | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (record_types == NULL) { | 
		
	
		
			
			|  |  |  | record_types = hash_table_ctor(64, record_key_hash, record_key_compare); | 
		
	
		
			
			|  |  |  | record_types = _mesa_hash_table_create(NULL, record_key_hash, | 
		
	
		
			
			|  |  |  | record_key_compare); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key); | 
		
	
		
			
			|  |  |  | if (t == NULL) { | 
		
	
		
			
			|  |  |  | const struct hash_entry *entry = _mesa_hash_table_search(record_types, | 
		
	
		
			
			|  |  |  | &key); | 
		
	
		
			
			|  |  |  | if (entry == NULL) { | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | t = new glsl_type(fields, num_fields, name); | 
		
	
		
			
			|  |  |  | const glsl_type *t = new glsl_type(fields, num_fields, name); | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | hash_table_insert(record_types, (void *) t, t); | 
		
	
		
			
			|  |  |  | entry = _mesa_hash_table_insert(record_types, t, (void *) t); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | assert(t->base_type == GLSL_TYPE_STRUCT); | 
		
	
		
			
			|  |  |  | assert(t->length == num_fields); | 
		
	
		
			
			|  |  |  | assert(strcmp(t->name, name) == 0); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_STRUCT); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->length == num_fields); | 
		
	
		
			
			|  |  |  | assert(strcmp(((glsl_type *) entry->data)->name, name) == 0); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return t; | 
		
	
		
			
			|  |  |  | return (glsl_type *) entry->data; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -805,25 +802,28 @@ glsl_type::get_interface_instance(const glsl_struct_field *fields, | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (interface_types == NULL) { | 
		
	
		
			
			|  |  |  | interface_types = hash_table_ctor(64, record_key_hash, record_key_compare); | 
		
	
		
			
			|  |  |  | interface_types = _mesa_hash_table_create(NULL, record_key_hash, | 
		
	
		
			
			|  |  |  | record_key_compare); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const glsl_type *t = (glsl_type *) hash_table_find(interface_types, & key); | 
		
	
		
			
			|  |  |  | if (t == NULL) { | 
		
	
		
			
			|  |  |  | const struct hash_entry *entry = _mesa_hash_table_search(interface_types, | 
		
	
		
			
			|  |  |  | &key); | 
		
	
		
			
			|  |  |  | if (entry == NULL) { | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | t = new glsl_type(fields, num_fields, packing, block_name); | 
		
	
		
			
			|  |  |  | const glsl_type *t = new glsl_type(fields, num_fields, | 
		
	
		
			
			|  |  |  | packing, block_name); | 
		
	
		
			
			|  |  |  | mtx_lock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | hash_table_insert(interface_types, (void *) t, t); | 
		
	
		
			
			|  |  |  | entry = _mesa_hash_table_insert(interface_types, t, (void *) t); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | assert(t->base_type == GLSL_TYPE_INTERFACE); | 
		
	
		
			
			|  |  |  | assert(t->length == num_fields); | 
		
	
		
			
			|  |  |  | assert(strcmp(t->name, block_name) == 0); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->base_type == GLSL_TYPE_INTERFACE); | 
		
	
		
			
			|  |  |  | assert(((glsl_type *) entry->data)->length == num_fields); | 
		
	
		
			
			|  |  |  | assert(strcmp(((glsl_type *) entry->data)->name, block_name) == 0); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | mtx_unlock(&glsl_type::mutex); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return t; | 
		
	
		
			
			|  |  |  | return (glsl_type *) entry->data; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 |