yuzu-emu
/
yuzu-android
Archived
1
0
Fork 0

vk_shader_decompiler: Fix full decompilation

When full decompilation was enabled, labels were not being inserted and
instructions were misused. Fix these bugs.
This commit is contained in:
ReinUsesLisp 2019-12-19 01:46:20 -03:00
parent de918ebeb0
commit 2a63b3bdb9
No known key found for this signature in database
GPG Key ID: 2DFC508897B39CFE
1 changed files with 5 additions and 3 deletions

View File

@ -2594,7 +2594,7 @@ public:
const Id target = decomp.Constant(decomp.t_uint, expr.value); const Id target = decomp.Constant(decomp.t_uint, expr.value);
Id gpr = decomp.OpLoad(decomp.t_float, decomp.registers.at(expr.gpr)); Id gpr = decomp.OpLoad(decomp.t_float, decomp.registers.at(expr.gpr));
gpr = decomp.OpBitcast(decomp.t_uint, gpr); gpr = decomp.OpBitcast(decomp.t_uint, gpr);
return decomp.OpLogicalEqual(decomp.t_uint, gpr, target); return decomp.OpIEqual(decomp.t_bool, gpr, target);
} }
Id Visit(const Expr& node) { Id Visit(const Expr& node) {
@ -2664,11 +2664,11 @@ public:
const Id loop_label = decomp.OpLabel(); const Id loop_label = decomp.OpLabel();
const Id endloop_label = decomp.OpLabel(); const Id endloop_label = decomp.OpLabel();
const Id loop_start_block = decomp.OpLabel(); const Id loop_start_block = decomp.OpLabel();
const Id loop_end_block = decomp.OpLabel(); const Id loop_continue_block = decomp.OpLabel();
current_loop_exit = endloop_label; current_loop_exit = endloop_label;
decomp.OpBranch(loop_label); decomp.OpBranch(loop_label);
decomp.AddLabel(loop_label); decomp.AddLabel(loop_label);
decomp.OpLoopMerge(endloop_label, loop_end_block, spv::LoopControlMask::MaskNone); decomp.OpLoopMerge(endloop_label, loop_continue_block, spv::LoopControlMask::MaskNone);
decomp.OpBranch(loop_start_block); decomp.OpBranch(loop_start_block);
decomp.AddLabel(loop_start_block); decomp.AddLabel(loop_start_block);
ASTNode current = ast.nodes.GetFirst(); ASTNode current = ast.nodes.GetFirst();
@ -2676,6 +2676,8 @@ public:
Visit(current); Visit(current);
current = current->GetNext(); current = current->GetNext();
} }
decomp.OpBranch(loop_continue_block);
decomp.AddLabel(loop_continue_block);
ExprDecompiler expr_parser{decomp}; ExprDecompiler expr_parser{decomp};
const Id condition = expr_parser.Visit(ast.condition); const Id condition = expr_parser.Visit(ast.condition);
decomp.OpBranchConditional(condition, loop_label, endloop_label); decomp.OpBranchConditional(condition, loop_label, endloop_label);