From 0a0818c0259b4f90f1f7bb37fcffbc1f194ca4d0 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Sat, 17 Apr 2021 03:21:03 -0300
Subject: shader: Fix memory barriers

---
 src/shader_recompiler/frontend/ir/ir_emitter.cpp   | 20 +++++----------
 src/shader_recompiler/frontend/ir/ir_emitter.h     |  5 ++--
 .../frontend/ir/microinstruction.cpp               |  5 ++--
 src/shader_recompiler/frontend/ir/modifiers.h      |  8 ------
 src/shader_recompiler/frontend/ir/opcodes.inc      |  5 ++--
 .../maxwell/translate/impl/barrier_operations.cpp  | 30 ++++++++--------------
 6 files changed, 23 insertions(+), 50 deletions(-)

(limited to 'src/shader_recompiler/frontend')

diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index ef3b00bc27..aebe7200f0 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -86,20 +86,12 @@ void IREmitter::Barrier() {
     Inst(Opcode::Barrier);
 }
 
-void IREmitter::MemoryBarrier(MemoryScope scope) {
-    switch (scope) {
-    case MemoryScope::Workgroup:
-        Inst(Opcode::MemoryBarrierWorkgroupLevel);
-        break;
-    case MemoryScope::Device:
-        Inst(Opcode::MemoryBarrierDeviceLevel);
-        break;
-    case MemoryScope::System:
-        Inst(Opcode::MemoryBarrierSystemLevel);
-        break;
-    default:
-        throw InvalidArgument("Invalid memory scope {}", scope);
-    }
+void IREmitter::WorkgroupMemoryBarrier() {
+    Inst(Opcode::WorkgroupMemoryBarrier);
+}
+
+void IREmitter::DeviceMemoryBarrier() {
+    Inst(Opcode::DeviceMemoryBarrier);
 }
 
 void IREmitter::Return() {
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h
index 1a585df154..b9d051b43d 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.h
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.h
@@ -144,8 +144,9 @@ public:
     [[nodiscard]] Value Select(const U1& condition, const Value& true_value,
                                const Value& false_value);
 
-    [[nodiscard]] void Barrier();
-    [[nodiscard]] void MemoryBarrier(MemoryScope scope);
+    void Barrier();
+    void WorkgroupMemoryBarrier();
+    void DeviceMemoryBarrier();
 
     template <typename Dest, typename Source>
     [[nodiscard]] Dest BitCast(const Source& value);
diff --git a/src/shader_recompiler/frontend/ir/microinstruction.cpp b/src/shader_recompiler/frontend/ir/microinstruction.cpp
index b53fe2e2a9..efa4268089 100644
--- a/src/shader_recompiler/frontend/ir/microinstruction.cpp
+++ b/src/shader_recompiler/frontend/ir/microinstruction.cpp
@@ -64,9 +64,8 @@ bool Inst::MayHaveSideEffects() const noexcept {
     case Opcode::Unreachable:
     case Opcode::DemoteToHelperInvocation:
     case Opcode::Barrier:
-    case Opcode::MemoryBarrierWorkgroupLevel:
-    case Opcode::MemoryBarrierDeviceLevel:
-    case Opcode::MemoryBarrierSystemLevel:
+    case Opcode::WorkgroupMemoryBarrier:
+    case Opcode::DeviceMemoryBarrier:
     case Opcode::Prologue:
     case Opcode::Epilogue:
     case Opcode::EmitVertex:
diff --git a/src/shader_recompiler/frontend/ir/modifiers.h b/src/shader_recompiler/frontend/ir/modifiers.h
index 447e9703ca..5d7efa14cc 100644
--- a/src/shader_recompiler/frontend/ir/modifiers.h
+++ b/src/shader_recompiler/frontend/ir/modifiers.h
@@ -25,14 +25,6 @@ enum class FpRounding : u8 {
     RZ,       // Round towards zero
 };
 
-enum class MemoryScope : u32 {
-    DontCare,
-    Warp,
-    Workgroup,
-    Device,
-    System,
-};
-
 struct FpControl {
     bool no_contraction{false};
     FpRounding rounding{FpRounding::DontCare};
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc
index 0748efa8df..1cfc2a9438 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.inc
+++ b/src/shader_recompiler/frontend/ir/opcodes.inc
@@ -18,9 +18,8 @@ OPCODE(DemoteToHelperInvocation,                            Void,           Labe
 
 // Barriers
 OPCODE(Barrier,                                             Void,                                                                                           )
-OPCODE(MemoryBarrierWorkgroupLevel,                         Void,                                                                                           )
-OPCODE(MemoryBarrierDeviceLevel,                            Void,                                                                                           )
-OPCODE(MemoryBarrierSystemLevel,                            Void,                                                                                           )
+OPCODE(WorkgroupMemoryBarrier,                              Void,                                                                                           )
+OPCODE(DeviceMemoryBarrier,                                 Void,                                                                                           )
 
 // Special operations
 OPCODE(Prologue,                                            Void,                                                                                           )
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 2a2a294dfa..86e433e415 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
@@ -12,34 +12,24 @@ namespace Shader::Maxwell {
 namespace {
 // Seems to be in CUDA terminology.
 enum class LocalScope : u64 {
-    CTG = 0,
-    GL = 1,
-    SYS = 2,
-    VC = 3,
+    CTA,
+    GL,
+    SYS,
+    VC,
 };
-
-IR::MemoryScope LocalScopeToMemoryScope(LocalScope scope) {
-    switch (scope) {
-    case LocalScope::CTG:
-        return IR::MemoryScope::Workgroup;
-    case LocalScope::GL:
-        return IR::MemoryScope::Device;
-    case LocalScope::SYS:
-        return IR::MemoryScope::System;
-    default:
-        throw NotImplementedException("Unimplemented Local Scope {}", scope);
-    }
-}
-
 } // Anonymous namespace
 
 void TranslatorVisitor::MEMBAR(u64 inst) {
     union {
         u64 raw;
         BitField<8, 2, LocalScope> scope;
-    } membar{inst};
+    } const membar{inst};
 
-    ir.MemoryBarrier(LocalScopeToMemoryScope(membar.scope));
+    if (membar.scope == LocalScope::CTA) {
+        ir.WorkgroupMemoryBarrier();
+    } else {
+        ir.DeviceMemoryBarrier();
+    }
 }
 
 void TranslatorVisitor::DEPBAR() {
-- 
cgit v1.2.3-70-g09d2