summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-07-27 11:14:59 -0700
committerEric Anholt <eric@anholt.net>2010-07-27 11:14:59 -0700
commit85cd64ee170e578317a6aa41d824314550a318ac (patch)
tree39aa736450ab7457d869bcfd8e33b27f2335de72
parent9a770ee49f8cb82653bb5c1976f7751d9a6b801e (diff)
glsl2: Talloc type names.
Otherwise, we end up losing structure names after compile time, and dumping IR often ends up reporting some other mysterious string.
-rw-r--r--src/glsl/glsl_types.cpp25
-rw-r--r--src/glsl/glsl_types.h2
2 files changed, 17 insertions, 10 deletions
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index de0adc0c6ec..8192b86dfc9 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -35,6 +35,15 @@ hash_table *glsl_type::array_types = NULL;
hash_table *glsl_type::record_types = NULL;
void *glsl_type::ctx = NULL;
+static void
+init_talloc_type_ctx(void)
+{
+ if (glsl_type::ctx == NULL) {
+ glsl_type::ctx = talloc_init("glsl_type");
+ assert(glsl_type::ctx != NULL);
+ }
+}
+
glsl_type::glsl_type(GLenum gl_type,
unsigned base_type, unsigned vector_elements,
unsigned matrix_columns, const char *name) :
@@ -43,9 +52,10 @@ glsl_type::glsl_type(GLenum gl_type,
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
sampler_type(0),
vector_elements(vector_elements), matrix_columns(matrix_columns),
- name(name),
length(0)
{
+ init_talloc_type_ctx();
+ this->name = talloc_strdup(this->ctx, name);
/* Neither dimension is zero or both dimensions are zero.
*/
assert((vector_elements == 0) == (matrix_columns == 0));
@@ -60,9 +70,10 @@ glsl_type::glsl_type(GLenum gl_type,
sampler_dimensionality(dim), sampler_shadow(shadow),
sampler_array(array), sampler_type(type),
vector_elements(0), matrix_columns(0),
- name(name),
length(0)
{
+ init_talloc_type_ctx();
+ this->name = talloc_strdup(this->ctx, name);
memset(& fields, 0, sizeof(fields));
}
@@ -72,17 +83,13 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
sampler_type(0),
vector_elements(0), matrix_columns(0),
- name(name),
length(num_fields)
{
unsigned int i;
- if (glsl_type::ctx == NULL) {
- glsl_type::ctx = talloc_init("glsl_type");
- assert(glsl_type::ctx != NULL);
- }
-
- this->fields.structure = talloc_array(glsl_type::ctx,
+ init_talloc_type_ctx();
+ this->name = talloc_strdup(this->ctx, name);
+ this->fields.structure = talloc_array(this->ctx,
glsl_struct_field, length);
for (i = 0; i < length; i++) {
this->fields.structure[i].type = fields[i].type;
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index 69fb9e3fb58..4bec3181679 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -388,7 +388,6 @@ struct glsl_type {
return is_array() ? length : -1;
}
-private:
/**
* talloc context for all glsl_type allocations
*
@@ -396,6 +395,7 @@ private:
*/
static TALLOC_CTX *ctx;
+private:
/** Constructor for vector and matrix types */
glsl_type(GLenum gl_type,
unsigned base_type, unsigned vector_elements,