Lines Matching refs: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,
200 entry.instr = ir;
278 find_lowerable_rvalues_visitor::stack_leave(class ir_instruction *ir,
329 find_lowerable_rvalues_visitor::visit(ir_constant *ir)
331 stack_enter(ir, this);
333 if (!can_lower_type(options, ir->type))
336 stack_leave(ir, this);
342 find_lowerable_rvalues_visitor::visit(ir_dereference_variable *ir)
344 stack_enter(ir, this);
347 stack.back().state = handle_precision(ir->type, ir->precision());
349 stack_leave(ir, this);
355 find_lowerable_rvalues_visitor::visit_enter(ir_dereference_record *ir)
357 ir_hierarchical_visitor::visit_enter(ir);
360 stack.back().state = handle_precision(ir->type, ir->precision());
366 find_lowerable_rvalues_visitor::visit_enter(ir_dereference_array *ir)
368 ir_hierarchical_visitor::visit_enter(ir);
371 stack.back().state = handle_precision(ir->type, ir->precision());
377 find_lowerable_rvalues_visitor::visit_enter(ir_texture *ir)
379 ir_hierarchical_visitor::visit_enter(ir);
384 stack.back().state = handle_precision(ir->type,
385 ir->sampler->precision());
390 find_lowerable_rvalues_visitor::visit_enter(ir_expression *ir)
392 ir_hierarchical_visitor::visit_enter(ir);
394 if (!can_lower_type(options, ir->type))
399 (ir->operation == ir_unop_dFdx ||
400 ir->operation == ir_unop_dFdx_coarse ||
401 ir->operation == ir_unop_dFdx_fine ||
402 ir->operation == ir_unop_dFdy ||
403 ir->operation == ir_unop_dFdy_coarse ||
404 ir->operation == ir_unop_dFdy_fine)) {
423 handle_call(ir_call *ir, const struct set *lowerable_rvalues)
428 if (ir->callee->intrinsic_id == ir_intrinsic_image_load ||
429 (ir->callee->is_builtin() &&
430 !strcmp(ir->callee_name(), "imageLoad"))) {
431 ir_rvalue *param = (ir_rvalue*)ir->actual_parameters.get_head();
434 assert(ir->callee->return_precision == GLSL_PRECISION_NONE);
463 if (!ir->callee->is_builtin())
464 return ir->callee->return_precision;
467 if (ir->callee->is_builtin() && ir->actual_parameters.length()) {
468 ir_rvalue *param = (ir_rvalue*)ir->actual_parameters.get_head();
480 if (!strcmp(ir->callee_name(), "textureSize"))
489 if (!strcmp(ir->callee_name(), "textureGatherOffsets"))
497 !strcmp(ir->callee_name(), "floatBitsToInt") ||
498 !strcmp(ir->callee_name(), "floatBitsToUint") ||
499 !strcmp(ir->callee_name(), "intBitsToFloat") ||
500 !strcmp(ir->callee_name(), "uintBitsToFloat") ||
501 !strcmp(ir->callee_name(), "bitfieldReverse") ||
502 !strcmp(ir->callee_name(), "frexp") ||
503 !strcmp(ir->callee_name(), "ldexp") ||
506 !strcmp(ir->callee_name(), "uaddCarry") ||
507 !strcmp(ir->callee_name(), "usubBorrow") ||
508 !strcmp(ir->callee_name(), "imulExtended") ||
509 !strcmp(ir->callee_name(), "umulExtended") ||
510 !strcmp(ir->callee_name(), "unpackUnorm2x16") ||
511 !strcmp(ir->callee_name(), "unpackSnorm2x16") ||
513 !strcmp(ir->callee_name(), "packUnorm2x16") ||
514 !strcmp(ir->callee_name(), "packSnorm2x16") ||
521 !strcmp(ir->callee_name(), "packHalf2x16") ||
522 !strcmp(ir->callee_name(), "packUnorm4x8") ||
523 !strcmp(ir->callee_name(), "packSnorm4x8") ||
525 strstr(ir->callee_name(), "atomic") == ir->callee_name())
528 assert(ir->callee->return_precision == GLSL_PRECISION_NONE);
531 unsigned check_parameters = ir->actual_parameters.length();
535 if (!strcmp(ir->callee_name(), "interpolateAtOffset") ||
536 !strcmp(ir->callee_name(), "interpolateAtSample") ||
537 !strcmp(ir->callee_name(), "bitfieldExtract")) {
539 } else if (!strcmp(ir->callee_name(), "bitfieldInsert")) {
541 } if (function_always_returns_mediump_or_lowp(ir->callee_name())) {
551 foreach_in_list(ir_rvalue, param, &ir->actual_parameters) {
566 find_lowerable_rvalues_visitor::visit_leave(ir_call *ir)
568 ir_hierarchical_visitor::visit_leave(ir);
577 if (!ir->return_deref)
580 ir_variable *var = ir->return_deref->variable_referenced();
584 unsigned return_precision = handle_call(ir, lowerable_rvalues);
603 find_lowerable_rvalues_visitor::visit_leave(ir_assignment *ir)
605 ir_hierarchical_visitor::visit_leave(ir);
611 ir_variable *var = ir->lhs->variable_referenced();
614 if (_mesa_set_search(lowerable_rvalues, ir->rhs)) {
622 } else if (!ir->rhs->as_constant()) {
699 convert_precision(bool up, ir_rvalue *ir)
704 switch (ir->type->base_type) {
719 switch (ir->type->base_type) {
735 const glsl_type *desired_type = convert_type(up, ir->type);
736 void *mem_ctx = ralloc_parent(ir);
737 return new(mem_ctx) ir_expression(op, desired_type, ir, NULL);
743 ir_rvalue *ir = *rvalue;
745 if (ir == NULL)
748 if (ir->as_dereference()) {
749 if (!ir->type->is_boolean())
750 *rvalue = convert_precision(false, ir);
751 } else if (ir->type->is_32bit()) {
752 ir->type = lower_glsl_type(ir->type);
754 ir_constant *const_ir = ir->as_constant();
759 if (ir->type->base_type == GLSL_TYPE_FLOAT16) {
762 } else if (ir->type->base_type == GLSL_TYPE_INT16) {
765 } else if (ir->type->base_type == GLSL_TYPE_UINT16) {
778 lower_precision_visitor::visit_enter(ir_dereference_record *ir)
785 lower_precision_visitor::visit_enter(ir_dereference_array *ir)
794 lower_precision_visitor::visit_enter(ir_call *ir)
802 lower_precision_visitor::visit_enter(ir_texture *ir)
810 lower_precision_visitor::visit_leave(ir_expression *ir)
812 ir_rvalue_visitor::visit_leave(ir);
817 switch (ir->operation) {
819 ir->operation = ir_unop_b2f16;
822 ir->operation = ir_unop_f162b;
876 find_precision_visitor::visit_enter(ir_call *ir)
878 ir_rvalue_enter_visitor::visit_enter(ir);
881 ir->return_deref ? ir->return_deref->variable_referenced() : NULL;
890 if (ir->callee->intrinsic_id == ir_intrinsic_image_load)
898 if (!ir->callee->is_builtin() ||
899 ir->callee->is_intrinsic() ||
905 ir->callee = map_builtin(ir->callee);
906 ir->generate_inline(ir);
907 ir->remove();
988 virtual ir_visitor_status visit_enter(ir_assignment *ir);
989 virtual ir_visitor_status visit_enter(ir_return *ir);
990 virtual ir_visitor_status visit_enter(ir_call *ir);
993 void fix_types_in_deref_chain(ir_dereference *ir);
1002 lower_constant(ir_constant *ir)
1004 if (ir->type->is_array()) {
1005 for (int i = 0; i < ir->type->array_size(); i++)
1006 lower_constant(ir->get_array_element(i));
1008 ir->type = lower_glsl_type(ir->type);
1012 ir->type = lower_glsl_type(ir->type);
1015 if (ir->type->base_type == GLSL_TYPE_FLOAT16) {
1017 value.f16[i] = _mesa_float_to_half(ir->value.f[i]);
1018 } else if (ir->type->base_type == GLSL_TYPE_INT16) {
1020 value.i16[i] = ir->value.i[i];
1021 } else if (ir->type->base_type == GLSL_TYPE_UINT16) {
1023 value.u16[i] = ir->value.u[i];
1028 ir->value = value;
1073 lower_variables_visitor::fix_types_in_deref_chain(ir_dereference *ir)
1075 assert(ir->type->without_array()->is_32bit());
1076 assert(_mesa_set_search(lower_vars, ir->variable_referenced()));
1079 ir->type = lower_glsl_type(ir->type);
1082 for (ir_dereference_array *deref_array = ir->as_dereference_array();
1124 lower_variables_visitor::visit_enter(ir_assignment *ir)
1126 ir_dereference *lhs = ir->lhs;
1128 ir_dereference *rhs_deref = ir->rhs->as_dereference();
1130 ir_constant *rhs_const = ir->rhs->as_constant();
1143 assert(ir->rhs->type->is_array());
1150 ir->remove();
1157 ir->rhs->type->without_array()->is_32bit()) {
1160 convert_split_assignment(lhs, ir->rhs, true);
1161 ir->remove();
1180 if (ir->rhs->type->is_32bit()) {
1181 ir_expression *expr = ir->rhs->as_expression();
1193 ir->rhs = expr->operands[0];
1196 ir->rhs = convert_precision(false, ir->rhs);
1201 return ir_rvalue_enter_visitor::visit_enter(ir);
1205 lower_variables_visitor::visit_enter(ir_return *ir)
1207 void *mem_ctx = ralloc_parent(ir);
1209 ir_dereference *deref = ir->value ? ir->value->as_dereference() : NULL;
1228 ir->value = new(mem_ctx) ir_dereference_variable(new_var);
1232 return ir_rvalue_enter_visitor::visit_enter(ir);
1237 ir_rvalue *ir = *rvalue;
1239 if (in_assignee || ir == NULL)
1242 ir_expression *expr = ir->as_expression();
1265 ir_dereference *deref = ir->as_dereference();
1274 void *mem_ctx = ralloc_parent(ir);
1293 lower_variables_visitor::visit_enter(ir_call *ir)
1295 void *mem_ctx = ralloc_parent(ir);
1298 foreach_two_lists(formal_node, &ir->callee->parameters,
1299 actual_node, &ir->actual_parameters) {
1340 ir_dereference_variable *ret_deref = ir->return_deref;
1348 new(mem_ctx) ir_variable(ir->callee->return_type, "lowerp",
1361 return ir_rvalue_enter_visitor::visit_enter(ir);