private static void Generate(CodeGenContext context, AstBlock block) { AstBlockVisitor visitor = new AstBlockVisitor(block); var loopTargets = new Dictionary <AstBlock, (SpvInstruction, SpvInstruction)>(); visitor.BlockEntered += (sender, e) => { AstBlock mergeBlock = e.Block.Parent; if (e.Block.Type == AstBlockType.If) { AstBlock ifTrueBlock = e.Block; AstBlock ifFalseBlock; if (AstHelper.Next(e.Block) is AstBlock nextBlock && nextBlock.Type == AstBlockType.Else) { ifFalseBlock = nextBlock; } else { ifFalseBlock = mergeBlock; } var condition = context.Get(AggregateType.Bool, e.Block.Condition); context.SelectionMerge(context.GetNextLabel(mergeBlock), SelectionControlMask.MaskNone); context.BranchConditional(condition, context.GetNextLabel(ifTrueBlock), context.GetNextLabel(ifFalseBlock)); }