summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_add.cpp12
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp20
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_fused_multiply_add.cpp16
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multi_function.cpp6
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_multiply.cpp13
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp20
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/impl.h6
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp23
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp4
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 {
11namespace { 11namespace {
12 12
13void FADD(TranslatorVisitor& v, u64 insn, bool sat, bool cc, bool ftz, FpRounding fp_rounding, 13void 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
37void FADD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { 37void 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
55void TranslatorVisitor::FADD_reg(u64 insn) { 55void TranslatorVisitor::FADD_reg(u64 insn) {
56 FADD(*this, insn, GetReg20(insn)); 56 FADD(*this, insn, GetReg20F(insn));
57} 57}
58 58
59void TranslatorVisitor::FADD_cbuf(u64) { 59void 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
58void TranslateF2I(TranslatorVisitor& v, u64 insn, const IR::U16U32U64& op_a) { 58void 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
10namespace Shader::Maxwell { 10namespace Shader::Maxwell {
11namespace { 11namespace {
12void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& src_c, bool neg_a, 12void 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
37void FFMA(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& src_c) { 37void 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
53void TranslatorVisitor::FFMA_reg(u64 insn) { 53void 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
57void TranslatorVisitor::FFMA_rc(u64) { 57void TranslatorVisitor::FFMA_rc(u64) {
@@ -59,7 +59,7 @@ void TranslatorVisitor::FFMA_rc(u64) {
59} 59}
60 60
61void TranslatorVisitor::FFMA_cr(u64 insn) { 61void 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
65void TranslatorVisitor::FFMA_imm(u64) { 65void 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
46void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, FmzMode fmz_mode, 47void 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
76void FMUL(TranslatorVisitor& v, u64 insn, const IR::U32& src_b) { 77void 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
92void TranslatorVisitor::FMUL_reg(u64 insn) { 93void TranslatorVisitor::FMUL_reg(u64 insn) {
93 return FMUL(*this, insn, GetReg20(insn)); 94 return FMUL(*this, insn, GetReg20F(insn));
94} 95}
95 96
96void TranslatorVisitor::FMUL_cbuf(u64) { 97void 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
15IR::F32 TranslatorVisitor::F(IR::Reg reg) {
16 return ir.BitCast<IR::F32>(X(reg));
17}
18
15void TranslatorVisitor::X(IR::Reg dest_reg, const IR::U32& value) { 19void 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
23void TranslatorVisitor::F(IR::Reg dest_reg, const IR::F32& value) {
24 X(dest_reg, ir.BitCast<IR::U32>(value));
25}
26
19IR::U32 TranslatorVisitor::GetReg20(u64 insn) { 27IR::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
43IR::F32 TranslatorVisitor::GetReg20F(u64 insn) {
44 return ir.BitCast<IR::F32>(GetReg20(insn));
45}
46
47IR::F32 TranslatorVisitor::GetReg39F(u64 insn) {
48 return ir.BitCast<IR::F32>(GetReg39(insn));
49}
50
35IR::U32 TranslatorVisitor::GetCbuf(u64 insn) { 51IR::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
68IR::F32 TranslatorVisitor::GetCbufF(u64 insn) {
69 return ir.BitCast<IR::F32>(GetCbuf(insn));
70}
71
52IR::U32 TranslatorVisitor::GetImm20(u64 insn) { 72IR::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
11namespace Shader::Maxwell { 12namespace Shader::Maxwell {
12namespace { 13namespace {
13enum class InterpolationMode : u64 { 14enum 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
20enum class SampleMode : u64 { 21enum 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 }