diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/shader/decode/other.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/shader/node.h | 5 |
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 | }; |