X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglsl%2Fir_clone.cpp;h=1522af682bb5d46ad0f185eb90d8cb36a214ac65;hb=a637280e42b9a2f4ccbb5e7b209c5645073f584e;hp=0e202164b325e7895e618c3f2e7115ea408660a5;hpb=5a7758efbe14dee026245a4f4f4fb3ccf7b2c23b;p=mesa.git diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index 0e202164b32..1522af682bb 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -22,6 +22,7 @@ */ #include +#include "main/compiler.h" #include "ir.h" #include "glsl_types.h" extern "C" { @@ -45,14 +46,15 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const var->read_only = this->read_only; var->centroid = this->centroid; var->invariant = this->invariant; - var->shader_in = this->shader_in; - var->shader_out = this->shader_out; var->interpolation = this->interpolation; var->array_lvalue = this->array_lvalue; var->location = this->location; var->warn_extension = this->warn_extension; var->origin_upper_left = this->origin_upper_left; var->pixel_center_integer = this->pixel_center_integer; + var->explicit_location = this->explicit_location; + if (this->explicit_location) + var->location = this->location; if (this->constant_value) var->constant_value = this->constant_value->clone(mem_ctx, ht); @@ -136,12 +138,16 @@ ir_loop::clone(void *mem_ctx, struct hash_table *ht) const new_loop->body_instructions.push_tail(ir->clone(mem_ctx, ht)); } + new_loop->cmp = this->cmp; return new_loop; } ir_call * ir_call::clone(void *mem_ctx, struct hash_table *ht) const { + if (this->type == glsl_type::error_type) + return ir_call::get_error_instruction(mem_ctx); + exec_list new_parameters; foreach_iter(exec_list_iterator, iter, this->actual_parameters) { @@ -155,14 +161,15 @@ ir_call::clone(void *mem_ctx, struct hash_table *ht) const ir_expression * ir_expression::clone(void *mem_ctx, struct hash_table *ht) const { - ir_rvalue *op[2] = {NULL, NULL}; + ir_rvalue *op[Elements(this->operands)] = { NULL, }; unsigned int i; for (i = 0; i < get_num_operands(); i++) { op[i] = this->operands[i]->clone(mem_ctx, ht); } - return new(mem_ctx) ir_expression(this->operation, this->type, op[0], op[1]); + return new(mem_ctx) ir_expression(this->operation, this->type, + op[0], op[1], op[2], op[3]); } ir_dereference_variable * @@ -268,14 +275,33 @@ ir_function::clone(void *mem_ctx, struct hash_table *ht) const ir_function_signature * ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const +{ + ir_function_signature *copy = this->clone_prototype(mem_ctx, ht); + + copy->is_defined = this->is_defined; + + /* Clone the instruction list. + */ + foreach_list_const(node, &this->body) { + const ir_instruction *const inst = (const ir_instruction *) node; + + ir_instruction *const inst_copy = inst->clone(mem_ctx, ht); + copy->body.push_tail(inst_copy); + } + + return copy; +} + +ir_function_signature * +ir_function_signature::clone_prototype(void *mem_ctx, struct hash_table *ht) const { ir_function_signature *copy = new(mem_ctx) ir_function_signature(this->return_type); - copy->is_defined = this->is_defined; - copy->is_built_in = this->is_built_in; + copy->is_defined = false; + copy->is_builtin = this->is_builtin; - /* Clone the parameter list. + /* Clone the parameter list, but NOT the body. */ foreach_list_const(node, &this->parameters) { const ir_variable *const param = (const ir_variable *) node; @@ -286,15 +312,6 @@ ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const copy->parameters.push_tail(param_copy); } - /* Clone the instruction list. - */ - foreach_list_const(node, &this->body) { - const ir_instruction *const inst = (const ir_instruction *) node; - - ir_instruction *const inst_copy = inst->clone(mem_ctx, ht); - copy->body.push_tail(inst_copy); - } - return copy; } @@ -337,7 +354,7 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const } default: - assert(!"Should not get here."); break; + assert(!"Should not get here."); return NULL; } }