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 | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp index 18f512319..74f523d0f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp | |||
| @@ -8,16 +8,25 @@ | |||
| 8 | namespace Shader::Backend::SPIRV { | 8 | namespace Shader::Backend::SPIRV { |
| 9 | namespace { | 9 | namespace { |
| 10 | void EmitMemoryBarrierImpl(EmitContext& ctx, spv::Scope scope) { | 10 | void EmitMemoryBarrierImpl(EmitContext& ctx, spv::Scope scope) { |
| 11 | const auto semantics = | 11 | const auto semantics{ |
| 12 | spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | | 12 | spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | |
| 13 | spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | | 13 | spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | |
| 14 | spv::MemorySemanticsMask::ImageMemory; | 14 | spv::MemorySemanticsMask::ImageMemory}; |
| 15 | ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)), | 15 | ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)), |
| 16 | ctx.Constant(ctx.U32[1], static_cast<u32>(semantics))); | 16 | ctx.Constant(ctx.U32[1], static_cast<u32>(semantics))); |
| 17 | } | 17 | } |
| 18 | |||
| 19 | } // Anonymous namespace | 18 | } // Anonymous namespace |
| 20 | 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.Constant(ctx.U32[1], static_cast<u32>(execution)), | ||
| 26 | ctx.Constant(ctx.U32[1], static_cast<u32>(memory)), | ||
| 27 | ctx.Constant(ctx.U32[1], static_cast<u32>(memory_semantics))); | ||
| 28 | } | ||
| 29 | |||
| 21 | void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) { | 30 | void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) { |
| 22 | EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup); | 31 | EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup); |
| 23 | } | 32 | } |