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