Lines Matching full:ir
50 #include "ir.h"
66 bool is_tess_level_array(ir_rvalue *ir);
67 ir_rvalue *lower_tess_level_array(ir_rvalue *ir);
69 void visit_new_assignment(ir_assignment *ir);
103 lower_tess_level_visitor::visit(ir_variable *ir) in visit() argument
105 if ((!ir->name) || in visit()
106 ((strcmp(ir->name, "gl_TessLevelInner") != 0) && in visit()
107 (strcmp(ir->name, "gl_TessLevelOuter") != 0))) in visit()
110 assert (ir->type->is_array()); in visit()
112 if (strcmp(ir->name, "gl_TessLevelOuter") == 0) { in visit()
116 old_tess_level_outer_var = ir; in visit()
117 assert(ir->type->fields.array == glsl_type::float_type); in visit()
120 new_tess_level_outer_var = ir->clone(ralloc_parent(ir), NULL); in visit()
128 ir->replace_with(new_tess_level_outer_var); in visit()
129 } else if (strcmp(ir->name, "gl_TessLevelInner") == 0) { in visit()
133 old_tess_level_inner_var = ir; in visit()
134 assert(ir->type->fields.array == glsl_type::float_type); in visit()
137 new_tess_level_inner_var = ir->clone(ralloc_parent(ir), NULL); in visit()
145 ir->replace_with(new_tess_level_inner_var); in visit()
165 lower_tess_level_visitor::is_tess_level_array(ir_rvalue *ir) in is_tess_level_array() argument
167 if (!ir->type->is_array()) in is_tess_level_array()
169 if (ir->type->fields.array != glsl_type::float_type) in is_tess_level_array()
173 if (ir->variable_referenced() == this->old_tess_level_outer_var) in is_tess_level_array()
177 if (ir->variable_referenced() == this->old_tess_level_inner_var) in is_tess_level_array()
185 * If the given ir satisfies is_tess_level_array(), return new ir
194 lower_tess_level_visitor::lower_tess_level_array(ir_rvalue *ir) in lower_tess_level_array() argument
196 if (!ir->type->is_array()) in lower_tess_level_array()
198 if (ir->type->fields.array != glsl_type::float_type) in lower_tess_level_array()
204 if (ir->variable_referenced() == this->old_tess_level_outer_var) in lower_tess_level_array()
208 if (ir->variable_referenced() == this->old_tess_level_inner_var) in lower_tess_level_array()
215 assert(ir->as_dereference_variable()); in lower_tess_level_array()
216 return new(ralloc_parent(ir)) ir_dereference_variable(*new_var); in lower_tess_level_array()
250 lower_tess_level_visitor::fix_lhs(ir_assignment *ir) in fix_lhs() argument
252 if (ir->lhs->ir_type != ir_type_expression) in fix_lhs()
254 void *mem_ctx = ralloc_parent(ir); in fix_lhs()
255 ir_expression *const expr = (ir_expression *) ir->lhs; in fix_lhs()
271 ir->rhs = new(mem_ctx) ir_expression(ir_triop_vector_insert, in fix_lhs()
274 ir->rhs, in fix_lhs()
277 ir->set_lhs(new_lhs); in fix_lhs()
283 ir->write_mask = 1 << old_index_constant->get_int_component(0); in fix_lhs()
285 ir->write_mask = (1 << expr->operands[0]->type->vector_elements) - 1; in fix_lhs()
296 lower_tess_level_visitor::visit_leave(ir_assignment *ir) in visit_leave() argument
299 * called on ir->rhs and ir->condition. in visit_leave()
301 ir_rvalue_visitor::visit_leave(ir); in visit_leave()
303 if (this->is_tess_level_array(ir->lhs) || in visit_leave()
304 this->is_tess_level_array(ir->rhs)) { in visit_leave()
315 void *ctx = ralloc_parent(ir); in visit_leave()
316 int array_size = ir->lhs->type->array_size(); in visit_leave()
319 ir->lhs->clone(ctx, NULL), new(ctx) ir_constant(i)); in visit_leave()
321 ir->rhs->clone(ctx, NULL), new(ctx) ir_constant(i)); in visit_leave()
339 ir->remove(); in visit_leave()
352 handle_rvalue((ir_rvalue **)&ir->lhs); in visit_leave()
353 this->fix_lhs(ir); in visit_leave()
355 return rvalue_visit(ir); in visit_leave()
366 lower_tess_level_visitor::visit_new_assignment(ir_assignment *ir) in visit_new_assignment() argument
369 this->base_ir = ir; in visit_new_assignment()
370 ir->accept(this); in visit_new_assignment()
383 lower_tess_level_visitor::visit_leave(ir_call *ir) in visit_leave() argument
385 void *ctx = ralloc_parent(ir); in visit_leave()
387 const exec_node *formal_param_node = ir->callee->parameters.get_head_raw(); in visit_leave()
388 const exec_node *actual_param_node = ir->actual_parameters.get_head_raw(); in visit_leave()
440 return rvalue_visit(ir); in visit_leave()
453 visit_list_elements(&v, shader->ir); in lower_tess_level()