summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-09-21 00:45:13 -0400
committerGravatar FernandoS272019-10-04 18:52:52 -0400
commit466cd52ad47b125182baf1544c44e52a741fa58f (patch)
tree6f156ad3e81116d926894320dc6fe7a1d5bc7527 /src
parentShader_IR: allow else derivation to be optional. (diff)
downloadyuzu-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.cpp15
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
1839DecompilerResult Decompile(const VKDevice& device, const VideoCommon::Shader::ShaderIR& ir, 1846DecompilerResult Decompile(const VKDevice& device, const VideoCommon::Shader::ShaderIR& ir,