From: Iago Toral Quiroga <ito...@igalia.com> In this case we don't want to do sign-extension, since the value is interpreted as unsigned. If we want sign-extension, OpSConvert should be used. --- src/compiler/spirv/vtn_alu.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/compiler/spirv/vtn_alu.c b/src/compiler/spirv/vtn_alu.c index a5cefc35773..0b279fe7e54 100644 --- a/src/compiler/spirv/vtn_alu.c +++ b/src/compiler/spirv/vtn_alu.c @@ -349,7 +349,6 @@ vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, /* Conversions: */ case SpvOpQuantizeToF16: return nir_op_fquantize2f16; - case SpvOpUConvert: case SpvOpConvertFToU: case SpvOpConvertFToS: case SpvOpConvertSToF: @@ -374,6 +373,25 @@ vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, } return nir_type_conversion_op(src, dst, nir_rounding_mode_undef); } + + case SpvOpUConvert: { + nir_alu_type src_base = (nir_alu_type) nir_alu_type_get_base_type(src); + if (src_base == nir_type_int) { + /* SPIR-V expects to interpret the signed value as unsigned and + * not sign extend. Return the opcode accordingly. + */ + unsigned dst_bit_size = nir_alu_type_get_type_size(dst); + switch (dst_bit_size) { + case 16: return nir_op_u2u16; + case 32: return nir_op_u2u32; + case 64: return nir_op_u2u64; + default: + vtn_fail("Invalid nir alu bit size"); + } + } + return nir_type_conversion_op(src, dst, nir_rounding_mode_undef); + } + /* Derivatives: */ case SpvOpDPdx: return nir_op_fddx; case SpvOpDPdy: return nir_op_fddy; -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev