• Home
  • Raw
  • Download

Lines Matching full:ir

31 #include "ir.h"
48 virtual ir_visitor_status visit_enter(ir_call *ir);
109 static void stack_enter(class ir_instruction *ir, void *data);
110 static void stack_leave(class ir_instruction *ir, void *data);
112 virtual ir_visitor_status visit(ir_constant *ir);
113 virtual ir_visitor_status visit(ir_dereference_variable *ir);
115 virtual ir_visitor_status visit_enter(ir_dereference_record *ir);
116 virtual ir_visitor_status visit_enter(ir_dereference_array *ir);
117 virtual ir_visitor_status visit_enter(ir_texture *ir);
118 virtual ir_visitor_status visit_enter(ir_expression *ir);
120 virtual ir_visitor_status visit_leave(ir_assignment *ir);
121 virtual ir_visitor_status visit_leave(ir_call *ir);
142 virtual ir_visitor_status visit_enter(ir_call *ir);
143 virtual ir_visitor_status visit_enter(ir_texture *ir);
191 find_lowerable_rvalues_visitor::stack_enter(class ir_instruction *ir, in stack_enter() argument
200 entry.instr = ir; in stack_enter()
278 find_lowerable_rvalues_visitor::stack_leave(class ir_instruction *ir, in stack_leave() argument
329 find_lowerable_rvalues_visitor::visit(ir_constant *ir) in visit() argument
331 stack_enter(ir, this); in visit()
333 if (!can_lower_type(options, ir->type)) in visit()
336 stack_leave(ir, this); in visit()
342 find_lowerable_rvalues_visitor::visit(ir_dereference_variable *ir) in visit() argument
344 stack_enter(ir, this); in visit()
347 stack.back().state = handle_precision(ir->type, ir->precision()); in visit()
349 stack_leave(ir, this); in visit()
355 find_lowerable_rvalues_visitor::visit_enter(ir_dereference_record *ir) in visit_enter() argument
357 ir_hierarchical_visitor::visit_enter(ir); in visit_enter()
360 stack.back().state = handle_precision(ir->type, ir->precision()); in visit_enter()
366 find_lowerable_rvalues_visitor::visit_enter(ir_dereference_array *ir) in visit_enter() argument
368 ir_hierarchical_visitor::visit_enter(ir); in visit_enter()
371 stack.back().state = handle_precision(ir->type, ir->precision()); in visit_enter()
377 find_lowerable_rvalues_visitor::visit_enter(ir_texture *ir) in visit_enter() argument
379 ir_hierarchical_visitor::visit_enter(ir); in visit_enter()
384 stack.back().state = handle_precision(ir->type, in visit_enter()
385 ir->sampler->precision()); in visit_enter()
390 find_lowerable_rvalues_visitor::visit_enter(ir_expression *ir) in visit_enter() argument
392 ir_hierarchical_visitor::visit_enter(ir); in visit_enter()
394 if (!can_lower_type(options, ir->type)) in visit_enter()
399 (ir->operation == ir_unop_dFdx || in visit_enter()
400 ir->operation == ir_unop_dFdx_coarse || in visit_enter()
401 ir->operation == ir_unop_dFdx_fine || in visit_enter()
402 ir->operation == ir_unop_dFdy || in visit_enter()
403 ir->operation == ir_unop_dFdy_coarse || in visit_enter()
404 ir->operation == ir_unop_dFdy_fine)) { in visit_enter()
423 handle_call(ir_call *ir, const struct set *lowerable_rvalues) in handle_call() argument
428 if (ir->callee->intrinsic_id == ir_intrinsic_image_load || in handle_call()
429 (ir->callee->is_builtin() && in handle_call()
430 !strcmp(ir->callee_name(), "imageLoad"))) { in handle_call()
431 ir_rvalue *param = (ir_rvalue*)ir->actual_parameters.get_head(); in handle_call()
434 assert(ir->callee->return_precision == GLSL_PRECISION_NONE); in handle_call()
463 if (!ir->callee->is_builtin()) in handle_call()
464 return ir->callee->return_precision; in handle_call()
467 if (ir->callee->is_builtin() && ir->actual_parameters.length()) { in handle_call()
468 ir_rvalue *param = (ir_rvalue*)ir->actual_parameters.get_head(); in handle_call()
480 if (!strcmp(ir->callee_name(), "textureSize")) in handle_call()
488 !strcmp(ir->callee_name(), "floatBitsToInt") || in handle_call()
489 !strcmp(ir->callee_name(), "floatBitsToUint") || in handle_call()
490 !strcmp(ir->callee_name(), "intBitsToFloat") || in handle_call()
491 !strcmp(ir->callee_name(), "uintBitsToFloat") || in handle_call()
492 !strcmp(ir->callee_name(), "bitfieldReverse") || in handle_call()
493 !strcmp(ir->callee_name(), "frexp") || in handle_call()
494 !strcmp(ir->callee_name(), "ldexp") || in handle_call()
497 !strcmp(ir->callee_name(), "uaddCarry") || in handle_call()
498 !strcmp(ir->callee_name(), "usubBorrow") || in handle_call()
499 !strcmp(ir->callee_name(), "imulExtended") || in handle_call()
500 !strcmp(ir->callee_name(), "umulExtended") || in handle_call()
501 !strcmp(ir->callee_name(), "unpackUnorm2x16") || in handle_call()
502 !strcmp(ir->callee_name(), "unpackSnorm2x16") || in handle_call()
504 !strcmp(ir->callee_name(), "packUnorm2x16") || in handle_call()
505 !strcmp(ir->callee_name(), "packSnorm2x16") || in handle_call()
512 !strcmp(ir->callee_name(), "packHalf2x16") || in handle_call()
513 !strcmp(ir->callee_name(), "packUnorm4x8") || in handle_call()
514 !strcmp(ir->callee_name(), "packSnorm4x8") || in handle_call()
516 strstr(ir->callee_name(), "atomic") == ir->callee_name()) in handle_call()
519 assert(ir->callee->return_precision == GLSL_PRECISION_NONE); in handle_call()
522 unsigned check_parameters = ir->actual_parameters.length(); in handle_call()
526 if (!strcmp(ir->callee_name(), "interpolateAtOffset") || in handle_call()
527 !strcmp(ir->callee_name(), "interpolateAtSample") || in handle_call()
528 !strcmp(ir->callee_name(), "bitfieldExtract")) { in handle_call()
530 } else if (!strcmp(ir->callee_name(), "bitfieldInsert")) { in handle_call()
532 } if (function_always_returns_mediump_or_lowp(ir->callee_name())) { in handle_call()
542 foreach_in_list(ir_rvalue, param, &ir->actual_parameters) { in handle_call()
557 find_lowerable_rvalues_visitor::visit_leave(ir_call *ir) in visit_leave() argument
559 ir_hierarchical_visitor::visit_leave(ir); in visit_leave()
568 if (!ir->return_deref) in visit_leave()
571 ir_variable *var = ir->return_deref->variable_referenced(); in visit_leave()
575 unsigned return_precision = handle_call(ir, lowerable_rvalues); in visit_leave()
594 find_lowerable_rvalues_visitor::visit_leave(ir_assignment *ir) in visit_leave() argument
596 ir_hierarchical_visitor::visit_leave(ir); in visit_leave()
602 ir_variable *var = ir->lhs->variable_referenced(); in visit_leave()
605 if (_mesa_set_search(lowerable_rvalues, ir->rhs)) { in visit_leave()
613 } else if (!ir->rhs->as_constant()) { in visit_leave()
690 convert_precision(bool up, ir_rvalue *ir) in convert_precision() argument
695 switch (ir->type->base_type) { in convert_precision()
710 switch (ir->type->base_type) { in convert_precision()
726 const glsl_type *desired_type = convert_type(up, ir->type); in convert_precision()
727 void *mem_ctx = ralloc_parent(ir); in convert_precision()
728 return new(mem_ctx) ir_expression(op, desired_type, ir, NULL); in convert_precision()
734 ir_rvalue *ir = *rvalue; in handle_rvalue() local
736 if (ir == NULL) in handle_rvalue()
739 if (ir->as_dereference()) { in handle_rvalue()
740 if (!ir->type->is_boolean()) in handle_rvalue()
741 *rvalue = convert_precision(false, ir); in handle_rvalue()
742 } else if (ir->type->is_32bit()) { in handle_rvalue()
743 ir->type = lower_glsl_type(ir->type); in handle_rvalue()
745 ir_constant *const_ir = ir->as_constant(); in handle_rvalue()
750 if (ir->type->base_type == GLSL_TYPE_FLOAT16) { in handle_rvalue()
753 } else if (ir->type->base_type == GLSL_TYPE_INT16) { in handle_rvalue()
756 } else if (ir->type->base_type == GLSL_TYPE_UINT16) { in handle_rvalue()
769 lower_precision_visitor::visit_enter(ir_dereference_record *ir) in visit_enter() argument
776 lower_precision_visitor::visit_enter(ir_dereference_array *ir) in visit_enter() argument
785 lower_precision_visitor::visit_enter(ir_call *ir) in visit_enter() argument
793 lower_precision_visitor::visit_enter(ir_texture *ir) in visit_enter() argument
801 lower_precision_visitor::visit_leave(ir_expression *ir) in visit_leave() argument
803 ir_rvalue_visitor::visit_leave(ir); in visit_leave()
808 switch (ir->operation) { in visit_leave()
810 ir->operation = ir_unop_b2f16; in visit_leave()
813 ir->operation = ir_unop_f162b; in visit_leave()
867 find_precision_visitor::visit_enter(ir_call *ir) in visit_enter() argument
869 ir_rvalue_enter_visitor::visit_enter(ir); in visit_enter()
872 ir->return_deref ? ir->return_deref->variable_referenced() : NULL; in visit_enter()
881 if (ir->callee->intrinsic_id == ir_intrinsic_image_load) in visit_enter()
889 if (!ir->callee->is_builtin() || in visit_enter()
890 ir->callee->is_intrinsic() || in visit_enter()
896 ir->callee = map_builtin(ir->callee); in visit_enter()
897 ir->generate_inline(ir); in visit_enter()
898 ir->remove(); in visit_enter()
959 * (and the ?: operator, which is represented by if-then-else in the IR),
979 virtual ir_visitor_status visit_enter(ir_assignment *ir);
980 virtual ir_visitor_status visit_enter(ir_return *ir);
981 virtual ir_visitor_status visit_enter(ir_call *ir);
984 void fix_types_in_deref_chain(ir_dereference *ir);
993 lower_constant(ir_constant *ir) in lower_constant() argument
995 if (ir->type->is_array()) { in lower_constant()
996 for (int i = 0; i < ir->type->array_size(); i++) in lower_constant()
997 lower_constant(ir->get_array_element(i)); in lower_constant()
999 ir->type = lower_glsl_type(ir->type); in lower_constant()
1003 ir->type = lower_glsl_type(ir->type); in lower_constant()
1006 if (ir->type->base_type == GLSL_TYPE_FLOAT16) { in lower_constant()
1008 value.f16[i] = _mesa_float_to_half(ir->value.f[i]); in lower_constant()
1009 } else if (ir->type->base_type == GLSL_TYPE_INT16) { in lower_constant()
1011 value.i16[i] = ir->value.i[i]; in lower_constant()
1012 } else if (ir->type->base_type == GLSL_TYPE_UINT16) { in lower_constant()
1014 value.u16[i] = ir->value.u[i]; in lower_constant()
1019 ir->value = value; in lower_constant()
1059 lower_variables_visitor::fix_types_in_deref_chain(ir_dereference *ir) in fix_types_in_deref_chain() argument
1061 assert(ir->type->without_array()->is_32bit()); in fix_types_in_deref_chain()
1062 assert(_mesa_set_search(lower_vars, ir->variable_referenced())); in fix_types_in_deref_chain()
1065 ir->type = lower_glsl_type(ir->type); in fix_types_in_deref_chain()
1068 for (ir_dereference_array *deref_array = ir->as_dereference_array(); in fix_types_in_deref_chain()
1110 lower_variables_visitor::visit_enter(ir_assignment *ir) in visit_enter() argument
1112 ir_dereference *lhs = ir->lhs; in visit_enter()
1114 ir_dereference *rhs_deref = ir->rhs->as_dereference(); in visit_enter()
1116 ir_constant *rhs_const = ir->rhs->as_constant(); in visit_enter()
1129 assert(ir->rhs->type->is_array()); in visit_enter()
1136 ir->remove(); in visit_enter()
1143 ir->rhs->type->without_array()->is_32bit()) { in visit_enter()
1146 convert_split_assignment(lhs, ir->rhs, true); in visit_enter()
1147 ir->remove(); in visit_enter()
1166 if (ir->rhs->type->is_32bit()) { in visit_enter()
1167 ir_expression *expr = ir->rhs->as_expression(); in visit_enter()
1179 ir->rhs = expr->operands[0]; in visit_enter()
1182 ir->rhs = convert_precision(false, ir->rhs); in visit_enter()
1187 return ir_rvalue_enter_visitor::visit_enter(ir); in visit_enter()
1191 lower_variables_visitor::visit_enter(ir_return *ir) in visit_enter() argument
1193 void *mem_ctx = ralloc_parent(ir); in visit_enter()
1195 ir_dereference *deref = ir->value ? ir->value->as_dereference() : NULL; in visit_enter()
1214 ir->value = new(mem_ctx) ir_dereference_variable(new_var); in visit_enter()
1218 return ir_rvalue_enter_visitor::visit_enter(ir); in visit_enter()
1223 ir_rvalue *ir = *rvalue; in handle_rvalue() local
1225 if (in_assignee || ir == NULL) in handle_rvalue()
1228 ir_expression *expr = ir->as_expression(); in handle_rvalue()
1251 ir_dereference *deref = ir->as_dereference(); in handle_rvalue()
1260 void *mem_ctx = ralloc_parent(ir); in handle_rvalue()
1279 lower_variables_visitor::visit_enter(ir_call *ir) in visit_enter() argument
1281 void *mem_ctx = ralloc_parent(ir); in visit_enter()
1284 foreach_two_lists(formal_node, &ir->callee->parameters, in visit_enter()
1285 actual_node, &ir->actual_parameters) { in visit_enter()
1326 ir_dereference_variable *ret_deref = ir->return_deref; in visit_enter()
1334 new(mem_ctx) ir_variable(ir->callee->return_type, "lowerp", in visit_enter()
1347 return ir_rvalue_enter_visitor::visit_enter(ir); in visit_enter()