/// <summary> /// Create the template output /// </summary> public virtual string TransformText() { this.Write("using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing Toe.S" + "PIRV.Instructions;\r\nusing Toe.SPIRV.Reflection.Types;\r\nusing Toe.SPIRV.Spv;\r\n\r\nn" + "amespace Toe.SPIRV.Reflection.Nodes\r\n{\r\n public partial class "); #line 16 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(" : "); #line 16 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(baseClass)); #line default #line hidden #line 16 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(_instruction.HasDefaultExit?", INodeWithNext":"")); #line default #line hidden this.Write("\r\n {\r\n public "); #line 18 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("()\r\n {\r\n }\r\n"); #line 21 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" { #line default #line hidden this.Write("\r\n public "); #line 25 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("("); #line 25 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", _operands.Concat(new KeyValuePair <string, string>("debugName", "string")).Select(_ => $"{_.Value} {ViewUtils.ToVarName(_.Key)}")))); #line default #line hidden this.Write(" = null)\r\n {\r\n"); #line 27 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" foreach (var op in _operands) { if (op.Value.StartsWith("IList<") || op.Value.StartsWith("IEnumerable<")) { #line default #line hidden this.Write(" if ("); #line 33 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(op.Key))); #line default #line hidden this.Write(" != null) { foreach (var node in "); #line 33 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(op.Key))); #line default #line hidden this.Write(") this."); #line 33 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Key)); #line default #line hidden this.Write(".Add(node); }\r\n"); #line 34 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } else { #line default #line hidden this.Write(" this."); #line 39 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Key)); #line default #line hidden this.Write(" = "); #line 39 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(ViewUtils.ToVarName(op.Key))); #line default #line hidden this.Write(";\r\n"); #line 40 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } } #line default #line hidden this.Write(" DebugName = debugName;\r\n }\r\n"); #line 46 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } #line default #line hidden this.Write("\r\n public override Op OpCode => Op."); #line 50 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(_instruction.Name)); #line default #line hidden this.Write(";\r\n"); #line 51 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" if (_instruction.HasDefaultExit) { #line default #line hidden this.Write(@" /// <summary> /// Next operation in sequence /// </summary> public ExecutableNode Next { get; set; } public override ExecutableNode GetNext() { return Next; } public T Then<T>(T node) where T: ExecutableNode { Next = node; return node; } "); #line 71 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } foreach (var op in _instruction.Operands) { switch (op.Class) { case SpirvOperandClassification.Type: #line default #line hidden this.Write("\r\n public SpirvTypeBase "); #line 80 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" { get; set; }\r\n"); #line 81 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; case SpirvOperandClassification.Exit: case SpirvOperandClassification.Input: #line default #line hidden this.Write("\r\n public "); #line 87 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetNodeType(op))); #line default #line hidden this.Write(" "); #line 87 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" { get; set; }\r\n"); #line 88 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; case SpirvOperandClassification.RepeatedInput: #line default #line hidden this.Write("\r\n public IList<"); #line 93 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetNodeType(op))); #line default #line hidden this.Write("> "); #line 93 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" { get; private set; } = new PrintableList<"); #line 93 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetNodeType(op))); #line default #line hidden this.Write(">();\r\n"); #line 94 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; default: if (op.Quantifier == SpirvOperandQuantifier.Repeated) { #line default #line hidden this.Write("\r\n public "); #line 101 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetPropertyType(op))); #line default #line hidden this.Write(" "); #line 101 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" { get; private set; } = new "); #line 101 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetPropertyType(op).Replace("IList<", "List<"))); #line default #line hidden this.Write("();\r\n"); #line 102 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } else { #line default #line hidden this.Write("\r\n public "); #line 108 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetPropertyType(op))); #line default #line hidden this.Write(" "); #line 108 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" { get; set; }\r\n"); #line 109 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } break; } } if (_instruction.IdResultType != null) { #line default #line hidden this.Write("\r\n public SpirvTypeBase ResultType { get; set; }\r\n\r\n public overrid" + "e SpirvTypeBase GetResultType()\r\n {\r\n return ResultType;\r\n " + " }\r\n"); #line 125 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } if (_instruction.Operands.Any(op => op.Class == SpirvOperandClassification.Input || op.Class == SpirvOperandClassification.RepeatedInput)) { #line default #line hidden this.Write("\r\n public override IEnumerable<Node> GetInputNodes()\r\n {\r\n"); #line 134 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" foreach (var op in _instruction.Operands) { if (op.Class == SpirvOperandClassification.Input) { #line default #line hidden this.Write(" yield return "); #line 140 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(";\r\n"); #line 141 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } else if (op.Class == SpirvOperandClassification.RepeatedInput) { #line default #line hidden this.Write(" for (var index = 0; index < "); #line 146 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(".Count; index++)\r\n {\r\n yield return "); #line 148 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write("[index];\r\n }\r\n"); #line 150 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } } #line default #line hidden this.Write(" }\r\n"); #line 155 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } #line default #line hidden this.Write("\r\n public "); #line 159 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(@" WithDecoration(Spv.Decoration decoration) { AddDecoration(decoration); return this; } public override void SetUp(Instruction op, SpirvInstructionTreeBuilder treeBuilder) { base.SetUp(op, treeBuilder); SetUp(("); #line 168 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(opname)); #line default #line hidden this.Write(")op, treeBuilder);\r\n }\r\n\r\n public "); #line 171 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(" SetUp(Action<"); #line 171 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("> setup)\r\n {\r\n setup(this);\r\n return this;\r\n " + "}\r\n\r\n private void SetUp("); #line 177 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(opname)); #line default #line hidden this.Write(" op, SpirvInstructionTreeBuilder treeBuilder)\r\n {\r\n"); #line 179 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" if (_instruction.IdResultType != null) { #line default #line hidden this.Write(" ResultType = treeBuilder.ResolveType(op.IdResultType);\r\n"); #line 184 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } foreach (var op in _instruction.Operands) { switch (op.Class) { case SpirvOperandClassification.Type: #line default #line hidden this.Write(" "); #line 193 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" = treeBuilder.ResolveType(op."); #line 193 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(");\r\n"); #line 194 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; case SpirvOperandClassification.Exit: case SpirvOperandClassification.Input: #line default #line hidden this.Write(" "); #line 199 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" = "); #line 199 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(CastNodeType(op))); #line default #line hidden this.Write("treeBuilder.GetNode(op."); #line 199 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(");\r\n"); #line 200 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; case SpirvOperandClassification.RepeatedInput: #line default #line hidden this.Write(" "); #line 204 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" = treeBuilder.GetNodes(op."); #line 204 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(");\r\n"); #line 205 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" break; default: if (op.Quantifier == SpirvOperandQuantifier.Repeated) { #line default #line hidden this.Write(" foreach (var item in op."); #line 211 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(") { "); #line 211 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(".Add(treeBuilder.Parse(item)); }\r\n"); #line 212 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } else if (op.Kind == SpirvOperandKind.LiteralSpecConstantOpInteger) { #line default #line hidden this.Write(" "); #line 217 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" = treeBuilder.Parse(op."); #line 217 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(");\r\n"); #line 218 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } else { #line default #line hidden this.Write(" "); #line 223 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(" = op."); #line 223 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(op.Name)); #line default #line hidden this.Write(";\r\n"); #line 224 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } break; } } #line default #line hidden this.Write(" SetUpDecorations(op, treeBuilder);\r\n }\r\n\r\n /// <summary" + ">Returns a string that represents the "); #line 233 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(" object.</summary>\r\n /// <returns>A string that represents the "); #line 234 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(" object.</returns>\r\n /// <filterpriority>2</filterpriority>\r\n publi" + "c override string ToString()\r\n {\r\n return $\""); #line 238 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("("); #line 238 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", _operands.Concat(new KeyValuePair <string, string>("DebugName", "string")).Select(_ => $"{{{_.Key}}}")))); #line default #line hidden this.Write(")\";\r\n }\r\n }\r\n"); #line 241 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" if (_instruction.HasDefaultEnter) { #line default #line hidden this.Write("\r\n public static partial class INodeWithNextExtensionMethods\r\n {\r\n p" + "ublic static "); #line 248 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write(" Then"); #line 248 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("(this INodeWithNext node"); #line 248 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" foreach (var op in _instruction.Operands) { this.Write(", "); switch (op.Class) { case SpirvOperandClassification.Type: this.Write($"SpirvTypeBase {ViewUtils.ToVarName(op.Name)}"); break; case SpirvOperandClassification.Exit: case SpirvOperandClassification.Input: this.Write($"{GetNodeType(op)} {ViewUtils.ToVarName(op.Name)}"); break; case SpirvOperandClassification.RepeatedInput: this.Write($"IEnumerable<{GetNodeType(op)}> {ViewUtils.ToVarName(op.Name)}"); break; default: this.Write($"{GetPropertyType(op)} {ViewUtils.ToVarName(op.Name)}"); break; } } #line default #line hidden this.Write(", string debugName = null)\r\n {\r\n return node.Then(new "); #line 271 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(name)); #line default #line hidden this.Write("("); #line 271 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" { var sep = ""; foreach (var op in _instruction.Operands) { this.Write(sep); sep = ", "; this.Write(ViewUtils.ToVarName(op.Name)); } this.Write($"{sep}debugName"); } #line default #line hidden this.Write("));\r\n }\r\n }\r\n"); #line 284 "C:\github\Toe.SPIRV\src\Toe.SPIRV.CodeGenerator\Views\NodeTemplate.tt" } #line default #line hidden this.Write("}"); return(this.GenerationEnvironment.ToString()); }