diff options
Diffstat (limited to 'src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp new file mode 100644 index 000000000..e0b52a001 --- /dev/null +++ b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | // Copyright 2021 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "shader_recompiler/backend/spirv/emit_spirv.h" | ||
| 6 | #include "shader_recompiler/backend/spirv/emit_spirv_instructions.h" | ||
| 7 | #include "shader_recompiler/frontend/ir/modifiers.h" | ||
| 8 | |||
| 9 | namespace Shader::Backend::SPIRV { | ||
| 10 | namespace { | ||
| 11 | void MemoryBarrier(EmitContext& ctx, spv::Scope scope) { | ||
| 12 | const auto semantics{ | ||
| 13 | spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | | ||
| 14 | spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | | ||
| 15 | spv::MemorySemanticsMask::ImageMemory}; | ||
| 16 | ctx.OpMemoryBarrier(ctx.Const(static_cast<u32>(scope)), ctx.Const(static_cast<u32>(semantics))); | ||
| 17 | } | ||
| 18 | } // Anonymous namespace | ||
| 19 | |||
| 20 | void EmitBarrier(EmitContext& ctx) { | ||
| 21 | const auto execution{spv::Scope::Workgroup}; | ||
| 22 | const auto memory{spv::Scope::Workgroup}; | ||
| 23 | const auto memory_semantics{spv::MemorySemanticsMask::AcquireRelease | | ||
| 24 | spv::MemorySemanticsMask::WorkgroupMemory}; | ||
| 25 | ctx.OpControlBarrier(ctx.Const(static_cast<u32>(execution)), | ||
| 26 | ctx.Const(static_cast<u32>(memory)), | ||
| 27 | ctx.Const(static_cast<u32>(memory_semantics))); | ||
| 28 | } | ||
| 29 | |||
| 30 | void EmitWorkgroupMemoryBarrier(EmitContext& ctx) { | ||
| 31 | MemoryBarrier(ctx, spv::Scope::Workgroup); | ||
| 32 | } | ||
| 33 | |||
| 34 | void EmitDeviceMemoryBarrier(EmitContext& ctx) { | ||
| 35 | MemoryBarrier(ctx, spv::Scope::Device); | ||
| 36 | } | ||
| 37 | |||
| 38 | } // namespace Shader::Backend::SPIRV | ||