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. > > 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