glsl_type: All glsl_type objects live in their own talloc context
This commit is contained in:
@@ -33,6 +33,7 @@ extern "C" {
|
|||||||
|
|
||||||
hash_table *glsl_type::array_types = NULL;
|
hash_table *glsl_type::array_types = NULL;
|
||||||
hash_table *glsl_type::record_types = NULL;
|
hash_table *glsl_type::record_types = NULL;
|
||||||
|
void *glsl_type::ctx = NULL;
|
||||||
|
|
||||||
glsl_type::glsl_type(GLenum gl_type,
|
glsl_type::glsl_type(GLenum gl_type,
|
||||||
unsigned base_type, unsigned vector_elements,
|
unsigned base_type, unsigned vector_elements,
|
||||||
@@ -384,7 +385,7 @@ glsl_type::get_array_instance(void *ctx, const glsl_type *base,
|
|||||||
|
|
||||||
const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key);
|
const glsl_type *t = (glsl_type *) hash_table_find(array_types, & key);
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
t = new(ctx) glsl_type(ctx, base, array_size);
|
t = new glsl_type(ctx, base, array_size);
|
||||||
|
|
||||||
hash_table_insert(array_types, (void *) t, t);
|
hash_table_insert(array_types, (void *) t, t);
|
||||||
}
|
}
|
||||||
@@ -455,7 +456,7 @@ glsl_type::get_record_instance(const glsl_struct_field *fields,
|
|||||||
|
|
||||||
const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key);
|
const glsl_type *t = (glsl_type *) hash_table_find(record_types, & key);
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
t = new(NULL) glsl_type(fields, num_fields, name);
|
t = new glsl_type(fields, num_fields, name);
|
||||||
|
|
||||||
hash_table_insert(record_types, (void *) t, t);
|
hash_table_insert(record_types, (void *) t, t);
|
||||||
}
|
}
|
||||||
|
@@ -74,11 +74,16 @@ struct glsl_type {
|
|||||||
|
|
||||||
/* Callers of this talloc-based new need not call delete. It's
|
/* Callers of this talloc-based new need not call delete. It's
|
||||||
* easier to just talloc_free 'ctx' (or any of its ancestors). */
|
* easier to just talloc_free 'ctx' (or any of its ancestors). */
|
||||||
static void* operator new(size_t size, void *ctx)
|
static void* operator new(size_t size)
|
||||||
{
|
{
|
||||||
|
if (glsl_type::ctx == NULL) {
|
||||||
|
glsl_type::ctx = talloc_init("glsl_type");
|
||||||
|
assert(glsl_type::ctx != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void *type;
|
void *type;
|
||||||
|
|
||||||
type = talloc_size(ctx, size);
|
type = talloc_size(glsl_type::ctx, size);
|
||||||
assert(type != NULL);
|
assert(type != NULL);
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
@@ -382,6 +387,13 @@ struct glsl_type {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* talloc context for all glsl_type allocations
|
||||||
|
*
|
||||||
|
* Set on the first call to \c glsl_type::new.
|
||||||
|
*/
|
||||||
|
static TALLOC_CTX *ctx;
|
||||||
|
|
||||||
/** Constructor for vector and matrix types */
|
/** Constructor for vector and matrix types */
|
||||||
glsl_type(GLenum gl_type,
|
glsl_type(GLenum gl_type,
|
||||||
unsigned base_type, unsigned vector_elements,
|
unsigned base_type, unsigned vector_elements,
|
||||||
|
Reference in New Issue
Block a user