diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index dee2d320f03..3bc4aaf0e08 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -1159,7 +1159,7 @@ impl<'a> ShaderFromNir<'a> { } dst } - nir_op_fmul => { + nir_op_fmul | nir_op_fmul_rtz => { let ftype = FloatType::from_bits(alu.def.bit_size().into()); let dst; if alu.def.bit_size() == 64 { @@ -1176,7 +1176,11 @@ impl<'a> ShaderFromNir<'a> { dst: dst.clone().into(), srcs: [srcs(0), srcs(1)], saturate: self.try_saturate_alu_dst(&alu.def), - rnd_mode: self.float_ctl[ftype].rnd_mode, + rnd_mode: if alu.op == nir_op_fmul_rtz { + FRndMode::Zero + } else { + self.float_ctl[ftype].rnd_mode + }, ftz: self.float_ctl[ftype].ftz, dnz: false, }); diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index 1f2e02e4805..9c129859c63 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -115,6 +115,7 @@ vectorize_filter_cb(const nir_instr *instr, const void *data) case nir_op_flt: case nir_op_fneu: case nir_op_fmul: + case nir_op_fmul_rtz: case nir_op_ffma: case nir_op_fsign: case nir_op_fsat: @@ -266,6 +267,7 @@ lower_bit_size_cb(const nir_instr *instr, void *data) case nir_op_flt: case nir_op_fneu: case nir_op_fmul: + case nir_op_fmul_rtz: case nir_op_ffma: case nir_op_ffmaz: case nir_op_fsign: