committed by
ameerj
9 changed files with 121 additions and 11 deletions
-
2src/shader_recompiler/CMakeLists.txt
-
1src/shader_recompiler/backend/spirv/emit_spirv.h
-
40src/shader_recompiler/backend/spirv/emit_spirv_barriers.cpp
-
4src/shader_recompiler/frontend/ir/ir_emitter.cpp
-
2src/shader_recompiler/frontend/ir/ir_emitter.h
-
13src/shader_recompiler/frontend/ir/modifiers.h
-
3src/shader_recompiler/frontend/ir/opcodes.inc
-
56src/shader_recompiler/frontend/maxwell/translate/impl/barrier_operations.cpp
-
11src/shader_recompiler/frontend/maxwell/translate/impl/not_implemented.cpp
@ -0,0 +1,40 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "shader_recompiler/backend/spirv/emit_spirv.h"
|
|||
#include "shader_recompiler/frontend/ir/modifiers.h"
|
|||
|
|||
namespace Shader::Backend::SPIRV { |
|||
namespace { |
|||
spv::Scope MemoryScopeToSpirVScope(IR::MemoryScope scope) { |
|||
switch (scope) { |
|||
case IR::MemoryScope::Warp: |
|||
return spv::Scope::Subgroup; |
|||
case IR::MemoryScope::Workgroup: |
|||
return spv::Scope::Workgroup; |
|||
case IR::MemoryScope::Device: |
|||
return spv::Scope::Device; |
|||
case IR::MemoryScope::System: |
|||
return spv::Scope::CrossDevice; |
|||
case IR::MemoryScope::DontCare: |
|||
return spv::Scope::Invocation; |
|||
default: |
|||
throw NotImplementedException("Unknown memory scope!"); |
|||
} |
|||
} |
|||
|
|||
} // namespace
|
|||
|
|||
void EmitMemoryBarrier(EmitContext& ctx, IR::Inst* inst) { |
|||
const auto info{inst->Flags<IR::BarrierInstInfo>()}; |
|||
const auto semantics = |
|||
spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | |
|||
spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AtomicCounterMemory | |
|||
spv::MemorySemanticsMask::ImageMemory; |
|||
const auto scope = MemoryScopeToSpirVScope(info.scope); |
|||
ctx.OpMemoryBarrier(ctx.Constant(ctx.U32[1], static_cast<u32>(scope)), |
|||
ctx.Constant(ctx.U32[1], static_cast<u32>(semantics))); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::SPIRV
|
|||
@ -0,0 +1,56 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/bit_field.h"
|
|||
#include "common/common_types.h"
|
|||
#include "shader_recompiler/frontend/ir/modifiers.h"
|
|||
#include "shader_recompiler/frontend/maxwell/translate/impl/impl.h"
|
|||
#include "shader_recompiler/frontend/maxwell/opcodes.h"
|
|||
|
|||
namespace Shader::Maxwell { |
|||
namespace { |
|||
// Seems to be in CUDA terminology.
|
|||
enum class LocalScope : u64 { |
|||
CTG = 0, |
|||
GL = 1, |
|||
SYS = 2, |
|||
VC = 3, |
|||
}; |
|||
|
|||
IR::MemoryScope LocalScopeToMemoryScope(LocalScope scope) { |
|||
switch (scope) { |
|||
case LocalScope::CTG: |
|||
return IR::MemoryScope::Warp; |
|||
case LocalScope::GL: |
|||
return IR::MemoryScope::Device; |
|||
case LocalScope::SYS: |
|||
return IR::MemoryScope::System; |
|||
case LocalScope::VC: |
|||
return IR::MemoryScope::Workgroup; // or should be device?
|
|||
default: |
|||
throw NotImplementedException("Unimplemented Local Scope {}", scope); |
|||
} |
|||
} |
|||
|
|||
} // namespace
|
|||
|
|||
void TranslatorVisitor::MEMBAR(u64 inst) { |
|||
union { |
|||
u64 raw; |
|||
BitField<8, 2, LocalScope> scope; |
|||
} membar{inst}; |
|||
IR::BarrierInstInfo info{}; |
|||
info.scope.Assign(LocalScopeToMemoryScope(membar.scope)); |
|||
ir.MemoryBarrier(info); |
|||
} |
|||
|
|||
void TranslatorVisitor::DEPBAR() { |
|||
// DEPBAR is a no-op
|
|||
} |
|||
|
|||
void TranslatorVisitor::BAR(u64) { |
|||
throw NotImplementedException("Instruction {} is not implemented", Opcode::BAR); |
|||
} |
|||
|
|||
} // namespace Shader::Maxwell
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue