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.
v2: - Use src/dst bitsize to get the proper conversion opcode. (Jason) --- src/compiler/spirv/vtn_alu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/compiler/spirv/vtn_alu.c b/src/compiler/spirv/vtn_alu.c index 9dcd183a48d..e4b4fb5716f 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: @@ -367,6 +366,18 @@ vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, nir_alu_type dst_type = nir_type_int | dst_bit_size; return nir_type_conversion_op(src_type, dst_type, nir_rounding_mode_undef); } + + case SpvOpUConvert: { + /* SPIR-V expects to interpret the signed value as unsigned and + * not sign extend. Return the opcode accordingly. + */ + unsigned src_bit_size = nir_alu_type_get_type_size(src); + nir_alu_type src_type = nir_type_uint | src_bit_size; + unsigned dst_bit_size = nir_alu_type_get_type_size(dst); + nir_alu_type dst_type = nir_type_uint | dst_bit_size; + return nir_type_conversion_op(src_type, dst_type, 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