Exemplo n.º 1
0
        bool ReadCommentToken(DebugBytecodeReader reader)
        {
            var fourCC = reader.PeekUInt32Ahead(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);
        }
        public static DebugBytecodeChunk Parse(DebugBytecodeReader reader, uint chunkSize)
        {
            var size  = chunkSize / sizeof(uint);
            var magic = reader.PeekUInt32Ahead(8);

            if (magic == "DXIL".ToFourCc())
            {
                return(Dxil.DebugDxilReflectionChunk.Parse(reader, chunkSize));
            }
            var result = new DebugStatisticsChunk
            {
                InstructionCount            = reader.ReadUInt32("InstructionCount"),
                TempRegisterCount           = reader.ReadUInt32("TempRegisterCount"),
                DefineCount                 = reader.ReadUInt32("DefineCount"),
                DeclarationCount            = reader.ReadUInt32("DeclarationCount"),
                FloatInstructionCount       = reader.ReadUInt32("FloatInstructionCount"),
                IntInstructionCount         = reader.ReadUInt32("IntInstructionCount"),
                UIntInstructionCount        = reader.ReadUInt32("UIntInstructionCount"),
                StaticFlowControlCount      = reader.ReadUInt32("StaticFlowControlCount"),
                DynamicFlowControlCount     = reader.ReadUInt32("DynamicFlowControlCount"),
                MacroInstructionCount       = reader.ReadUInt32("MacroInstructionCount"),           // Guessed
                TempArrayCount              = reader.ReadUInt32("TempArrayCount"),
                ArrayInstructionCount       = reader.ReadUInt32("ArrayInstructionCount"),
                CutInstructionCount         = reader.ReadUInt32("CutInstructionCount"),
                EmitInstructionCount        = reader.ReadUInt32("EmitInstructionCount"),
                TextureNormalInstructions   = reader.ReadUInt32("TextureNormalInstructions"),
                TextureLoadInstructions     = reader.ReadUInt32("TextureLoadInstructions"),
                TextureCompInstructions     = reader.ReadUInt32("TextureCompInstructions"),
                TextureBiasInstructions     = reader.ReadUInt32("TextureBiasInstructions"),
                TextureGradientInstructions = reader.ReadUInt32("TextureGradientInstructions"),
                MovInstructionCount         = reader.ReadUInt32("MovInstructionCount"),
                MovCInstructionCount        = reader.ReadUInt32("MovCInstructionCount"),
                ConversionInstructionCount  = reader.ReadUInt32("ConversionInstructionCount")
            };

            //TODO
            var unknown0 = reader.ReadUInt32("StatisticsChunkUnknown0");

            result.InputPrimitive = (Primitive)reader.ReadUInt32("InputPrimitive");
            result.GeometryShaderOutputTopology       = reader.ReadEnum32 <PrimitiveTopology>("GeometryShaderOutputTopology");
            result.GeometryShaderMaxOutputVertexCount = reader.ReadUInt32("GeometryShaderMaxOutputVertexCount");

            var unknown1 = reader.ReadUInt32("StatisticsChunkUnknown1");
            //if (unknown1 == 0 || unknown1 == 1 || unknown1 == 3) throw new System.Exception($"unknown1 is {unknown1}");
            //TODO: CheckAccessFullyMapped textures have large unknown1
            //Texture_Texture2D, Texture_Texture2DArray, Texture_TextureCube, Texture_TextureCubeArray

            var unknown2 = reader.ReadUInt32("StatisticsChunkUnknown2");

            //if (unknown2 != 0 && unknown2 != 2) throw new System.Exception($"unknown2 is {unknown2}");

            result.IsSampleFrequencyShader = (reader.ReadUInt32("IsSampleFrequencyShader") == 1);

            // DX10 stat size
            if (size == 29)
            {
                return(result);
            }

            result.GeometryShaderInstanceCount = reader.ReadUInt32("GeometryShaderInstanceCount");
            result.ControlPoints             = reader.ReadUInt32("ControlPoints");
            result.HullShaderOutputPrimitive = reader.ReadEnum32 <TessellatorOutputPrimitive>("HullShaderOutputPrimitive");
            result.HullShaderPartitioning    = reader.ReadEnum32 <TessellatorPartitioning>("HullShaderPartitioning");
            result.TessellatorDomain         = reader.ReadEnum32 <TessellatorDomain>("TessellatorDomain");

            result.BarrierInstructions      = reader.ReadUInt32("BarrierInstructions");
            result.InterlockedInstructions  = reader.ReadUInt32("InterlockedInstructions");
            result.TextureStoreInstructions = reader.ReadUInt32("TextureStoreInstructions");

            // DX11 stat size.
            if (size == 37)
            {
                return(result);
            }

            throw new ParseException("Unhandled stat size: " + chunkSize);
        }