#include "compiler/nir/nir_builtin_builder.h"
#include "compiler/nir/nir_deref.h"
#include "main/errors.h"
-#include "util/imports.h"
#include "main/mtypes.h"
#include "main/shaderobj.h"
#include "util/u_math.h"
}
}
+ if (!glsl_type_is_vector_or_scalar(ir->return_type) &&
+ !ir->return_type->is_void()) {
+ unsupported = true;
+ return visit_stop;
+ }
+
return visit_continue;
}
break;
+ case GLSL_TYPE_UINT16:
+ /* Only float base types can be matrices. */
+ assert(cols == 1);
+
+ for (unsigned r = 0; r < rows; r++)
+ ret->values[r].u16 = ir->value.u16[r];
+ break;
+
case GLSL_TYPE_INT:
/* Only float base types can be matrices. */
assert(cols == 1);
break;
+ case GLSL_TYPE_INT16:
+ /* Only float base types can be matrices. */
+ assert(cols == 1);
+
+ for (unsigned r = 0; r < rows; r++)
+ ret->values[r].i16 = ir->value.i16[r];
+ break;
+
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_FLOAT16:
case GLSL_TYPE_DOUBLE:
var->data.precision = ir->data.precision;
var->data.explicit_location = ir->data.explicit_location;
+ var->data.matrix_layout = ir->data.matrix_layout;
var->data.from_named_ifc_block = ir->data.from_named_ifc_block;
var->data.compact = false;
if (field->memory_restrict)
qualifiers |= ACCESS_RESTRICT;
}
-
+
parent_type = cur->type;
}
break;
case nir_intrinsic_shader_clock:
nir_ssa_dest_init(&instr->instr, &instr->dest, 2, 32, NULL);
- instr->num_components = 2;
+ nir_intrinsic_set_memory_scope(instr, NIR_SCOPE_SUBGROUP);
nir_builder_instr_insert(&b, &instr->instr);
break;
case nir_intrinsic_begin_invocation_interlock:
nir_builder_instr_insert(&b, &instr->instr);
break;
}
+ case nir_intrinsic_vote_ieq:
+ instr->num_components = 1;
+ /* fall-through */
case nir_intrinsic_vote_any:
- case nir_intrinsic_vote_all:
- case nir_intrinsic_vote_ieq: {
+ case nir_intrinsic_vote_all: {
nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 1, NULL);
- instr->num_components = 1;
ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
}
case nir_intrinsic_is_helper_invocation: {
nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 1, NULL);
- instr->num_components = 1;
nir_builder_instr_insert(&b, &instr->instr);
break;
}
case ir_unop_f2f16:
case ir_unop_f162b:
case ir_unop_b2f16:
+ case ir_unop_i2i:
+ case ir_unop_u2u:
case ir_unop_d2i:
case ir_unop_d2u:
case ir_unop_d2b:
break;
}
+ case ir_unop_i2imp: {
+ result = nir_build_alu(&b, nir_op_i2imp, srcs[0], NULL, NULL, NULL);
+ break;
+ }
+
+ case ir_unop_u2ump: {
+ result = nir_build_alu(&b, nir_op_u2ump, srcs[0], NULL, NULL, NULL);
+ break;
+ }
+
case ir_unop_bitcast_i2f:
case ir_unop_bitcast_f2i:
case ir_unop_bitcast_u2f:
result = nir_find_lsb(&b, srcs[0]);
break;
- case ir_unop_noise:
- switch (ir->type->vector_elements) {
- case 1:
- switch (ir->operands[0]->type->vector_elements) {
- case 1: result = nir_fnoise1_1(&b, srcs[0]); break;
- case 2: result = nir_fnoise1_2(&b, srcs[0]); break;
- case 3: result = nir_fnoise1_3(&b, srcs[0]); break;
- case 4: result = nir_fnoise1_4(&b, srcs[0]); break;
- default: unreachable("not reached");
- }
- break;
- case 2:
- switch (ir->operands[0]->type->vector_elements) {
- case 1: result = nir_fnoise2_1(&b, srcs[0]); break;
- case 2: result = nir_fnoise2_2(&b, srcs[0]); break;
- case 3: result = nir_fnoise2_3(&b, srcs[0]); break;
- case 4: result = nir_fnoise2_4(&b, srcs[0]); break;
- default: unreachable("not reached");
- }
- break;
- case 3:
- switch (ir->operands[0]->type->vector_elements) {
- case 1: result = nir_fnoise3_1(&b, srcs[0]); break;
- case 2: result = nir_fnoise3_2(&b, srcs[0]); break;
- case 3: result = nir_fnoise3_3(&b, srcs[0]); break;
- case 4: result = nir_fnoise3_4(&b, srcs[0]); break;
- default: unreachable("not reached");
- }
- break;
- case 4:
- switch (ir->operands[0]->type->vector_elements) {
- case 1: result = nir_fnoise4_1(&b, srcs[0]); break;
- case 2: result = nir_fnoise4_2(&b, srcs[0]); break;
- case 3: result = nir_fnoise4_3(&b, srcs[0]); break;
- case 4: result = nir_fnoise4_4(&b, srcs[0]); break;
- default: unreachable("not reached");
- }
- break;
- default:
- unreachable("not reached");
- }
- break;
case ir_unop_get_buffer_size: {
nir_intrinsic_instr *load = nir_intrinsic_instr_create(
this->shader,
result = nir_bcsel(&b, srcs[0], srcs[1], srcs[2]);
break;
case ir_triop_bitfield_extract:
- result = (out_type == GLSL_TYPE_INT) ?
- nir_ibitfield_extract(&b, srcs[0], srcs[1], srcs[2]) :
- nir_ubitfield_extract(&b, srcs[0], srcs[1], srcs[2]);
+ result = ir->type->is_int_16_32() ?
+ nir_ibitfield_extract(&b, nir_i2i32(&b, srcs[0]), nir_i2i32(&b, srcs[1]), nir_i2i32(&b, srcs[2])) :
+ nir_ubitfield_extract(&b, nir_u2u32(&b, srcs[0]), nir_i2i32(&b, srcs[1]), nir_i2i32(&b, srcs[2]));
break;
case ir_quadop_bitfield_insert:
- result = nir_bitfield_insert(&b, srcs[0], srcs[1], srcs[2], srcs[3]);
+ result = nir_bitfield_insert(&b,
+ nir_u2u32(&b, srcs[0]), nir_u2u32(&b, srcs[1]),
+ nir_i2i32(&b, srcs[2]), nir_i2i32(&b, srcs[3]));
break;
case ir_quadop_vector:
result = nir_vec(&b, srcs, ir->type->vector_elements);
case GLSL_TYPE_FLOAT16:
instr->dest_type = nir_type_float16;
break;
+ case GLSL_TYPE_INT16:
+ instr->dest_type = nir_type_int16;
+ break;
+ case GLSL_TYPE_UINT16:
+ instr->dest_type = nir_type_uint16;
+ break;
case GLSL_TYPE_INT:
instr->dest_type = nir_type_int;
break;