diff options
| author | Eric Anholt <eric@anholt.net> | 2010-08-17 13:27:44 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-08-17 13:47:15 -0700 | 
| commit | f166d94fac8383b4c56f899ead0b7c06151e16d9 (patch) | |
| tree | 79c8012e7e197520bc88ca35e57b40316854473b | |
| parent | 664364052f362af2789e6b0fa88b6a5ba66ba936 (diff) | |
glsl: Make ir_algebraic new expressions allocate out of the parent.
This could reduce the amount of memory used by a shader tree after
optimization, and increases consistency with other passes.
| -rw-r--r-- | src/glsl/ir_algebraic.cpp | 38 | 
1 files changed, 22 insertions, 16 deletions
diff --git a/src/glsl/ir_algebraic.cpp b/src/glsl/ir_algebraic.cpp index a66c820a27..0092eea036 100644 --- a/src/glsl/ir_algebraic.cpp +++ b/src/glsl/ir_algebraic.cpp @@ -43,6 +43,7 @@ public:     ir_algebraic_visitor()     {        this->progress = false; +      this->mem_ctx = NULL;     }     virtual ~ir_algebraic_visitor() @@ -59,6 +60,8 @@ public:  			     int op1,  			     ir_expression *ir2,  			     int op2); + +   void *mem_ctx;     bool progress;  }; @@ -231,6 +234,9 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)        op_expr[i] = ir->operands[i]->as_expression();     } +   if (this->mem_ctx == NULL) +      this->mem_ctx = talloc_parent(ir); +     switch (ir->operation) {     case ir_unop_logic_not: {        enum ir_expression_operation new_op = ir_unop_logic_not; @@ -254,10 +260,10 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)        if (new_op != ir_unop_logic_not) {  	 this->progress = true; -	 return new(ir) ir_expression(new_op, -				      ir->type, -				      op_expr[0]->operands[0], -				      op_expr[0]->operands[1]); +	 return new(mem_ctx) ir_expression(new_op, +					   ir->type, +					   op_expr[0]->operands[0], +					   op_expr[0]->operands[1]);        }        break; @@ -287,10 +293,10 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)     case ir_binop_sub:        if (is_vec_zero(op_const[0])) {  	 this->progress = true; -	 return new(ir) ir_expression(ir_unop_neg, -				      ir->type, -				      ir->operands[1], -				      NULL); +	 return new(mem_ctx) ir_expression(ir_unop_neg, +					   ir->type, +					   ir->operands[1], +					   NULL);        }        if (is_vec_zero(op_const[1])) {  	 this->progress = true; @@ -328,10 +334,10 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)     case ir_binop_div:        if (is_vec_one(op_const[0]) && ir->type->base_type == GLSL_TYPE_FLOAT) {  	 this->progress = true; -	 return new(ir) ir_expression(ir_unop_rcp, -				      ir->type, -				      ir->operands[1], -				      NULL); +	 return new(mem_ctx) ir_expression(ir_unop_rcp, +					   ir->type, +					   ir->operands[1], +					   NULL);        }        if (is_vec_one(op_const[1])) {  	 this->progress = true; @@ -353,10 +359,10 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)        /* As far as we know, all backends are OK with rsq. */        if (op_expr[0] && op_expr[0]->operation == ir_unop_sqrt) {  	 this->progress = true; -	 return new(ir) ir_expression(ir_unop_rsq, -				      ir->type, -				      op_expr[0]->operands[0], -				      NULL); +	 return new(mem_ctx) ir_expression(ir_unop_rsq, +					   ir->type, +					   op_expr[0]->operands[0], +					   NULL);        }        break;  | 
