diff options
| author | 2020-05-14 21:26:37 -0300 | |
|---|---|---|
| committer | 2020-05-21 23:16:03 -0300 | |
| commit | ed4e3249917c5991fd515ff846ae4b52b99153fb (patch) | |
| tree | 5dc5a4240c1be246f8b68b830ab33cd0e29d9c94 /src | |
| parent | vk_shader_decompiler: Don't assert for void returns (diff) | |
| download | yuzu-ed4e3249917c5991fd515ff846ae4b52b99153fb.tar.gz yuzu-ed4e3249917c5991fd515ff846ae4b52b99153fb.tar.xz yuzu-ed4e3249917c5991fd515ff846ae4b52b99153fb.zip | |
shader_decompiler: Visit source nodes even when they assign to RZ
Some operations like atomicMin were ignored because they returned were
being stored to RZ. This operations have a side effect and it was being
ignored.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 960ebf1a1..f695ee1db 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -1538,7 +1538,9 @@ private: | |||
| 1538 | Expression target; | 1538 | Expression target; |
| 1539 | if (const auto gpr = std::get_if<GprNode>(&*dest)) { | 1539 | if (const auto gpr = std::get_if<GprNode>(&*dest)) { |
| 1540 | if (gpr->GetIndex() == Register::ZeroIndex) { | 1540 | if (gpr->GetIndex() == Register::ZeroIndex) { |
| 1541 | // Writing to Register::ZeroIndex is a no op | 1541 | // Writing to Register::ZeroIndex is a no op but we still have to visit the source |
| 1542 | // as it might have side effects. | ||
| 1543 | code.AddLine("{};", Visit(src).GetCode()); | ||
| 1542 | return {}; | 1544 | return {}; |
| 1543 | } | 1545 | } |
| 1544 | target = {GetRegister(gpr->GetIndex()), Type::Float}; | 1546 | target = {GetRegister(gpr->GetIndex()), Type::Float}; |
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index 808a265e5..1749e068e 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | |||
| @@ -1361,7 +1361,9 @@ private: | |||
| 1361 | Expression target{}; | 1361 | Expression target{}; |
| 1362 | if (const auto gpr = std::get_if<GprNode>(&*dest)) { | 1362 | if (const auto gpr = std::get_if<GprNode>(&*dest)) { |
| 1363 | if (gpr->GetIndex() == Register::ZeroIndex) { | 1363 | if (gpr->GetIndex() == Register::ZeroIndex) { |
| 1364 | // Writing to Register::ZeroIndex is a no op | 1364 | // Writing to Register::ZeroIndex is a no op but we still have to visit its source |
| 1365 | // because it might have side effects. | ||
| 1366 | Visit(src); | ||
| 1365 | return {}; | 1367 | return {}; |
| 1366 | } | 1368 | } |
| 1367 | target = {registers.at(gpr->GetIndex()), Type::Float}; | 1369 | target = {registers.at(gpr->GetIndex()), Type::Float}; |