diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index a6dab2055d8..d1ad296fe62 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1358,7 +1358,7 @@ intrinsic("cmat_load", src_comp=[-1, -1, 1], indices=[MATRIX_LAYOUT]) intrinsic("cmat_store", src_comp=[-1, -1, 1], indices=[MATRIX_LAYOUT]) intrinsic("cmat_length", src_comp=[], dest_comp=1, indices=[CMAT_DESC], bit_sizes=[32]) intrinsic("cmat_muladd", src_comp=[-1, -1, -1, -1], indices=[SATURATE, CMAT_SIGNED_MASK]) -intrinsic("cmat_convert", src_comp=[-1, -1], indices=[CMAT_SIGNED_MASK]) +intrinsic("cmat_convert", src_comp=[-1, -1], indices=[SATURATE, CMAT_SIGNED_MASK]) intrinsic("cmat_unary_op", src_comp=[-1, -1], indices=[ALU_OP]) intrinsic("cmat_binary_op", src_comp=[-1, -1, -1], indices=[ALU_OP]) intrinsic("cmat_scalar_op", src_comp=[-1, -1, -1], indices=[ALU_OP]) diff --git a/src/compiler/spirv/vtn_cmat.c b/src/compiler/spirv/vtn_cmat.c index 746c58e2eea..e43557d9f96 100644 --- a/src/compiler/spirv/vtn_cmat.c +++ b/src/compiler/spirv/vtn_cmat.c @@ -201,6 +201,7 @@ vtn_handle_cooperative_alu(struct vtn_builder *b, struct vtn_value *dest_val, case SpvOpFConvert: { struct vtn_type *dst_type = vtn_get_type(b, w[1]); nir_deref_instr *src = vtn_get_cmat_deref(b, w[3]); + struct vtn_value *dest_val = vtn_untyped_value(b, w[2]); /* The Convert operations define whether integers are interpreted * as signed or unsigned regardless of their original type. So take @@ -210,9 +211,10 @@ vtn_handle_cooperative_alu(struct vtn_builder *b, struct vtn_value *dest_val, (vtn_convert_op_src_type(opcode) == nir_type_int ? NIR_CMAT_A_SIGNED : 0) | (vtn_convert_op_dst_type(opcode) == nir_type_int ? NIR_CMAT_RESULT_SIGNED : 0); + const bool saturate = vtn_has_decoration(b, dest_val, SpvDecorationSaturatedToLargestFloat8NormalConversionEXT); nir_deref_instr *dst = vtn_create_cmat_temporary(b, dst_type->type, "cmat_convert"); - nir_cmat_convert(&b->nb, &dst->def, &src->def, .cmat_signed_mask = signed_mask); + nir_cmat_convert(&b->nb, &dst->def, &src->def, .saturate = saturate, .cmat_signed_mask = signed_mask); vtn_push_var_ssa(b, w[2], dst->var); break;