summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-04-04 03:04:48 -0300
committerGravatar ameerj2021-07-22 21:51:26 -0400
commitfc93bc2abde0b54a0a495f9b28a76fd34b47f320 (patch)
treefc0b0c022604b3e4adfc28864b8c91b58a9b3c06 /src/shader_recompiler/frontend/maxwell
parentshader: Abstract breadth searches and use the abstraction (diff)
downloadyuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.gz
yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.xz
yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.zip
shader: Implement BAR and fix memory barriers
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp58
1 files changed, 56 insertions, 2 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
index 26d5e276b..2a2a294df 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
@@ -38,6 +38,7 @@ void TranslatorVisitor::MEMBAR(u64 inst) {
38 u64 raw; 38 u64 raw;
39 BitField<8, 2, LocalScope> scope; 39 BitField<8, 2, LocalScope> scope;
40 } membar{inst}; 40 } membar{inst};
41
41 ir.MemoryBarrier(LocalScopeToMemoryScope(membar.scope)); 42 ir.MemoryBarrier(LocalScopeToMemoryScope(membar.scope));
42} 43}
43 44
@@ -45,8 +46,61 @@ void TranslatorVisitor::DEPBAR() {
45 // DEPBAR is a no-op 46 // DEPBAR is a no-op
46} 47}
47 48
48void TranslatorVisitor::BAR(u64) { 49void TranslatorVisitor::BAR(u64 insn) {
49 throw NotImplementedException("Instruction {} is not implemented", Opcode::BAR); 50 enum class Mode {
51 RedPopc,
52 Scan,
53 RedAnd,
54 RedOr,
55 Sync,
56 Arrive,
57 };
58 union {
59 u64 raw;
60 BitField<43, 1, u64> is_a_imm;
61 BitField<44, 1, u64> is_b_imm;
62 BitField<8, 8, u64> imm_a;
63 BitField<20, 12, u64> imm_b;
64 BitField<42, 1, u64> neg_pred;
65 BitField<39, 3, IR::Pred> pred;
66 } const bar{insn};
67
68 const Mode mode{[insn] {
69 switch (insn & 0x0000009B00000000ULL) {
70 case 0x0000000200000000ULL:
71 return Mode::RedPopc;
72 case 0x0000000300000000ULL:
73 return Mode::Scan;
74 case 0x0000000A00000000ULL:
75 return Mode::RedAnd;
76 case 0x0000001200000000ULL:
77 return Mode::RedOr;
78 case 0x0000008000000000ULL:
79 return Mode::Sync;
80 case 0x0000008100000000ULL:
81 return Mode::Arrive;
82 }
83 throw NotImplementedException("Invalid encoding");
84 }()};
85 if (mode != Mode::Sync) {
86 throw NotImplementedException("BAR mode {}", mode);
87 }
88 if (bar.is_a_imm == 0) {
89 throw NotImplementedException("Non-immediate input A");
90 }
91 if (bar.imm_a != 0) {
92 throw NotImplementedException("Non-zero input A");
93 }
94 if (bar.is_b_imm == 0) {
95 throw NotImplementedException("Non-immediate input B");
96 }
97 if (bar.imm_b != 0) {
98 throw NotImplementedException("Non-zero input B");
99 }
100 if (bar.pred != IR::Pred::PT && bar.neg_pred != 0) {
101 throw NotImplementedException("Non-true input predicate");
102 }
103 ir.Barrier();
50} 104}
51 105
52} // namespace Shader::Maxwell 106} // namespace Shader::Maxwell