public string ToStringFormatted() { var stringBuilder = new StringBuilder(); foreach (var inst in Instructions) { stringBuilder.Append($"\t\t{ inst.ToStringFormatted() }\n"); } var instructionString = stringBuilder.ToString(); stringBuilder.Clear(); return("Spir-V Source [\n" + $"\tVersion: 0.{ VersionMajor }.{ VersionMinor }.0\n" + $"\tGenerator: { GeneratorMagic }\n" + $"\tBound: { Bound }\n" + $"\tCapabilities: { string.Join(", ", Capabilities ) }\n" + $"\tExtensions: { string.Join(", ", Extensions) }\n" + $"\tExtInstImports: { ExtInstImports.ToStringFormatted() }\n" + $"\tMemoryModel: { MemoryModel }\n" + $"\tEntryPoints: { string.Join(", ", EntryPoints) }\n" + $"\tExecutionModes: { ExecutionModes.ToStringFormatted() }\n" + $"\tNames: { Names.ToStringFormatted() }\n" + $"\tMemberNames: { MemberNames.ToStringFormatted() }\n" + $"\tInstructions:\n" + $"{instructionString}]"); }
public SpirV(Stream stream) { using (var br = new BinaryReader(stream)) { // Word 0; file magic var magic = br.ReadUInt32(); if (magic != SpirVMagic) { throw new InvalidDataException("File magic was incorrect"); } // Word 1; version number br.ReadByte(); VersionMinor = br.ReadByte(); VersionMajor = br.ReadByte(); br.ReadByte(); // Word 2; generator magic GeneratorMagic = br.ReadUInt32(); // Word 3; bound IDs where 0 < ID < this Bound = br.ReadInt32(); // Word 4; optional instruction schema br.ReadInt32(); // Word 5 and beyond; instructions Instructions = new List <Instruction>(); while (stream.Position < stream.Length) { var inst = new Instruction(br); string sA; int iA; List <int> lA; switch (inst.OpCode) { case OpCodeID.Capability: Capabilities.Add((Capability)inst[1]); break; case OpCodeID.Extension: Extensions.Add(inst.String(1)); break; case OpCodeID.ExtInstImport: ExtInstImports.Add(inst[1], inst.String(2)); break; case OpCodeID.MemoryModel: MemoryModel = (MemoryModel)inst[1]; break; case OpCodeID.EntryPoint: sA = inst.String(3, out iA); lA = new List <int>(); for (var i = iA; i < inst.Length; i++) { lA.Add(inst[i]); } EntryPoints.Add(new EntryPoint((ExecutionModel)inst[1], inst[2], sA, lA)); break; case OpCodeID.ExecutionMode: ExecutionModes.Add(inst[1], (ExecutionMode)inst[2]); break; case OpCodeID.Name: Names.Add(inst[1], inst.String(2)); MemberNames.Add(inst[1], new Dictionary <int, string>()); break; case OpCodeID.MemberName: MemberNames[inst[1]].Add(inst[2], inst.String(3)); break; default: Instructions.Add(new Instruction(br)); break; } } } }