summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp15
2 files changed, 13 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index e066ba87d..032b0b2f9 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -28,6 +28,7 @@ void EmitSelectionMerge(EmitContext& ctx, Id merge_label);
28void EmitReturn(EmitContext& ctx); 28void EmitReturn(EmitContext& ctx);
29void EmitUnreachable(EmitContext& ctx); 29void EmitUnreachable(EmitContext& ctx);
30void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label); 30void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label);
31void EmitBarrier(EmitContext& ctx);
31void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx); 32void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx);
32void EmitMemoryBarrierDeviceLevel(EmitContext& ctx); 33void EmitMemoryBarrierDeviceLevel(EmitContext& ctx);
33void EmitMemoryBarrierSystemLevel(EmitContext& ctx); 34void EmitMemoryBarrierSystemLevel(EmitContext& ctx);
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}