diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/ir.cpp | 20 | ||||
-rw-r--r-- | src/glsl/ir.h | 10 | ||||
-rw-r--r-- | src/glsl/ir_validate.cpp | 2 |
3 files changed, 30 insertions, 2 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 0ae9b899c0a..9c58f869dc4 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -1543,12 +1543,30 @@ ir_swizzle::variable_referenced() const } +const char ir_variable::tmp_name[] = "compiler_temp"; + ir_variable::ir_variable(const struct glsl_type *type, const char *name, ir_variable_mode mode) : ir_instruction(ir_type_variable) { this->type = type; - this->name = ralloc_strdup(this, name); + + /* The ir_variable clone method may call this constructor with name set to + * tmp_name. + */ + assert(name != NULL + || mode == ir_var_temporary + || mode == ir_var_function_in + || mode == ir_var_function_out + || mode == ir_var_function_inout); + assert(name != ir_variable::tmp_name + || mode == ir_var_temporary); + if (mode == ir_var_temporary + && (name == NULL || name == ir_variable::tmp_name)) { + this->name = ir_variable::tmp_name; + } else { + this->name = ralloc_strdup(this, name); + } this->u.max_ifc_array_access = NULL; diff --git a/src/glsl/ir.h b/src/glsl/ir.h index f2186a5af8a..3c947412f40 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -575,6 +575,11 @@ public: return this->u.state_slots; } + inline bool is_name_ralloced() const + { + return this->name != ir_variable::tmp_name; + } + /** * Enable emitting extension warnings for this variable */ @@ -886,6 +891,11 @@ private: * \sa ir_variable::location */ const glsl_type *interface_type; + + /** + * Name used for anonymous compiler temporaries + */ + static const char tmp_name[]; }; /** diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index 51598629117..5a6f8bbf5ee 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -654,7 +654,7 @@ ir_validate::visit(ir_variable *ir) * in the ir_dereference_variable handler to ensure that a variable is * declared before it is dereferenced. */ - if (ir->name) + if (ir->name && ir->is_name_ralloced()) assert(ralloc_parent(ir->name) == ir); hash_table_insert(ht, ir, ir); |