On 10/26/2016 03:04 PM, Connor Abbott wrote: > On Tue, Oct 25, 2016 at 8:59 PM, Ian Romanick <i...@freedesktop.org> wrote: >> From: Ian Romanick <ian.d.roman...@intel.com> >> >> The shift operations are a little weird. NIR expects both operands to >> have the same size, but the shift count operand is always 32-bits in >> GLSL. Upconvert to make the rest of NIR happy, and we'll assume the >> driver back-end will do something sensible. > > TBH, that sounds like a mistake I made while doing the initial bringup > of sized types in NIR. It's totally legal for one input to be > explicitly sized while the other is unsized, so there shouldn't be any > problem fixing NIR to behave like GLSL does.
When I did it the "obvious" way, I hit ../../src/compiler/nir/nir_builder.h:208: nir_ssa_def* nir_build_alu(nir_builder*, nir_op, nir_ssa_def*, nir_ssa_def*, nir_ssa_def*, nir_ssa_def*): Assertion `src_bit_size == bit_size' failed. I assumed that this was some fundamental thing about NIR, so I worked around it. It sounds like this might just be a quirk of nir_builder, and that should be easy to fix. I'll poke at it. >> Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> >> --- >> src/compiler/glsl/glsl_to_nir.cpp | 40 >> +++++++++++++++++++++++++++++---------- >> 1 file changed, 30 insertions(+), 10 deletions(-) >> >> diff --git a/src/compiler/glsl/glsl_to_nir.cpp >> b/src/compiler/glsl/glsl_to_nir.cpp >> index b1c8ec6..41c2493 100644 >> --- a/src/compiler/glsl/glsl_to_nir.cpp >> +++ b/src/compiler/glsl/glsl_to_nir.cpp >> @@ -1663,7 +1663,7 @@ nir_visitor::visit(ir_expression *ir) >> case ir_binop_div: >> if (type_is_float(out_type)) >> result = nir_fdiv(&b, srcs[0], srcs[1]); >> - else if (out_type == GLSL_TYPE_INT) >> + else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64) >> result = nir_idiv(&b, srcs[0], srcs[1]); >> else >> result = nir_udiv(&b, srcs[0], srcs[1]); >> @@ -1675,7 +1675,7 @@ nir_visitor::visit(ir_expression *ir) >> case ir_binop_min: >> if (type_is_float(out_type)) >> result = nir_fmin(&b, srcs[0], srcs[1]); >> - else if (out_type == GLSL_TYPE_INT) >> + else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64) >> result = nir_imin(&b, srcs[0], srcs[1]); >> else >> result = nir_umin(&b, srcs[0], srcs[1]); >> @@ -1683,7 +1683,7 @@ nir_visitor::visit(ir_expression *ir) >> case ir_binop_max: >> if (type_is_float(out_type)) >> result = nir_fmax(&b, srcs[0], srcs[1]); >> - else if (out_type == GLSL_TYPE_INT) >> + else if (out_type == GLSL_TYPE_INT || out_type == GLSL_TYPE_INT64) >> result = nir_imax(&b, srcs[0], srcs[1]); >> else >> result = nir_umax(&b, srcs[0], srcs[1]); >> @@ -1704,10 +1704,30 @@ nir_visitor::visit(ir_expression *ir) >> result = supports_ints ? nir_ixor(&b, srcs[0], srcs[1]) >> : nir_fxor(&b, srcs[0], srcs[1]); >> break; >> - case ir_binop_lshift: result = nir_ishl(&b, srcs[0], srcs[1]); break; >> + case ir_binop_lshift: >> + if (out_type == GLSL_TYPE_UINT || out_type == GLSL_TYPE_INT) { >> + result = nir_ishl(&b, srcs[0], srcs[1]); >> + } else { >> + result = nir_ishl(&b, srcs[0], nir_u2u64(&b, srcs[1])); >> + } >> + break; >> case ir_binop_rshift: >> - result = (out_type == GLSL_TYPE_INT) ? nir_ishr(&b, srcs[0], srcs[1]) >> - : nir_ushr(&b, srcs[0], srcs[1]); >> + switch (out_type) { >> + case GLSL_TYPE_UINT: >> + result = nir_ushr(&b, srcs[0], srcs[1]); >> + break; >> + case GLSL_TYPE_INT: >> + result = nir_ishr(&b, srcs[0], srcs[1]); >> + break; >> + case GLSL_TYPE_UINT64: >> + result = nir_ushr(&b, srcs[0], nir_u2u64(&b, srcs[1])); >> + break; >> + case GLSL_TYPE_INT64: >> + result = nir_ishr(&b, srcs[0], nir_u2u64(&b, srcs[1])); >> + break; >> + default: >> + unreachable("invalid ir_binop_rshift result type"); >> + } >> break; >> case ir_binop_imul_high: >> result = (out_type == GLSL_TYPE_INT) ? nir_imul_high(&b, srcs[0], >> srcs[1]) >> @@ -1719,7 +1739,7 @@ nir_visitor::visit(ir_expression *ir) >> if (supports_ints) { >> if (type_is_float(types[0])) >> result = nir_flt(&b, srcs[0], srcs[1]); >> - else if (types[0] == GLSL_TYPE_INT) >> + else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64) >> result = nir_ilt(&b, srcs[0], srcs[1]); >> else >> result = nir_ult(&b, srcs[0], srcs[1]); >> @@ -1731,7 +1751,7 @@ nir_visitor::visit(ir_expression *ir) >> if (supports_ints) { >> if (type_is_float(types[0])) >> result = nir_flt(&b, srcs[1], srcs[0]); >> - else if (types[0] == GLSL_TYPE_INT) >> + else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64) >> result = nir_ilt(&b, srcs[1], srcs[0]); >> else >> result = nir_ult(&b, srcs[1], srcs[0]); >> @@ -1743,7 +1763,7 @@ nir_visitor::visit(ir_expression *ir) >> if (supports_ints) { >> if (type_is_float(types[0])) >> result = nir_fge(&b, srcs[1], srcs[0]); >> - else if (types[0] == GLSL_TYPE_INT) >> + else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64) >> result = nir_ige(&b, srcs[1], srcs[0]); >> else >> result = nir_uge(&b, srcs[1], srcs[0]); >> @@ -1755,7 +1775,7 @@ nir_visitor::visit(ir_expression *ir) >> if (supports_ints) { >> if (type_is_float(types[0])) >> result = nir_fge(&b, srcs[0], srcs[1]); >> - else if (types[0] == GLSL_TYPE_INT) >> + else if (types[0] == GLSL_TYPE_INT || types[0] == GLSL_TYPE_INT64) >> result = nir_ige(&b, srcs[0], srcs[1]); >> else >> result = nir_uge(&b, srcs[0], srcs[1]); >> -- >> 2.5.5 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev