diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-04-04 08:04:48 +0200 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:26 +0200 |
commit | fc93bc2abde0b54a0a495f9b28a76fd34b47f320 (patch) | |
tree | fc0b0c022604b3e4adfc28864b8c91b58a9b3c06 /src/shader_recompiler/backend | |
parent | shader: Abstract breadth searches and use the abstraction (diff) | |
download | yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.gz yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.bz2 yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.lz yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.xz yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.tar.zst yuzu-fc93bc2abde0b54a0a495f9b28a76fd34b47f320.zip |
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv.h | 1 | ||||
-rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp | 15 |
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); void EmitReturn(EmitContext& ctx); void EmitUnreachable(EmitContext& ctx); void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label); +void EmitBarrier(EmitContext& ctx); void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx); void EmitMemoryBarrierDeviceLevel(EmitContext& ctx); void 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 @@ namespace Shader::Backend::SPIRV { namespace { void EmitMemoryBarrierImpl(EmitContext& ctx, spv::Scope scope) { - const auto semantics = + const auto semantics{ spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | - spv::MemorySemanticsMask::ImageMemory; + spv::MemorySemanticsMask::ImageMemory}; ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)), ctx.Constant(ctx.U32[1], static_cast<u32>(semantics))); } - } // Anonymous namespace +void EmitBarrier(EmitContext& ctx) { + const auto execution{spv::Scope::Workgroup}; + const auto memory{spv::Scope::Workgroup}; + const auto memory_semantics{spv::MemorySemanticsMask::AcquireRelease | + spv::MemorySemanticsMask::WorkgroupMemory}; + ctx.OpControlBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(execution)), + ctx.Constant(ctx.U32[1], static_cast<u32>(memory)), + ctx.Constant(ctx.U32[1], static_cast<u32>(memory_semantics))); +} + void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) { EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup); } |