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; } } } }