Lines Matching refs:ir
32 #include "ir.h"
83 void create_function(ir_function_signature *ir);
90 nir_ssa_def *evaluate_rvalue(ir_rvalue *ir);
106 nir_deref_instr *evaluate_deref(ir_instruction *ir);
108 nir_constant *constant_copy(ir_constant *ir, void *mem_ctx);
160 virtual ir_visitor_status visit_enter(ir_function_signature *ir)
163 if (ir->is_intrinsic())
166 foreach_in_list(ir_variable, param, &ir->parameters) {
178 if (!glsl_type_is_vector_or_scalar(ir->return_type) &&
179 !ir->return_type->is_void()) {
194 has_unsupported_function_param(exec_list *ir)
197 visit_list_elements(&visitor, ir);
216 * TODO: add missing glsl ir to nir support and remove this loop.
218 while (has_unsupported_function_param(sh->ir)) {
219 do_common_optimization(sh->ir, true, gl_options, consts->NativeIntegers);
227 v2.run(sh->ir);
228 visit_exec_list(sh->ir, &v1);
231 ralloc_free(sh->ir);
232 sh->ir = NULL;
310 nir_visitor::evaluate_deref(ir_instruction *ir)
312 ir->accept(this);
317 nir_visitor::constant_copy(ir_constant *ir, void *mem_ctx)
319 if (ir == NULL)
324 const unsigned rows = ir->type->vector_elements;
325 const unsigned cols = ir->type->matrix_columns;
329 switch (ir->type->base_type) {
335 ret->values[r].u32 = ir->value.u[r];
344 ret->values[r].u16 = ir->value.u16[r];
352 ret->values[r].i32 = ir->value.i[r];
361 ret->values[r].i16 = ir->value.i16[r];
373 switch (ir->type->base_type) {
376 col_const->values[r].f32 = ir->value.f[c * rows + r];
381 col_const->values[r].u16 = ir->value.f16[c * rows + r];
386 col_const->values[r].f64 = ir->value.d[c * rows + r];
395 switch (ir->type->base_type) {
398 ret->values[r].f32 = ir->value.f[r];
403 ret->values[r].u16 = ir->value.f16[r];
408 ret->values[r].f64 = ir->value.d[r];
422 ret->values[r].u64 = ir->value.u64[r];
430 ret->values[r].i64 = ir->value.i64[r];
438 ret->values[r].b = ir->value.b[r];
445 ir->type->length);
446 ret->num_elements = ir->type->length;
448 for (i = 0; i < ir->type->length; i++)
449 ret->elements[i] = constant_copy(ir->const_elements[i], mem_ctx);
492 nir_visitor::visit(ir_variable *ir)
495 assert(ir->data.mode != ir_var_function_inout);
497 if (ir->data.mode == ir_var_function_out)
501 var->type = ir->type;
502 var->name = ralloc_strdup(var, ir->name);
504 var->data.assigned = ir->data.assigned;
505 var->data.always_active_io = ir->data.always_active_io;
506 var->data.read_only = ir->data.read_only;
507 var->data.centroid = ir->data.centroid;
508 var->data.sample = ir->data.sample;
509 var->data.patch = ir->data.patch;
510 var->data.how_declared = get_nir_how_declared(ir->data.how_declared);
511 var->data.invariant = ir->data.invariant;
512 var->data.location = ir->data.location;
513 var->data.must_be_shader_input = ir->data.must_be_shader_input;
514 var->data.stream = ir->data.stream;
515 if (ir->data.stream & (1u << 31))
518 var->data.precision = ir->data.precision;
519 var->data.explicit_location = ir->data.explicit_location;
520 var->data.matrix_layout = ir->data.matrix_layout;
521 var->data.from_named_ifc_block = ir->data.from_named_ifc_block;
524 switch(ir->data.mode) {
540 ir->data.location == VARYING_SLOT_PRIMITIVE_ID) {
548 (ir->data.location == VARYING_SLOT_TESS_LEVEL_INNER ||
549 ir->data.location == VARYING_SLOT_TESS_LEVEL_OUTER)) {
550 var->data.compact = ir->type->without_array()->is_scalar();
554 ir->data.location >= VARYING_SLOT_CLIP_DIST0 &&
555 ir->data.location <= VARYING_SLOT_CULL_DIST1) {
556 var->data.compact = ir->type->without_array()->is_scalar();
564 (ir->data.location == VARYING_SLOT_TESS_LEVEL_INNER ||
565 ir->data.location == VARYING_SLOT_TESS_LEVEL_OUTER)) {
566 var->data.compact = ir->type->without_array()->is_scalar();
570 ir->data.location >= VARYING_SLOT_CLIP_DIST0 &&
571 ir->data.location <= VARYING_SLOT_CULL_DIST1) {
572 var->data.compact = ir->type->without_array()->is_scalar();
577 if (ir->get_interface_type())
579 else if (ir->type->contains_image() && !ir->data.bindless)
602 if (ir->data.memory_read_only)
604 if (ir->data.memory_write_only)
606 if (ir->data.memory_coherent)
608 if (ir->data.memory_volatile)
610 if (ir->data.memory_restrict)
613 var->interface_type = ir->get_interface_type();
618 ir->get_interface_type()->get_explicit_interface_type(supports_std430);
622 if (ir->type->without_array()->is_interface()) {
626 var->type = glsl_type_wrap_in_arrays(explicit_ifc_type, ir->type);
633 if (strcmp(ir->name, field->name) != 0)
655 var->data.interpolation = ir->data.interpolation;
656 var->data.location_frac = ir->data.location_frac;
658 switch (ir->data.depth_layout) {
678 var->data.index = ir->data.index;
680 var->data.binding = ir->data.binding;
681 var->data.explicit_binding = ir->data.explicit_binding;
682 var->data.explicit_offset = ir->data.explicit_xfb_offset;
683 var->data.bindless = ir->data.bindless;
684 var->data.offset = ir->data.offset;
688 var->data.image.format = ir->data.image_format;
690 var->data.xfb.buffer = ir->data.xfb_buffer;
691 var->data.xfb.stride = ir->data.xfb_stride;
694 var->data.fb_fetch_output = ir->data.fb_fetch_output;
695 var->data.explicit_xfb_buffer = ir->data.explicit_xfb_buffer;
696 var->data.explicit_xfb_stride = ir->data.explicit_xfb_stride;
698 var->num_state_slots = ir->get_num_state_slots();
703 ir_state_slot *state_slots = ir->get_state_slots();
713 var->constant_initializer = constant_copy(ir->constant_initializer, var);
720 _mesa_hash_table_insert(var_table, ir, var);
724 nir_function_visitor::visit_enter(ir_function *ir)
726 foreach_in_list(ir_function_signature, sig, &ir->signatures) {
733 nir_visitor::create_function(ir_function_signature *ir)
735 if (ir->is_intrinsic())
738 nir_function *func = nir_function_create(shader, ir->function_name());
739 if (strcmp(ir->function_name(), "main") == 0)
742 func->num_params = ir->parameters.length() +
743 (ir->return_type != glsl_type::void_type);
748 if (ir->return_type != glsl_type::void_type) {
755 foreach_in_list(ir_variable, param, &ir->parameters) {
770 _mesa_hash_table_insert(this->overload_table, ir, func);
774 nir_visitor::visit(ir_function *ir)
776 foreach_in_list(ir_function_signature, sig, &ir->signatures)
781 nir_visitor::visit(ir_function_signature *ir)
783 if (ir->is_intrinsic())
786 this->sig = ir;
789 _mesa_hash_table_search(this->overload_table, ir);
794 if (ir->is_defined) {
803 unsigned i = (ir->return_type != glsl_type::void_type) ? 1 : 0;
805 foreach_in_list(ir_variable, param, &ir->parameters) {
817 visit_exec_list(&ir->body, this);
826 nir_visitor::visit(ir_loop *ir)
829 visit_exec_list(&ir->body_instructions, this);
834 nir_visitor::visit(ir_if *ir)
836 nir_push_if(&b, evaluate_rvalue(ir->condition));
837 visit_exec_list(&ir->then_instructions, this);
839 visit_exec_list(&ir->else_instructions, this);
844 nir_visitor::visit(ir_discard *ir)
853 if (ir->condition)
854 nir_discard_if(&b, evaluate_rvalue(ir->condition));
860 nir_visitor::visit(ir_demote *ir)
866 nir_visitor::visit(ir_emit_vertex *ir)
868 nir_emit_vertex(&b, (unsigned)ir->stream_id());
872 nir_visitor::visit(ir_end_primitive *ir)
874 nir_end_primitive(&b, (unsigned)ir->stream_id());
878 nir_visitor::visit(ir_loop_jump *ir)
881 switch (ir->mode) {
897 nir_visitor::visit(ir_return *ir)
899 if (ir->value != NULL) {
902 nir_var_function_temp, ir->value->type, 0);
904 nir_ssa_def *val = evaluate_rvalue(ir->value);
960 nir_visitor::visit(ir_call *ir)
962 if (ir->callee->is_intrinsic()) {
965 switch (ir->callee->intrinsic_id) {
967 op = ir->return_deref->type->is_integer_32_64()
980 assert(ir->return_deref);
981 if (ir->return_deref->type == glsl_type::int_type ||
982 ir->return_deref->type == glsl_type::int64_t_type)
984 else if (ir->return_deref->type == glsl_type::uint_type ||
985 ir->return_deref->type == glsl_type::uint64_t_type)
987 else if (ir->return_deref->type == glsl_type::float_type)
993 assert(ir->return_deref);
994 if (ir->return_deref->type == glsl_type::int_type ||
995 ir->return_deref->type == glsl_type::int64_t_type)
997 else if (ir->return_deref->type == glsl_type::uint_type ||
998 ir->return_deref->type == glsl_type::uint64_t_type)
1000 else if (ir->return_deref->type == glsl_type::float_type)
1009 op = ir->return_deref->type->is_integer_32_64()
1053 op = ir->return_deref->type->is_integer_32_64()
1058 if (ir->return_deref->type == glsl_type::int_type)
1060 else if (ir->return_deref->type == glsl_type::uint_type)
1066 if (ir->return_deref->type == glsl_type::int_type)
1068 else if (ir->return_deref->type == glsl_type::uint_type)
1153 op = ir->return_deref->type->is_integer_32_64()
1167 assert(ir->return_deref);
1168 if (ir->return_deref->type == glsl_type::int_type ||
1169 ir->return_deref->type == glsl_type::int64_t_type)
1171 else if (ir->return_deref->type == glsl_type::uint_type ||
1172 ir->return_deref->type == glsl_type::uint64_t_type)
1174 else if (ir->return_deref->type == glsl_type::float_type)
1180 assert(ir->return_deref);
1181 if (ir->return_deref->type == glsl_type::int_type ||
1182 ir->return_deref->type == glsl_type::int64_t_type)
1184 else if (ir->return_deref->type == glsl_type::uint_type ||
1185 ir->return_deref->type == glsl_type::uint64_t_type)
1187 else if (ir->return_deref->type == glsl_type::float_type)
1196 op = ir->return_deref->type->is_integer_32_64()
1246 int param_count = ir->actual_parameters.length();
1250 exec_node *param = ir->actual_parameters.get_head();
1285 assert(ir->return_deref);
1286 if (ir->return_deref->type->is_integer_64()) {
1288 ir->return_deref->type->vector_elements, 64, NULL);
1291 ir->return_deref->type->vector_elements, 32, NULL);
1308 exec_node *param = ir->actual_parameters.get_head();
1315 if (ir->return_deref) {
1354 exec_node *param = ir->actual_parameters.get_head();
1368 if (ir->return_deref) {
1372 ir->return_deref->type->field_type("texel");
1376 num_components = ir->return_deref->type->vector_elements;
1475 exec_node *param = ir->actual_parameters.get_head();
1503 exec_node *param = ir->actual_parameters.get_head();
1509 const glsl_type *type = ir->return_deref->var->type;
1526 exec_node *param = ir->actual_parameters.get_head();
1567 int param_count = ir->actual_parameters.length();
1571 exec_node *param = ir->actual_parameters.get_head();
1591 assert(ir->return_deref);
1592 unsigned bit_size = glsl_get_bit_size(ir->return_deref->type);
1594 ir->return_deref->type->vector_elements,
1606 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1615 ir->return_deref->type->vector_elements, 64, NULL);
1616 instr->num_components = ir->return_deref->type->vector_elements;
1618 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1626 ir->return_deref->type->vector_elements, 32, NULL);
1627 instr->num_components = ir->return_deref->type->vector_elements;
1629 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1632 ir_rvalue *invocation = (ir_rvalue *) ir->actual_parameters.get_head()->next;
1640 ir->return_deref->type->vector_elements, 32, NULL);
1641 instr->num_components = ir->return_deref->type->vector_elements;
1643 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1657 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1667 if (ir->return_deref) {
1668 nir_deref_instr *ret_deref = evaluate_deref(ir->return_deref);
1671 adjust_sparse_variable(ret_deref, ir->return_deref->type, ret);
1680 _mesa_hash_table_search(this->overload_table, ir->callee);
1688 if (ir->return_deref) {
1690 nir_local_variable_create(this->impl, ir->return_deref->type,
1696 foreach_two_lists(formal_node, &ir->callee->parameters,
1697 actual_node, &ir->actual_parameters) {
1718 if (ir->return_deref)
1719 nir_store_deref(&b, evaluate_deref(ir->return_deref), nir_load_deref(&b, ret_deref), ~0);
1723 nir_visitor::visit(ir_assignment *ir)
1725 unsigned num_components = ir->lhs->type->vector_elements;
1726 unsigned write_mask = ir->write_mask;
1728 b.exact = ir->lhs->variable_referenced()->data.invariant ||
1729 ir->lhs->variable_referenced()->data.precise;
1731 if ((ir->rhs->as_dereference() || ir->rhs->as_constant()) &&
1733 nir_deref_instr *lhs = evaluate_deref(ir->lhs);
1734 nir_deref_instr *rhs = evaluate_deref(ir->rhs);
1743 ir_texture *tex = ir->rhs->as_texture();
1747 assert(ir->rhs->type->is_scalar() || ir->rhs->type->is_vector());
1749 ir->lhs->accept(this);
1751 nir_ssa_def *src = evaluate_rvalue(ir->rhs);
1835 nir_visitor::evaluate_rvalue(ir_rvalue* ir)
1837 ir->accept(this);
1838 if (ir->as_dereference() || ir->as_constant()) {
1869 nir_visitor::visit(ir_expression *ir)
1872 switch (ir->operation) {
1876 ir_dereference *deref = ir->operands[0]->as_dereference();
1882 swizzle = ir->operands[0]->as_swizzle();
1892 switch (ir->operation) {
1922 intrin->src[1] = nir_src_for_ssa(evaluate_rvalue(ir->operands[1]));
1944 ir_dereference *deref = ir->operands[0]->as_dereference();
1961 for (unsigned i = 0; i < ir->num_operands; i++)
1962 srcs[i] = evaluate_rvalue(ir->operands[i]);
1965 for (unsigned i = 0; i < ir->num_operands; i++)
1966 types[i] = ir->operands[i]->type->base_type;
1968 glsl_base_type out_type = ir->type->base_type;
1970 switch (ir->operation) {
2168 load->num_components = ir->type->vector_elements;
2169 load->src[0] = nir_src_for_ssa(evaluate_rvalue(ir->operands[0]));
2170 unsigned bit_size = glsl_get_bit_size(ir->type);
2171 add_instr(&load->instr, ir->type->vector_elements, bit_size);
2218 (ir->operands[0]->type->base_type == GLSL_TYPE_INT ||
2219 ir->operands[1]->type->base_type == GLSL_TYPE_INT))
2222 (ir->operands[0]->type->base_type == GLSL_TYPE_UINT ||
2223 ir->operands[1]->type->base_type == GLSL_TYPE_UINT))
2310 switch (ir->operands[0]->type->vector_elements) {
2319 switch (ir->operands[0]->type->vector_elements) {
2331 switch (ir->operands[0]->type->vector_elements) {
2340 switch (ir->operands[0]->type->vector_elements) {
2372 result = ir->type->is_int_16_32() ?
2382 result = nir_vec(&b, srcs, ir->type->vector_elements);
2391 nir_visitor::visit(ir_swizzle *ir)
2393 unsigned swizzle[4] = { ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w };
2394 result = nir_swizzle(&b, evaluate_rvalue(ir->val), swizzle,
2395 ir->type->vector_elements);
2399 nir_visitor::visit(ir_texture *ir)
2403 switch (ir->op) {
2411 op = (ir->op == ir_txb) ? nir_texop_txb : nir_texop_txl;
2422 if (ir->lod_info.lod != NULL)
2435 if (ir->lod_info.lod != NULL)
2470 if (ir->projector != NULL)
2472 if (ir->shadow_comparator != NULL)
2475 if (ir->offset != NULL && !ir->offset->type->is_array())
2477 if (ir->clamp != NULL)
2487 (glsl_sampler_dim) ir->sampler->type->sampler_dimensionality;
2488 instr->is_array = ir->sampler->type->sampler_array;
2489 instr->is_shadow = ir->sampler->type->sampler_shadow;
2492 = ir->is_sparse ? ir->type->field_type("texel") : ir->type;
2497 instr->is_sparse = ir->is_sparse;
2499 nir_deref_instr *sampler_deref = evaluate_deref(ir->sampler);
2518 if (ir->coordinate != NULL) {
2519 instr->coord_components = ir->coordinate->type->vector_elements;
2521 nir_src_for_ssa(evaluate_rvalue(ir->coordinate));
2526 if (ir->projector != NULL) {
2528 nir_src_for_ssa(evaluate_rvalue(ir->projector));
2533 if (ir->shadow_comparator != NULL) {
2535 nir_src_for_ssa(evaluate_rvalue(ir->shadow_comparator));
2540 if (ir->offset != NULL) {
2541 if (ir->offset->type->is_array()) {
2542 for (int i = 0; i < ir->offset->type->array_size(); i++) {
2544 ir->offset->as_constant()->get_array_element(i);
2552 assert(ir->offset->type->is_vector() || ir->offset->type->is_scalar());
2555 nir_src_for_ssa(evaluate_rvalue(ir->offset));
2561 if (ir->clamp) {
2563 nir_src_for_ssa(evaluate_rvalue(ir->clamp));
2568 switch (ir->op) {
2571 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.bias));
2579 if (ir->lod_info.lod != NULL) {
2581 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.lod));
2589 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdx));
2593 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdy));
2600 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.sample_index));
2606 instr->component = ir->lod_info.component->as_constant()->value.u[0];
2620 nir_visitor::visit(ir_constant *ir)
2629 nir_local_variable_create(this->impl, ir->type, "const_temp");
2631 var->constant_initializer = constant_copy(ir, var);
2637 nir_visitor::visit(ir_dereference_variable *ir)
2639 if (ir->variable_referenced()->data.mode == ir_var_function_out) {
2643 if (param == ir->variable_referenced()) {
2650 nir_var_function_temp, ir->type, 0);
2654 assert(ir->variable_referenced()->data.mode != ir_var_function_inout);
2657 _mesa_hash_table_search(this->var_table, ir->var);
2665 nir_visitor::visit(ir_dereference_record *ir)
2667 ir->record->accept(this);
2669 int field_index = ir->field_idx;
2681 const glsl_type *type = ir->record->type;
2694 nir_local_variable_create(this->impl, ir->type, "deref_tmp");
2702 nir_visitor::visit(ir_dereference_array *ir)
2704 nir_ssa_def *index = evaluate_rvalue(ir->array_index);
2706 ir->array->accept(this);
2754 v2.run(sh->ir);
2755 visit_exec_list(sh->ir, &v1);