summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
diff options
context:
space:
mode:
authorGravatar FernandoS272021-04-03 01:48:39 +0200
committerGravatar ameerj2021-07-22 21:51:26 -0400
commitbaec84247fe815199595d9e8077b71f3b5c8317e (patch)
tree84195625ffb43922ba87b25296057bdeb9f22a2c /src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
parentshader: Implement SR_LaneId (diff)
downloadyuzu-baec84247fe815199595d9e8077b71f3b5c8317e.tar.gz
yuzu-baec84247fe815199595d9e8077b71f3b5c8317e.tar.xz
yuzu-baec84247fe815199595d9e8077b71f3b5c8317e.zip
shader: Address Feedback
Diffstat (limited to 'src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp37
1 files changed, 15 insertions, 22 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
index 413ac25a0..18f512319 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
@@ -7,34 +7,27 @@
7 7
8namespace Shader::Backend::SPIRV { 8namespace Shader::Backend::SPIRV {
9namespace { 9namespace {
10spv::Scope MemoryScopeToSpirVScope(IR::MemoryScope scope) { 10void EmitMemoryBarrierImpl(EmitContext& ctx, spv::Scope scope) {
11 switch (scope) {
12 case IR::MemoryScope::Warp:
13 return spv::Scope::Subgroup;
14 case IR::MemoryScope::Workgroup:
15 return spv::Scope::Workgroup;
16 case IR::MemoryScope::Device:
17 return spv::Scope::Device;
18 case IR::MemoryScope::System:
19 return spv::Scope::CrossDevice;
20 case IR::MemoryScope::DontCare:
21 return spv::Scope::Invocation;
22 default:
23 throw NotImplementedException("Unknown memory scope!");
24 }
25}
26
27} // namespace
28
29void EmitMemoryBarrier(EmitContext& ctx, IR::Inst* inst) {
30 const auto info{inst->Flags<IR::BarrierInstInfo>()};
31 const auto semantics = 11 const auto semantics =
32 spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | 12 spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory |
33 spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | 13 spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory |
34 spv::MemorySemanticsMask::ImageMemory; 14 spv::MemorySemanticsMask::ImageMemory;
35 const auto scope = MemoryScopeToSpirVScope(info.scope);
36 ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)), 15 ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)),
37 ctx.Constant(ctx.U32[1], static_cast<u32>(semantics))); 16 ctx.Constant(ctx.U32[1], static_cast<u32>(semantics)));
38} 17}
39 18
19} // Anonymous namespace
20
21void EmitMemoryBarrierWorkgroupLevel(EmitContext& ctx) {
22 EmitMemoryBarrierImpl(ctx, spv::Scope::Workgroup);
23}
24
25void EmitMemoryBarrierDeviceLevel(EmitContext& ctx) {
26 EmitMemoryBarrierImpl(ctx, spv::Scope::Device);
27}
28
29void EmitMemoryBarrierSystemLevel(EmitContext& ctx) {
30 EmitMemoryBarrierImpl(ctx, spv::Scope::CrossDevice);
31}
32
40} // namespace Shader::Backend::SPIRV 33} // namespace Shader::Backend::SPIRV