diff options
| author | 2019-09-21 00:45:13 -0400 | |
|---|---|---|
| committer | 2019-10-04 18:52:52 -0400 | |
| commit | 466cd52ad47b125182baf1544c44e52a741fa58f (patch) | |
| tree | 6f156ad3e81116d926894320dc6fe7a1d5bc7527 /src | |
| parent | Shader_IR: allow else derivation to be optional. (diff) | |
| download | yuzu-466cd52ad47b125182baf1544c44e52a741fa58f.tar.gz yuzu-466cd52ad47b125182baf1544c44e52a741fa58f.tar.xz yuzu-466cd52ad47b125182baf1544c44e52a741fa58f.zip | |
vk_shader_compiler: Correct SPIR-V AST Decompiling
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index 72fbc69c4..4527e9261 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | |||
| @@ -1714,6 +1714,7 @@ public: | |||
| 1714 | Visit(current); | 1714 | Visit(current); |
| 1715 | current = current->GetNext(); | 1715 | current = current->GetNext(); |
| 1716 | } | 1716 | } |
| 1717 | decomp.Emit(decomp.OpBranch(endif_label)); | ||
| 1717 | decomp.Emit(endif_label); | 1718 | decomp.Emit(endif_label); |
| 1718 | } | 1719 | } |
| 1719 | 1720 | ||
| @@ -1749,6 +1750,7 @@ public: | |||
| 1749 | const Id loop_start_block = decomp.OpLabel(); | 1750 | const Id loop_start_block = decomp.OpLabel(); |
| 1750 | const Id loop_end_block = decomp.OpLabel(); | 1751 | const Id loop_end_block = decomp.OpLabel(); |
| 1751 | current_loop_exit = endloop_label; | 1752 | current_loop_exit = endloop_label; |
| 1753 | decomp.Emit(decomp.OpBranch(loop_label)); | ||
| 1752 | decomp.Emit(loop_label); | 1754 | decomp.Emit(loop_label); |
| 1753 | decomp.Emit( | 1755 | decomp.Emit( |
| 1754 | decomp.OpLoopMerge(endloop_label, loop_end_block, spv::LoopControlMask::MaskNone)); | 1756 | decomp.OpLoopMerge(endloop_label, loop_end_block, spv::LoopControlMask::MaskNone)); |
| @@ -1759,8 +1761,6 @@ public: | |||
| 1759 | Visit(current); | 1761 | Visit(current); |
| 1760 | current = current->GetNext(); | 1762 | current = current->GetNext(); |
| 1761 | } | 1763 | } |
| 1762 | decomp.Emit(decomp.OpBranch(loop_end_block)); | ||
| 1763 | decomp.Emit(loop_end_block); | ||
| 1764 | ExprDecompiler expr_parser{decomp}; | 1764 | ExprDecompiler expr_parser{decomp}; |
| 1765 | const Id condition = expr_parser.Visit(ast.condition); | 1765 | const Id condition = expr_parser.Visit(ast.condition); |
| 1766 | decomp.Emit(decomp.OpBranchConditional(condition, loop_label, endloop_label)); | 1766 | decomp.Emit(decomp.OpBranchConditional(condition, loop_label, endloop_label)); |
| @@ -1785,7 +1785,9 @@ public: | |||
| 1785 | } | 1785 | } |
| 1786 | decomp.Emit(endif_label); | 1786 | decomp.Emit(endif_label); |
| 1787 | } else { | 1787 | } else { |
| 1788 | decomp.Emit(decomp.OpLabel()); | 1788 | const Id next_block = decomp.OpLabel(); |
| 1789 | decomp.Emit(decomp.OpBranch(next_block)); | ||
| 1790 | decomp.Emit(next_block); | ||
| 1789 | if (ast.kills) { | 1791 | if (ast.kills) { |
| 1790 | decomp.Emit(decomp.OpKill()); | 1792 | decomp.Emit(decomp.OpKill()); |
| 1791 | } else { | 1793 | } else { |
| @@ -1809,7 +1811,9 @@ public: | |||
| 1809 | decomp.Emit(decomp.OpBranch(current_loop_exit)); | 1811 | decomp.Emit(decomp.OpBranch(current_loop_exit)); |
| 1810 | decomp.Emit(endif_label); | 1812 | decomp.Emit(endif_label); |
| 1811 | } else { | 1813 | } else { |
| 1812 | decomp.Emit(decomp.OpLabel()); | 1814 | const Id next_block = decomp.OpLabel(); |
| 1815 | decomp.Emit(decomp.OpBranch(next_block)); | ||
| 1816 | decomp.Emit(next_block); | ||
| 1813 | decomp.Emit(decomp.OpBranch(current_loop_exit)); | 1817 | decomp.Emit(decomp.OpBranch(current_loop_exit)); |
| 1814 | decomp.Emit(decomp.OpLabel()); | 1818 | decomp.Emit(decomp.OpLabel()); |
| 1815 | } | 1819 | } |
| @@ -1834,6 +1838,9 @@ void SPIRVDecompiler::DecompileAST() { | |||
| 1834 | ASTDecompiler decompiler{*this}; | 1838 | ASTDecompiler decompiler{*this}; |
| 1835 | VideoCommon::Shader::ASTNode program = ir.GetASTProgram(); | 1839 | VideoCommon::Shader::ASTNode program = ir.GetASTProgram(); |
| 1836 | decompiler.Visit(program); | 1840 | decompiler.Visit(program); |
| 1841 | const Id next_block = OpLabel(); | ||
| 1842 | Emit(OpBranch(next_block)); | ||
| 1843 | Emit(next_block); | ||
| 1837 | } | 1844 | } |
| 1838 | 1845 | ||
| 1839 | DecompilerResult Decompile(const VKDevice& device, const VideoCommon::Shader::ShaderIR& ir, | 1846 | DecompilerResult Decompile(const VKDevice& device, const VideoCommon::Shader::ShaderIR& ir, |