diff options
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
9 files changed, 74 insertions, 46 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp index d2c44b9cc..cb3a326cf 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp | |||
| @@ -11,7 +11,7 @@ namespace Shader::Maxwell { | |||
| 11 | namespace { | 11 | namespace { |
| 12 | 12 | ||
| 13 | void FADD(TranslatorVisitor& v, u64 insn, bool sat, bool cc, bool ftz, FpRounding fp_rounding, | 13 | void FADD(TranslatorVisitor& v, u64 insn, bool sat, bool cc, bool ftz, FpRounding fp_rounding, |
| 14 | const IR::U32& src_b, bool abs_a, bool neg_a, bool abs_b, bool neg_b) { | 14 | const IR::F32& src_b, bool abs_a, bool neg_a, bool abs_b, bool neg_b) { |
| 15 | union { | 15 | union { |
| 16 | u64 raw; | 16 | u64 raw; |
| 17 | BitField<0, 8, IR::Reg> dest_reg; | 17 | BitField<0, 8, IR::Reg> dest_reg; |
| @@ -24,17 +24,17 @@ void FADD(TranslatorVisitor& v, u64 insn, bool sat, bool cc, bool ftz, FpRoundin | |||
| 24 | if (cc) { | 24 | if (cc) { |
| 25 | throw NotImplementedException("FADD CC"); | 25 | throw NotImplementedException("FADD CC"); |
| 26 | } | 26 | } |
| 27 | const IR::U32 op_a{v.ir.FPAbsNeg(v.X(fadd.src_a), abs_a, neg_a)}; | 27 | const IR::F32 op_a{v.ir.FPAbsNeg(v.F(fadd.src_a), abs_a, neg_a)}; |
| 28 | const IR::U32 op_b{v.ir.FPAbsNeg(src_b, abs_b, neg_b)}; | 28 | const IR::F32 op_b{v.ir.FPAbsNeg(src_b, abs_b, neg_b)}; |
| 29 | IR::FpControl control{ | 29 | IR::FpControl control{ |
| 30 | .no_contraction{true}, | 30 | .no_contraction{true}, |
| 31 | .rounding{CastFpRounding(fp_rounding)}, | 31 | .rounding{CastFpRounding(fp_rounding)}, |
| 32 | .fmz_mode{ftz ? IR::FmzMode::FTZ : IR::FmzMode::None}, | 32 | .fmz_mode{ftz ? IR::FmzMode::FTZ : IR::FmzMode::None}, |
| 33 | }; | 33 | }; |
| 34 | v.X(fadd.dest_reg, v.ir.FPAdd(op_a, op_b, control)); | 34 | v.F(fadd.dest_reg, v.ir.FPAdd(op_a, op_b, control)); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | void FADD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { | 37 | void FADD(TranslatorVisitor& v, u64 insn, const IR::F32& src_b) { |
| 38 | union { | 38 | union { |
| 39 | u64 raw; | 39 | u64 raw; |
| 40 | BitField<39, 2, FpRounding> fp_rounding; | 40 | BitField<39, 2, FpRounding> fp_rounding; |
| @@ -53,7 +53,7 @@ void FADD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { | |||
| 53 | } // Anonymous namespace | 53 | } // Anonymous namespace |
| 54 | 54 | ||
| 55 | void TranslatorVisitor::FADD_reg(u64 insn) { | 55 | void TranslatorVisitor::FADD_reg(u64 insn) { |
| 56 | FADD(*this, insn, GetReg20(insn)); | 56 | FADD(*this, insn, GetReg20F(insn)); |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | void TranslatorVisitor::FADD_cbuf(u64) { | 59 | void TranslatorVisitor::FADD_cbuf(u64) { |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp index c4288d9a8..acd8445ad 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp | |||
| @@ -55,21 +55,21 @@ size_t BitSize(DestFormat dest_format) { | |||
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | void TranslateF2I(TranslatorVisitor& v, u64 insn, const IR::U16U32U64& op_a) { | 58 | void TranslateF2I(TranslatorVisitor& v, u64 insn, const IR::F16F32F64& src_a) { |
| 59 | // F2I is used to convert from a floating point value to an integer | 59 | // F2I is used to convert from a floating point value to an integer |
| 60 | const F2I f2i{insn}; | 60 | const F2I f2i{insn}; |
| 61 | 61 | ||
| 62 | const IR::U16U32U64 float_value{v.ir.FPAbsNeg(op_a, f2i.abs != 0, f2i.neg != 0)}; | 62 | const IR::F16F32F64 op_a{v.ir.FPAbsNeg(src_a, f2i.abs != 0, f2i.neg != 0)}; |
| 63 | const IR::U16U32U64 rounded_value{[&] { | 63 | const IR::F16F32F64 rounded_value{[&] { |
| 64 | switch (f2i.rounding) { | 64 | switch (f2i.rounding) { |
| 65 | case Rounding::Round: | 65 | case Rounding::Round: |
| 66 | return v.ir.FPRoundEven(float_value); | 66 | return v.ir.FPRoundEven(op_a); |
| 67 | case Rounding::Floor: | 67 | case Rounding::Floor: |
| 68 | return v.ir.FPFloor(float_value); | 68 | return v.ir.FPFloor(op_a); |
| 69 | case Rounding::Ceil: | 69 | case Rounding::Ceil: |
| 70 | return v.ir.FPCeil(float_value); | 70 | return v.ir.FPCeil(op_a); |
| 71 | case Rounding::Trunc: | 71 | case Rounding::Trunc: |
| 72 | return v.ir.FPTrunc(float_value); | 72 | return v.ir.FPTrunc(op_a); |
| 73 | default: | 73 | default: |
| 74 | throw NotImplementedException("Invalid F2I rounding {}", f2i.rounding.Value()); | 74 | throw NotImplementedException("Invalid F2I rounding {}", f2i.rounding.Value()); |
| 75 | } | 75 | } |
| @@ -105,12 +105,12 @@ void TranslatorVisitor::F2I_reg(u64 insn) { | |||
| 105 | BitField<20, 8, IR::Reg> src_reg; | 105 | BitField<20, 8, IR::Reg> src_reg; |
| 106 | } const f2i{insn}; | 106 | } const f2i{insn}; |
| 107 | 107 | ||
| 108 | const IR::U16U32U64 op_a{[&]() -> IR::U16U32U64 { | 108 | const IR::F16F32F64 op_a{[&]() -> IR::F16F32F64 { |
| 109 | switch (f2i.base.src_format) { | 109 | switch (f2i.base.src_format) { |
| 110 | case SrcFormat::F16: | 110 | case SrcFormat::F16: |
| 111 | return ir.CompositeExtract(ir.UnpackFloat2x16(X(f2i.src_reg)), f2i.base.half); | 111 | return IR::F16{ir.CompositeExtract(ir.UnpackFloat2x16(X(f2i.src_reg)), f2i.base.half)}; |
| 112 | case SrcFormat::F32: | 112 | case SrcFormat::F32: |
| 113 | return X(f2i.src_reg); | 113 | return F(f2i.src_reg); |
| 114 | case SrcFormat::F64: | 114 | case SrcFormat::F64: |
| 115 | return ir.PackDouble2x32(ir.CompositeConstruct(X(f2i.src_reg), X(f2i.src_reg + 1))); | 115 | return ir.PackDouble2x32(ir.CompositeConstruct(X(f2i.src_reg), X(f2i.src_reg + 1))); |
| 116 | default: | 116 | default: |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp index 30ca052ec..1464f2807 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | namespace Shader::Maxwell { | 10 | namespace Shader::Maxwell { |
| 11 | namespace { | 11 | namespace { |
| 12 | void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& src_c, bool neg_a, | 12 | void FFMA(TranslatorVisitor& v, u64 insn, const IR::F32& src_b, const IR::F32& src_c, bool neg_a, |
| 13 | bool neg_b, bool neg_c, bool sat, bool cc, FmzMode fmz_mode, FpRounding fp_rounding) { | 13 | bool neg_b, bool neg_c, bool sat, bool cc, FmzMode fmz_mode, FpRounding fp_rounding) { |
| 14 | union { | 14 | union { |
| 15 | u64 raw; | 15 | u64 raw; |
| @@ -23,18 +23,18 @@ void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s | |||
| 23 | if (cc) { | 23 | if (cc) { |
| 24 | throw NotImplementedException("FFMA CC"); | 24 | throw NotImplementedException("FFMA CC"); |
| 25 | } | 25 | } |
| 26 | const IR::U32 op_a{v.ir.FPAbsNeg(v.X(ffma.src_a), false, neg_a)}; | 26 | const IR::F32 op_a{v.ir.FPAbsNeg(v.F(ffma.src_a), false, neg_a)}; |
| 27 | const IR::U32 op_b{v.ir.FPAbsNeg(src_b, false, neg_b)}; | 27 | const IR::F32 op_b{v.ir.FPAbsNeg(src_b, false, neg_b)}; |
| 28 | const IR::U32 op_c{v.ir.FPAbsNeg(src_c, false, neg_c)}; | 28 | const IR::F32 op_c{v.ir.FPAbsNeg(src_c, false, neg_c)}; |
| 29 | const IR::FpControl fp_control{ | 29 | const IR::FpControl fp_control{ |
| 30 | .no_contraction{true}, | 30 | .no_contraction{true}, |
| 31 | .rounding{CastFpRounding(fp_rounding)}, | 31 | .rounding{CastFpRounding(fp_rounding)}, |
| 32 | .fmz_mode{CastFmzMode(fmz_mode)}, | 32 | .fmz_mode{CastFmzMode(fmz_mode)}, |
| 33 | }; | 33 | }; |
| 34 | v.X(ffma.dest_reg, v.ir.FPFma(op_a, op_b, op_c, fp_control)); | 34 | v.F(ffma.dest_reg, v.ir.FPFma(op_a, op_b, op_c, fp_control)); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& src_c) { | 37 | void FFMA(TranslatorVisitor& v, u64 insn, const IR::F32& src_b, const IR::F32& src_c) { |
| 38 | union { | 38 | union { |
| 39 | u64 raw; | 39 | u64 raw; |
| 40 | BitField<47, 1, u64> cc; | 40 | BitField<47, 1, u64> cc; |
| @@ -51,7 +51,7 @@ void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s | |||
| 51 | } // Anonymous namespace | 51 | } // Anonymous namespace |
| 52 | 52 | ||
| 53 | void TranslatorVisitor::FFMA_reg(u64 insn) { | 53 | void TranslatorVisitor::FFMA_reg(u64 insn) { |
| 54 | FFMA(*this, insn, GetReg20(insn), GetReg39(insn)); | 54 | FFMA(*this, insn, GetReg20F(insn), GetReg39F(insn)); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | void TranslatorVisitor::FFMA_rc(u64) { | 57 | void TranslatorVisitor::FFMA_rc(u64) { |
| @@ -59,7 +59,7 @@ void TranslatorVisitor::FFMA_rc(u64) { | |||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | void TranslatorVisitor::FFMA_cr(u64 insn) { | 61 | void TranslatorVisitor::FFMA_cr(u64 insn) { |
| 62 | FFMA(*this, insn, GetCbuf(insn), GetReg39(insn)); | 62 | FFMA(*this, insn, GetCbufF(insn), GetReg39F(insn)); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | void TranslatorVisitor::FFMA_imm(u64) { | 65 | void TranslatorVisitor::FFMA_imm(u64) { |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp index e2ab0dab2..90cddb18b 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp | |||
| @@ -35,8 +35,8 @@ void TranslatorVisitor::MUFU(u64 insn) { | |||
| 35 | BitField<50, 1, u64> sat; | 35 | BitField<50, 1, u64> sat; |
| 36 | } const mufu{insn}; | 36 | } const mufu{insn}; |
| 37 | 37 | ||
| 38 | const IR::U32 op_a{ir.FPAbsNeg(X(mufu.src_reg), mufu.abs != 0, mufu.neg != 0)}; | 38 | const IR::F32 op_a{ir.FPAbsNeg(F(mufu.src_reg), mufu.abs != 0, mufu.neg != 0)}; |
| 39 | IR::U32 value{[&]() -> IR::U32 { | 39 | IR::F32 value{[&]() -> IR::F32 { |
| 40 | switch (mufu.operation) { | 40 | switch (mufu.operation) { |
| 41 | case Operation::Cos: | 41 | case Operation::Cos: |
| 42 | return ir.FPCosNotReduced(op_a); | 42 | return ir.FPCosNotReduced(op_a); |
| @@ -65,7 +65,7 @@ void TranslatorVisitor::MUFU(u64 insn) { | |||
| 65 | value = ir.FPSaturate(value); | 65 | value = ir.FPSaturate(value); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | X(mufu.dest_reg, value); | 68 | F(mufu.dest_reg, value); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | } // namespace Shader::Maxwell | 71 | } // namespace Shader::Maxwell |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp index 743a1e2f0..1b1d38be7 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #include "common/bit_field.h" | 5 | #include "common/bit_field.h" |
| 6 | #include "common/common_types.h" | 6 | #include "common/common_types.h" |
| 7 | #include "shader_recompiler/frontend/ir/ir_emitter.h" | ||
| 7 | #include "shader_recompiler/frontend/ir/modifiers.h" | 8 | #include "shader_recompiler/frontend/ir/modifiers.h" |
| 8 | #include "shader_recompiler/frontend/maxwell/translate/impl/common_encoding.h" | 9 | #include "shader_recompiler/frontend/maxwell/translate/impl/common_encoding.h" |
| 9 | #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" | 10 | #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" |
| @@ -43,7 +44,7 @@ float ScaleFactor(Scale scale) { | |||
| 43 | throw NotImplementedException("Invalid FMUL scale {}", scale); | 44 | throw NotImplementedException("Invalid FMUL scale {}", scale); |
| 44 | } | 45 | } |
| 45 | 46 | ||
| 46 | void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, FmzMode fmz_mode, | 47 | void FMUL(TranslatorVisitor& v, u64 insn, const IR::F32& src_b, FmzMode fmz_mode, |
| 47 | FpRounding fp_rounding, Scale scale, bool sat, bool cc, bool neg_b) { | 48 | FpRounding fp_rounding, Scale scale, bool sat, bool cc, bool neg_b) { |
| 48 | union { | 49 | union { |
| 49 | u64 raw; | 50 | u64 raw; |
| @@ -57,23 +58,23 @@ void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, FmzMode fmz_mode | |||
| 57 | if (sat) { | 58 | if (sat) { |
| 58 | throw NotImplementedException("FMUL SAT"); | 59 | throw NotImplementedException("FMUL SAT"); |
| 59 | } | 60 | } |
| 60 | IR::U32 op_a{v.X(fmul.src_a)}; | 61 | IR::F32 op_a{v.F(fmul.src_a)}; |
| 61 | if (scale != Scale::None) { | 62 | if (scale != Scale::None) { |
| 62 | if (fmz_mode != FmzMode::FTZ || fp_rounding != FpRounding::RN) { | 63 | if (fmz_mode != FmzMode::FTZ || fp_rounding != FpRounding::RN) { |
| 63 | throw NotImplementedException("FMUL scale with non-FMZ or non-RN modifiers"); | 64 | throw NotImplementedException("FMUL scale with non-FMZ or non-RN modifiers"); |
| 64 | } | 65 | } |
| 65 | op_a = v.ir.FPMul(op_a, v.ir.Imm32(ScaleFactor(scale))); | 66 | op_a = v.ir.FPMul(op_a, v.ir.Imm32(ScaleFactor(scale))); |
| 66 | } | 67 | } |
| 67 | const IR::U32 op_b{v.ir.FPAbsNeg(src_b, false, neg_b)}; | 68 | const IR::F32 op_b{v.ir.FPAbsNeg(src_b, false, neg_b)}; |
| 68 | const IR::FpControl fp_control{ | 69 | const IR::FpControl fp_control{ |
| 69 | .no_contraction{true}, | 70 | .no_contraction{true}, |
| 70 | .rounding{CastFpRounding(fp_rounding)}, | 71 | .rounding{CastFpRounding(fp_rounding)}, |
| 71 | .fmz_mode{CastFmzMode(fmz_mode)}, | 72 | .fmz_mode{CastFmzMode(fmz_mode)}, |
| 72 | }; | 73 | }; |
| 73 | v.X(fmul.dest_reg, v.ir.FPMul(op_a, op_b, fp_control)); | 74 | v.F(fmul.dest_reg, v.ir.FPMul(op_a, op_b, fp_control)); |
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { | 77 | void FMUL(TranslatorVisitor& v, u64 insn, const IR::F32& src_b) { |
| 77 | union { | 78 | union { |
| 78 | u64 raw; | 79 | u64 raw; |
| 79 | BitField<39, 2, FpRounding> fp_rounding; | 80 | BitField<39, 2, FpRounding> fp_rounding; |
| @@ -90,7 +91,7 @@ void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { | |||
| 90 | } // Anonymous namespace | 91 | } // Anonymous namespace |
| 91 | 92 | ||
| 92 | void TranslatorVisitor::FMUL_reg(u64 insn) { | 93 | void TranslatorVisitor::FMUL_reg(u64 insn) { |
| 93 | return FMUL(*this, insn, GetReg20(insn)); | 94 | return FMUL(*this, insn, GetReg20F(insn)); |
| 94 | } | 95 | } |
| 95 | 96 | ||
| 96 | void TranslatorVisitor::FMUL_cbuf(u64) { | 97 | void TranslatorVisitor::FMUL_cbuf(u64) { |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp index 548c7f611..3c9eaddd9 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp | |||
| @@ -12,10 +12,18 @@ IR::U32 TranslatorVisitor::X(IR::Reg reg) { | |||
| 12 | return ir.GetReg(reg); | 12 | return ir.GetReg(reg); |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | IR::F32 TranslatorVisitor::F(IR::Reg reg) { | ||
| 16 | return ir.BitCast<IR::F32>(X(reg)); | ||
| 17 | } | ||
| 18 | |||
| 15 | void TranslatorVisitor::X(IR::Reg dest_reg, const IR::U32& value) { | 19 | void TranslatorVisitor::X(IR::Reg dest_reg, const IR::U32& value) { |
| 16 | ir.SetReg(dest_reg, value); | 20 | ir.SetReg(dest_reg, value); |
| 17 | } | 21 | } |
| 18 | 22 | ||
| 23 | void TranslatorVisitor::F(IR::Reg dest_reg, const IR::F32& value) { | ||
| 24 | X(dest_reg, ir.BitCast<IR::U32>(value)); | ||
| 25 | } | ||
| 26 | |||
| 19 | IR::U32 TranslatorVisitor::GetReg20(u64 insn) { | 27 | IR::U32 TranslatorVisitor::GetReg20(u64 insn) { |
| 20 | union { | 28 | union { |
| 21 | u64 raw; | 29 | u64 raw; |
| @@ -32,6 +40,14 @@ IR::U32 TranslatorVisitor::GetReg39(u64 insn) { | |||
| 32 | return X(reg.index); | 40 | return X(reg.index); |
| 33 | } | 41 | } |
| 34 | 42 | ||
| 43 | IR::F32 TranslatorVisitor::GetReg20F(u64 insn) { | ||
| 44 | return ir.BitCast<IR::F32>(GetReg20(insn)); | ||
| 45 | } | ||
| 46 | |||
| 47 | IR::F32 TranslatorVisitor::GetReg39F(u64 insn) { | ||
| 48 | return ir.BitCast<IR::F32>(GetReg39(insn)); | ||
| 49 | } | ||
| 50 | |||
| 35 | IR::U32 TranslatorVisitor::GetCbuf(u64 insn) { | 51 | IR::U32 TranslatorVisitor::GetCbuf(u64 insn) { |
| 36 | union { | 52 | union { |
| 37 | u64 raw; | 53 | u64 raw; |
| @@ -49,6 +65,10 @@ IR::U32 TranslatorVisitor::GetCbuf(u64 insn) { | |||
| 49 | return ir.GetCbuf(binding, byte_offset); | 65 | return ir.GetCbuf(binding, byte_offset); |
| 50 | } | 66 | } |
| 51 | 67 | ||
| 68 | IR::F32 TranslatorVisitor::GetCbufF(u64 insn) { | ||
| 69 | return ir.BitCast<IR::F32>(GetCbuf(insn)); | ||
| 70 | } | ||
| 71 | |||
| 52 | IR::U32 TranslatorVisitor::GetImm20(u64 insn) { | 72 | IR::U32 TranslatorVisitor::GetImm20(u64 insn) { |
| 53 | union { | 73 | union { |
| 54 | u64 raw; | 74 | u64 raw; |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h index ef6d977fe..b701605d7 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.h | |||
| @@ -296,12 +296,18 @@ public: | |||
| 296 | void XMAD_imm(u64 insn); | 296 | void XMAD_imm(u64 insn); |
| 297 | 297 | ||
| 298 | [[nodiscard]] IR::U32 X(IR::Reg reg); | 298 | [[nodiscard]] IR::U32 X(IR::Reg reg); |
| 299 | [[nodiscard]] IR::F32 F(IR::Reg reg); | ||
| 300 | |||
| 299 | void X(IR::Reg dest_reg, const IR::U32& value); | 301 | void X(IR::Reg dest_reg, const IR::U32& value); |
| 302 | void F(IR::Reg dest_reg, const IR::F32& value); | ||
| 300 | 303 | ||
| 301 | [[nodiscard]] IR::U32 GetReg20(u64 insn); | 304 | [[nodiscard]] IR::U32 GetReg20(u64 insn); |
| 302 | [[nodiscard]] IR::U32 GetReg39(u64 insn); | 305 | [[nodiscard]] IR::U32 GetReg39(u64 insn); |
| 306 | [[nodiscard]] IR::F32 GetReg20F(u64 insn); | ||
| 307 | [[nodiscard]] IR::F32 GetReg39F(u64 insn); | ||
| 303 | 308 | ||
| 304 | [[nodiscard]] IR::U32 GetCbuf(u64 insn); | 309 | [[nodiscard]] IR::U32 GetCbuf(u64 insn); |
| 310 | [[nodiscard]] IR::F32 GetCbufF(u64 insn); | ||
| 305 | 311 | ||
| 306 | [[nodiscard]] IR::U32 GetImm20(u64 insn); | 312 | [[nodiscard]] IR::U32 GetImm20(u64 insn); |
| 307 | 313 | ||
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp index 23512db1a..de65173e8 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp | |||
| @@ -5,22 +5,23 @@ | |||
| 5 | #include "common/bit_field.h" | 5 | #include "common/bit_field.h" |
| 6 | #include "common/common_types.h" | 6 | #include "common/common_types.h" |
| 7 | #include "shader_recompiler/exception.h" | 7 | #include "shader_recompiler/exception.h" |
| 8 | #include "shader_recompiler/frontend/ir/ir_emitter.h" | ||
| 8 | #include "shader_recompiler/frontend/maxwell/opcode.h" | 9 | #include "shader_recompiler/frontend/maxwell/opcode.h" |
| 9 | #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" | 10 | #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" |
| 10 | 11 | ||
| 11 | namespace Shader::Maxwell { | 12 | namespace Shader::Maxwell { |
| 12 | namespace { | 13 | namespace { |
| 13 | enum class InterpolationMode : u64 { | 14 | enum class InterpolationMode : u64 { |
| 14 | Pass = 0, | 15 | Pass, |
| 15 | Multiply = 1, | 16 | Multiply, |
| 16 | Constant = 2, | 17 | Constant, |
| 17 | Sc = 3, | 18 | Sc, |
| 18 | }; | 19 | }; |
| 19 | 20 | ||
| 20 | enum class SampleMode : u64 { | 21 | enum class SampleMode : u64 { |
| 21 | Default = 0, | 22 | Default, |
| 22 | Centroid = 1, | 23 | Centroid, |
| 23 | Offset = 2, | 24 | Offset, |
| 24 | }; | 25 | }; |
| 25 | } // Anonymous namespace | 26 | } // Anonymous namespace |
| 26 | 27 | ||
| @@ -54,12 +55,12 @@ void TranslatorVisitor::IPA(u64 insn) { | |||
| 54 | } | 55 | } |
| 55 | 56 | ||
| 56 | const IR::Attribute attribute{ipa.attribute}; | 57 | const IR::Attribute attribute{ipa.attribute}; |
| 57 | IR::U32 value{ir.GetAttribute(attribute)}; | 58 | IR::F32 value{ir.GetAttribute(attribute)}; |
| 58 | if (IR::IsGeneric(attribute)) { | 59 | if (IR::IsGeneric(attribute)) { |
| 59 | // const bool is_perspective{UnimplementedReadHeader(GenericAttributeIndex(attribute))}; | 60 | // const bool is_perspective{UnimplementedReadHeader(GenericAttributeIndex(attribute))}; |
| 60 | const bool is_perspective{false}; | 61 | const bool is_perspective{false}; |
| 61 | if (is_perspective) { | 62 | if (is_perspective) { |
| 62 | const IR::U32 rcp_position_w{ir.FPRecip(ir.GetAttribute(IR::Attribute::PositionW))}; | 63 | const IR::F32 rcp_position_w{ir.FPRecip(ir.GetAttribute(IR::Attribute::PositionW))}; |
| 63 | value = ir.FPMul(value, rcp_position_w); | 64 | value = ir.FPMul(value, rcp_position_w); |
| 64 | } | 65 | } |
| 65 | } | 66 | } |
| @@ -68,7 +69,7 @@ void TranslatorVisitor::IPA(u64 insn) { | |||
| 68 | case InterpolationMode::Pass: | 69 | case InterpolationMode::Pass: |
| 69 | break; | 70 | break; |
| 70 | case InterpolationMode::Multiply: | 71 | case InterpolationMode::Multiply: |
| 71 | value = ir.FPMul(value, ir.GetReg(ipa.multiplier)); | 72 | value = ir.FPMul(value, F(ipa.multiplier)); |
| 72 | break; | 73 | break; |
| 73 | case InterpolationMode::Constant: | 74 | case InterpolationMode::Constant: |
| 74 | throw NotImplementedException("IPA.CONSTANT"); | 75 | throw NotImplementedException("IPA.CONSTANT"); |
| @@ -86,7 +87,7 @@ void TranslatorVisitor::IPA(u64 insn) { | |||
| 86 | value = ir.FPSaturate(value); | 87 | value = ir.FPSaturate(value); |
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | ir.SetReg(ipa.dest_reg, value); | 90 | F(ipa.dest_reg, value); |
| 90 | } | 91 | } |
| 91 | 92 | ||
| 92 | } // namespace Shader::Maxwell | 93 | } // namespace Shader::Maxwell |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp index c9669c617..9f1570479 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp | |||
| @@ -114,7 +114,7 @@ void TranslatorVisitor::LDG(u64 insn) { | |||
| 114 | } | 114 | } |
| 115 | const IR::Value vector{ir.LoadGlobal64(address)}; | 115 | const IR::Value vector{ir.LoadGlobal64(address)}; |
| 116 | for (int i = 0; i < 2; ++i) { | 116 | for (int i = 0; i < 2; ++i) { |
| 117 | X(dest_reg + i, ir.CompositeExtract(vector, i)); | 117 | X(dest_reg + i, IR::U32{ir.CompositeExtract(vector, i)}); |
| 118 | } | 118 | } |
| 119 | break; | 119 | break; |
| 120 | } | 120 | } |
| @@ -124,7 +124,7 @@ void TranslatorVisitor::LDG(u64 insn) { | |||
| 124 | } | 124 | } |
| 125 | const IR::Value vector{ir.LoadGlobal128(address)}; | 125 | const IR::Value vector{ir.LoadGlobal128(address)}; |
| 126 | for (int i = 0; i < 4; ++i) { | 126 | for (int i = 0; i < 4; ++i) { |
| 127 | X(dest_reg + i, ir.CompositeExtract(vector, i)); | 127 | X(dest_reg + i, IR::U32{ir.CompositeExtract(vector, i)}); |
| 128 | } | 128 | } |
| 129 | break; | 129 | break; |
| 130 | } | 130 | } |