Lines Matching refs:ir

51 #include "ir.h"
89 bool is_distance_vec8(ir_rvalue *ir);
90 ir_rvalue *lower_distance_vec8(ir_rvalue *ir);
92 void visit_new_assignment(ir_assignment *ir);
138 lower_distance_visitor::visit(ir_variable *ir)
143 if (!ir->name || strcmp(ir->name, in_name) != 0)
145 assert (ir->type->is_array());
147 if (ir->data.mode == ir_var_shader_out) {
152 } else if (ir->data.mode == ir_var_shader_in) {
163 *old_var = ir;
169 *new_var = ir->clone(ralloc_parent(ir), NULL);
173 if (!ir->type->fields.array->is_array()) {
177 assert((ir->data.mode == ir_var_shader_in &&
179 (ir->data.mode == ir_var_shader_out &&
184 assert (ir->type->fields.array == glsl_type::float_type);
194 assert((ir->data.mode == ir_var_shader_in &&
199 assert (ir->type->fields.array->fields.array == glsl_type::float_type);
205 ir->type->array_size());
207 ir->replace_with(*new_var);
209 ir->remove();
291 lower_distance_visitor::is_distance_vec8(ir_rvalue *ir)
299 if (!ir->type->is_array())
301 if (ir->type->fields.array != glsl_type::float_type)
305 if (ir->variable_referenced() == this->old_distance_out_var)
314 if (ir->variable_referenced() == this->old_distance_in_var)
322 * If the given ir satisfies is_distance_vec8(), return new ir
331 lower_distance_visitor::lower_distance_vec8(ir_rvalue *ir)
333 if (!ir->type->is_array())
335 if (ir->type->fields.array != glsl_type::float_type)
340 if (ir->variable_referenced() == this->old_distance_out_var)
344 if (ir->variable_referenced() == this->old_distance_in_var)
350 if (ir->as_dereference_variable()) {
351 return new(ralloc_parent(ir)) ir_dereference_variable(*new_var);
353 ir_dereference_array *array_ref = ir->as_dereference_array();
357 return new(ralloc_parent(ir))
399 lower_distance_visitor::fix_lhs(ir_assignment *ir)
401 if (ir->lhs->ir_type == ir_type_expression) {
402 void *mem_ctx = ralloc_parent(ir);
403 ir_expression *const expr = (ir_expression *) ir->lhs;
414 ir->rhs = new(mem_ctx) ir_expression(ir_triop_vector_insert,
417 ir->rhs,
419 ir->set_lhs(new_lhs);
420 ir->write_mask = WRITEMASK_XYZW;
437 lower_distance_visitor::visit_leave(ir_assignment *ir)
440 * called on ir->rhs and ir->condition.
442 ir_rvalue_visitor::visit_leave(ir);
444 if (this->is_distance_vec8(ir->lhs) ||
445 this->is_distance_vec8(ir->rhs)) {
456 void *ctx = ralloc_parent(ir);
457 int array_size = ir->lhs->type->array_size();
460 ir->lhs->clone(ctx, NULL), new(ctx) ir_constant(i));
462 ir->rhs->clone(ctx, NULL), new(ctx) ir_constant(i));
480 ir->remove();
493 handle_rvalue((ir_rvalue **)&ir->lhs);
494 this->fix_lhs(ir);
496 return rvalue_visit(ir);
507 lower_distance_visitor::visit_new_assignment(ir_assignment *ir)
510 this->base_ir = ir;
511 ir->accept(this);
530 lower_distance_visitor::visit_leave(ir_call *ir)
532 void *ctx = ralloc_parent(ir);
534 const exec_node *formal_param_node = ir->callee->parameters.get_head_raw();
535 const exec_node *actual_param_node = ir->actual_parameters.get_head_raw();
587 return rvalue_visit(ir);
613 lower_distance_visitor_counter::visit(ir_variable *ir)
617 if (!ir->name)
620 if (ir->data.mode == ir_var_shader_out) {
623 } else if (ir->data.mode == ir_var_shader_in) {
629 if (ir->type->is_unsized_array())
633 if (!strcmp(ir->name, "gl_ClipDistance")) {
634 if (!ir->type->fields.array->is_array())
635 *clip_size = ir->type->array_size();
637 *clip_size = ir->type->fields.array->array_size();
642 if (!strcmp(ir->name, "gl_CullDistance")) {
643 if (!ir->type->fields.array->is_array())
644 *cull_size = ir->type->array_size();
646 *cull_size = ir->type->fields.array->array_size();
665 visit_list_elements(&count, shader->ir);
674 visit_list_elements(&v, shader->ir);
677 visit_list_elements(&v2, shader->ir);