radv/nir/lower_cmat: handle float8 conversions

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35434>
This commit is contained in:
Georg Lehmann
2025-04-09 17:48:51 +02:00
committed by Marge Bot
parent c7a6b3318e
commit cbd17cb4d6
@@ -167,17 +167,35 @@ radv_get_base_row(nir_builder *b, struct glsl_cmat_description desc, const lower
}
static nir_def *
convert_base_type(nir_builder *b, nir_def *src, enum glsl_base_type src_type, enum glsl_base_type dst_type)
convert_base_type(nir_builder *b, nir_def *src, enum glsl_base_type src_type, enum glsl_base_type dst_type, bool sat)
{
if (dst_type == src_type)
return src;
if (src_type == GLSL_TYPE_BFLOAT16) {
src = nir_bf2f(b, src);
return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type);
return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat);
} else if (dst_type == GLSL_TYPE_BFLOAT16) {
src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT);
src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat);
return nir_f2bf(b, src);
} else if (src_type == GLSL_TYPE_FLOAT_E4M3FN) {
src = nir_e4m3fn2f(b, src);
return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat);
} else if (dst_type == GLSL_TYPE_FLOAT_E4M3FN) {
src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat);
if (sat)
return nir_f2e4m3fn_sat(b, src);
else
return nir_f2e4m3fn(b, src);
} else if (src_type == GLSL_TYPE_FLOAT_E5M2) {
src = nir_e5m22f(b, src);
return convert_base_type(b, src, GLSL_TYPE_FLOAT, dst_type, sat);
} else if (dst_type == GLSL_TYPE_FLOAT_E5M2) {
src = convert_base_type(b, src, src_type, GLSL_TYPE_FLOAT, sat);
if (sat)
return nir_f2e5m2_sat(b, src);
else
return nir_f2e5m2(b, src);
}
nir_op op = nir_type_conversion_op(nir_get_nir_type_for_glsl_base_type(src_type),
@@ -451,6 +469,7 @@ radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_lev
nir_def *src = radv_nir_load_cmat(&b, &params, intr->src[1].ssa);
const nir_cmat_signed cmat_signed_mask = nir_intrinsic_cmat_signed_mask(intr);
const bool sat = nir_intrinsic_saturate(intr);
enum glsl_base_type dst_element_type = glsl_apply_signedness_to_base_type(
dst_desc.element_type, cmat_signed_mask & NIR_CMAT_RESULT_SIGNED);
@@ -469,7 +488,7 @@ radv_nir_lower_cooperative_matrix(nir_shader *shader, enum amd_gfx_level gfx_lev
src = nir_vec(&b, components, src->num_components / scale);
}
nir_def *ret = convert_base_type(&b, src, src_element_type, dst_element_type);
nir_def *ret = convert_base_type(&b, src, src_element_type, dst_element_type, sat);
if (dst_mul > src_mul) {
nir_def *components[NIR_MAX_VEC_COMPONENTS];