コード例 #1
0
ファイル: SpirV.cs プロジェクト: meriaizen86/Vulpine
        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}]");
        }
コード例 #2
0
ファイル: SpirV.cs プロジェクト: meriaizen86/Vulpine
        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;
                    }
                }
            }
        }