summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
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/backend/spirv/emit_spirv_barriers.cpp
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/backend/spirv/emit_spirv_barriers.cpp')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp15
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 @@
8namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
9namespace { 9namespace {
10void EmitMemoryBarrierImpl(EmitContext& ctx, spv::Scope scope) { 10void 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
20void 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
21void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) { 30void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) {
22 EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup); 31 EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup);
23} 32}