summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-05-15 02:52:35 -0300
committerGravatar ReinUsesLisp2020-05-27 00:19:45 -0300
commit32e6727daecab60d368d14619c1e04d0d7e60008 (patch)
tree427eade0b7069869011365137de2c87bc15df7e0
parentMerge pull request #3981 from ReinUsesLisp/bar (diff)
downloadyuzu-32e6727daecab60d368d14619c1e04d0d7e60008.tar.gz
yuzu-32e6727daecab60d368d14619c1e04d0d7e60008.tar.xz
yuzu-32e6727daecab60d368d14619c1e04d0d7e60008.zip
shader/other: Implement MEMBAR.CTS
This silences an assertion we were hitting and uses workgroup memory barriers when the game requests it.
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp10
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp7
-rw-r--r--src/video_core/shader/decode/other.cpp14
-rw-r--r--src/video_core/shader/node.h5
4 files changed, 27 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 253484968..9cb115959 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -2344,7 +2344,12 @@ private:
2344 return {}; 2344 return {};
2345 } 2345 }
2346 2346
2347 Expression MemoryBarrierGL(Operation) { 2347 Expression MemoryBarrierGroup(Operation) {
2348 code.AddLine("groupMemoryBarrier();");
2349 return {};
2350 }
2351
2352 Expression MemoryBarrierGlobal(Operation) {
2348 code.AddLine("memoryBarrier();"); 2353 code.AddLine("memoryBarrier();");
2349 return {}; 2354 return {};
2350 } 2355 }
@@ -2591,7 +2596,8 @@ private:
2591 &GLSLDecompiler::ShuffleIndexed, 2596 &GLSLDecompiler::ShuffleIndexed,
2592 2597
2593 &GLSLDecompiler::Barrier, 2598 &GLSLDecompiler::Barrier,
2594 &GLSLDecompiler::MemoryBarrierGL, 2599 &GLSLDecompiler::MemoryBarrierGroup,
2600 &GLSLDecompiler::MemoryBarrierGlobal,
2595 }; 2601 };
2596 static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); 2602 static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount));
2597 2603
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index 890f34a2c..6f6dedd82 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -2215,8 +2215,8 @@ private:
2215 return {}; 2215 return {};
2216 } 2216 }
2217 2217
2218 Expression MemoryBarrierGL(Operation) { 2218 template <spv::Scope scope>
2219 const auto scope = spv::Scope::Device; 2219 Expression MemoryBarrier(Operation) {
2220 const auto semantics = 2220 const auto semantics =
2221 spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | 2221 spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory |
2222 spv::MemorySemanticsMask::WorkgroupMemory | 2222 spv::MemorySemanticsMask::WorkgroupMemory |
@@ -2681,7 +2681,8 @@ private:
2681 &SPIRVDecompiler::ShuffleIndexed, 2681 &SPIRVDecompiler::ShuffleIndexed,
2682 2682
2683 &SPIRVDecompiler::Barrier, 2683 &SPIRVDecompiler::Barrier,
2684 &SPIRVDecompiler::MemoryBarrierGL, 2684 &SPIRVDecompiler::MemoryBarrier<spv::Scope::Workgroup>,
2685 &SPIRVDecompiler::MemoryBarrier<spv::Scope::Device>,
2685 }; 2686 };
2686 static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); 2687 static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount));
2687 2688
diff --git a/src/video_core/shader/decode/other.cpp b/src/video_core/shader/decode/other.cpp
index 694b325e1..d00e10913 100644
--- a/src/video_core/shader/decode/other.cpp
+++ b/src/video_core/shader/decode/other.cpp
@@ -299,9 +299,19 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) {
299 break; 299 break;
300 } 300 }
301 case OpCode::Id::MEMBAR: { 301 case OpCode::Id::MEMBAR: {
302 UNIMPLEMENTED_IF(instr.membar.type != Tegra::Shader::MembarType::GL);
303 UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default); 302 UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default);
304 bb.push_back(Operation(OperationCode::MemoryBarrierGL)); 303 const OperationCode type = [instr] {
304 switch (instr.membar.type) {
305 case Tegra::Shader::MembarType::CTA:
306 return OperationCode::MemoryBarrierGroup;
307 case Tegra::Shader::MembarType::GL:
308 return OperationCode::MemoryBarrierGlobal;
309 default:
310 UNIMPLEMENTED_MSG("MEMBAR type={}", static_cast<int>(instr.membar.type.Value()));
311 return OperationCode::MemoryBarrierGlobal;
312 }
313 }();
314 bb.push_back(Operation(type));
305 break; 315 break;
306 } 316 }
307 case OpCode::Id::DEPBAR: { 317 case OpCode::Id::DEPBAR: {
diff --git a/src/video_core/shader/node.h b/src/video_core/shader/node.h
index c06512413..c5e5165ff 100644
--- a/src/video_core/shader/node.h
+++ b/src/video_core/shader/node.h
@@ -233,8 +233,9 @@ enum class OperationCode {
233 ThreadLtMask, /// () -> uint 233 ThreadLtMask, /// () -> uint
234 ShuffleIndexed, /// (uint value, uint index) -> uint 234 ShuffleIndexed, /// (uint value, uint index) -> uint
235 235
236 Barrier, /// () -> void 236 Barrier, /// () -> void
237 MemoryBarrierGL, /// () -> void 237 MemoryBarrierGroup, /// () -> void
238 MemoryBarrierGlobal, /// () -> void
238 239
239 Amount, 240 Amount,
240}; 241};