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:
@@ -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, ¶ms, 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];
|
||||
|
||||
Reference in New Issue
Block a user