Jelajahi Sumber

structured_control_flow: Skip reordering nested demote branches.

Nested demote branches add complexity with combining the condition if it has not been initialized yet. Skip them for the time being.
ameerj 4 tahun lalu
induk
melakukan
907dfbea71

+ 11 - 0
src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp

@@ -872,10 +872,21 @@ private:
         std::vector<IR::Block*> demote_blocks;
         std::vector<IR::U1> demote_conds;
         u32 num_epilogues{};
+        u32 branch_depth{};
         for (const IR::AbstractSyntaxNode& node : syntax_list) {
+            if (node.type == Type::If) {
+                ++branch_depth;
+            }
+            if (node.type == Type::EndIf) {
+                --branch_depth;
+            }
             if (node.type != Type::Block) {
                 continue;
             }
+            if (branch_depth > 1) {
+                // Skip reordering nested demote branches.
+                continue;
+            }
             for (const IR::Inst& inst : node.data.block->Instructions()) {
                 const IR::Opcode op{inst.GetOpcode()};
                 if (op == IR::Opcode::DemoteToHelperInvocation) {