diff options
| author | 2021-04-17 03:21:03 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:28 -0400 | |
| commit | 0a0818c0259b4f90f1f7bb37fcffbc1f194ca4d0 (patch) | |
| tree | 809cb00a8188a76cb5585379d9982d9e52fcd0e6 /src/shader_recompiler/frontend | |
| parent | spirv: Fix implicit lod type (diff) | |
| download | yuzu-0a0818c0259b4f90f1f7bb37fcffbc1f194ca4d0.tar.gz yuzu-0a0818c0259b4f90f1f7bb37fcffbc1f194ca4d0.tar.xz yuzu-0a0818c0259b4f90f1f7bb37fcffbc1f194ca4d0.zip | |
shader: Fix memory barriers
Diffstat (limited to 'src/shader_recompiler/frontend')
6 files changed, 23 insertions, 50 deletions
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index ef3b00bc2..aebe7200f 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() { | |||
| 86 | Inst(Opcode::Barrier); | 86 | Inst(Opcode::Barrier); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | void IREmitter::MemoryBarrier(MemoryScope scope) { | 89 | void IREmitter::WorkgroupMemoryBarrier() { |
| 90 | switch (scope) { | 90 | Inst(Opcode::WorkgroupMemoryBarrier); |
| 91 | case MemoryScope::Workgroup: | 91 | } |
| 92 | Inst(Opcode::MemoryBarrierWorkgroupLevel); | 92 | |
| 93 | break; | 93 | void IREmitter::DeviceMemoryBarrier() { |
| 94 | case MemoryScope::Device: | 94 | Inst(Opcode::DeviceMemoryBarrier); |
| 95 | Inst(Opcode::MemoryBarrierDeviceLevel); | ||
| 96 | break; | ||
| 97 | case MemoryScope::System: | ||
| 98 | Inst(Opcode::MemoryBarrierSystemLevel); | ||
| 99 | break; | ||
| 100 | default: | ||
| 101 | throw InvalidArgument("Invalid memory scope {}", scope); | ||
| 102 | } | ||
| 103 | } | 95 | } |
| 104 | 96 | ||
| 105 | void IREmitter::Return() { | 97 | void IREmitter::Return() { |
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h index 1a585df15..b9d051b43 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.h +++ b/src/shader_recompiler/frontend/ir/ir_emitter.h | |||
| @@ -144,8 +144,9 @@ public: | |||
| 144 | [[nodiscard]] Value Select(const U1& condition, const Value& true_value, | 144 | [[nodiscard]] Value Select(const U1& condition, const Value& true_value, |
| 145 | const Value& false_value); | 145 | const Value& false_value); |
| 146 | 146 | ||
| 147 | [[nodiscard]] void Barrier(); | 147 | void Barrier(); |
| 148 | [[nodiscard]] void MemoryBarrier(MemoryScope scope); | 148 | void WorkgroupMemoryBarrier(); |
| 149 | void DeviceMemoryBarrier(); | ||
| 149 | 150 | ||
| 150 | template <typename Dest, typename Source> | 151 | template <typename Dest, typename Source> |
| 151 | [[nodiscard]] Dest BitCast(const Source& value); | 152 | [[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 b53fe2e2a..efa426808 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 { | |||
| 64 | case Opcode::Unreachable: | 64 | case Opcode::Unreachable: |
| 65 | case Opcode::DemoteToHelperInvocation: | 65 | case Opcode::DemoteToHelperInvocation: |
| 66 | case Opcode::Barrier: | 66 | case Opcode::Barrier: |
| 67 | case Opcode::MemoryBarrierWorkgroupLevel: | 67 | case Opcode::WorkgroupMemoryBarrier: |
| 68 | case Opcode::MemoryBarrierDeviceLevel: | 68 | case Opcode::DeviceMemoryBarrier: |
| 69 | case Opcode::MemoryBarrierSystemLevel: | ||
| 70 | case Opcode::Prologue: | 69 | case Opcode::Prologue: |
| 71 | case Opcode::Epilogue: | 70 | case Opcode::Epilogue: |
| 72 | case Opcode::EmitVertex: | 71 | case Opcode::EmitVertex: |
diff --git a/src/shader_recompiler/frontend/ir/modifiers.h b/src/shader_recompiler/frontend/ir/modifiers.h index 447e9703c..5d7efa14c 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 { | |||
| 25 | RZ, // Round towards zero | 25 | RZ, // Round towards zero |
| 26 | }; | 26 | }; |
| 27 | 27 | ||
| 28 | enum class MemoryScope : u32 { | ||
| 29 | DontCare, | ||
| 30 | Warp, | ||
| 31 | Workgroup, | ||
| 32 | Device, | ||
| 33 | System, | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct FpControl { | 28 | struct FpControl { |
| 37 | bool no_contraction{false}; | 29 | bool no_contraction{false}; |
| 38 | FpRounding rounding{FpRounding::DontCare}; | 30 | FpRounding rounding{FpRounding::DontCare}; |
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc index 0748efa8d..1cfc2a943 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 | |||
| 18 | 18 | ||
| 19 | // Barriers | 19 | // Barriers |
| 20 | OPCODE(Barrier, Void, ) | 20 | OPCODE(Barrier, Void, ) |
| 21 | OPCODE(MemoryBarrierWorkgroupLevel, Void, ) | 21 | OPCODE(WorkgroupMemoryBarrier, Void, ) |
| 22 | OPCODE(MemoryBarrierDeviceLevel, Void, ) | 22 | OPCODE(DeviceMemoryBarrier, Void, ) |
| 23 | OPCODE(MemoryBarrierSystemLevel, Void, ) | ||
| 24 | 23 | ||
| 25 | // Special operations | 24 | // Special operations |
| 26 | OPCODE(Prologue, Void, ) | 25 | 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 2a2a294df..86e433e41 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 { | |||
| 12 | namespace { | 12 | namespace { |
| 13 | // Seems to be in CUDA terminology. | 13 | // Seems to be in CUDA terminology. |
| 14 | enum class LocalScope : u64 { | 14 | enum class LocalScope : u64 { |
| 15 | CTG = 0, | 15 | CTA, |
| 16 | GL = 1, | 16 | GL, |
| 17 | SYS = 2, | 17 | SYS, |
| 18 | VC = 3, | 18 | VC, |
| 19 | }; | 19 | }; |
| 20 | |||
| 21 | IR::MemoryScope LocalScopeToMemoryScope(LocalScope scope) { | ||
| 22 | switch (scope) { | ||
| 23 | case LocalScope::CTG: | ||
| 24 | return IR::MemoryScope::Workgroup; | ||
| 25 | case LocalScope::GL: | ||
| 26 | return IR::MemoryScope::Device; | ||
| 27 | case LocalScope::SYS: | ||
| 28 | return IR::MemoryScope::System; | ||
| 29 | default: | ||
| 30 | throw NotImplementedException("Unimplemented Local Scope {}", scope); | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 34 | } // Anonymous namespace | 20 | } // Anonymous namespace |
| 35 | 21 | ||
| 36 | void TranslatorVisitor::MEMBAR(u64 inst) { | 22 | void TranslatorVisitor::MEMBAR(u64 inst) { |
| 37 | union { | 23 | union { |
| 38 | u64 raw; | 24 | u64 raw; |
| 39 | BitField<8, 2, LocalScope> scope; | 25 | BitField<8, 2, LocalScope> scope; |
| 40 | } membar{inst}; | 26 | } const membar{inst}; |
| 41 | 27 | ||
| 42 | ir.MemoryBarrier(LocalScopeToMemoryScope(membar.scope)); | 28 | if (membar.scope == LocalScope::CTA) { |
| 29 | ir.WorkgroupMemoryBarrier(); | ||
| 30 | } else { | ||
| 31 | ir.DeviceMemoryBarrier(); | ||
| 32 | } | ||
| 43 | } | 33 | } |
| 44 | 34 | ||
| 45 | void TranslatorVisitor::DEPBAR() { | 35 | void TranslatorVisitor::DEPBAR() { |