Beispiel #1
0
        public static DebugConstantTable Parse(DebugBytecodeReader reader)
        {
            var result = new DebugConstantTable();

            var ctabReader         = reader.CopyAtCurrentPosition("CTabReader", reader);
            var ctabSize           = ctabReader.ReadUInt32("CtabSize");
            var creatorOffset      = ctabReader.ReadInt32("CreatorPosition");
            var minorVersion       = ctabReader.ReadByte("MinorVersion");
            var majorVersion       = ctabReader.ReadByte("MajorVersion");
            var shaderType         = ctabReader.ReadEnum16 <ShaderType>("ShaderType");
            var numConstants       = ctabReader.ReadInt32("NumConstants");
            var constantInfoOffset = ctabReader.ReadInt32("ConstantInfoOffset");
            var shaderFlags        = ctabReader.ReadEnum32 <ShaderFlags>("ShaderFlags");
            var shaderModelOffset  = ctabReader.ReadInt32("ShaderModelOffset");

            for (int i = 0; i < numConstants; i++)
            {
                var decReader = ctabReader.CopyAtOffset($"Declaration {i}", ctabReader, constantInfoOffset + i * 20);
                DebugConstantDeclaration declaration = DebugConstantDeclaration.Parse(ctabReader, decReader);
                result.ConstantDeclarations.Add(declaration);
            }

            var shaderModelReader = ctabReader.CopyAtOffset("ShaderModelReader", ctabReader, shaderModelOffset);
            var shaderModel       = shaderModelReader.ReadString("ShaderModel");

            var creatorReader = ctabReader.CopyAtOffset("CreaterReader", ctabReader, creatorOffset);
            var creatorString = creatorReader.ReadString("CreatorString");

            return(result);
        }
        bool ReadCommentToken(DebugBytecodeReader reader)
        {
            var fourCC = reader.PeakUInt32Ahead(4);

            if (KnownCommentTypes.ContainsKey(fourCC))
            {
                reader.AddIndent(KnownCommentTypes[fourCC].ToString());
            }
            else
            {
                return(false);
            }
            var    instructionToken = reader.ReadUInt32("Token");
            var    startPosition    = reader._reader.BaseStream.Position;
            Opcode opcode           = (Opcode)(instructionToken & 0xffff);

            reader.AddNote("TokenOpcode", opcode);
            var size = (int)((instructionToken >> 16) & 0x7FFF);

            reader.AddNote("TokenSize", size);
            reader.ReadBytes("FourCC", 4);

            switch (KnownCommentTypes[fourCC])
            {
            case CommentType.CTAB:
                ConstantTable = DebugConstantTable.Parse(reader);
                break;

            case CommentType.C**T:
                Cli = DebugCliToken.Parse(reader);
                break;

            case CommentType.FXLC:
                Fxlc = DebugFxlc.Parse(reader, (uint)size * 4);
                break;

            case CommentType.PRES:
                Preshader = DebugPreshader.Parse(reader);
                break;

            case CommentType.PRSI:
                Prsi = DebugPrsiToken.Parse(reader, (uint)size);
                break;

            default:
                return(false);
            }
            reader.RemoveIndent();
            reader._reader.BaseStream.Position = startPosition + size * 4;
            return(true);
        }