コード例 #1
0
        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);
        }
コード例 #2
0
        /*
         * PRSI Tokens map preshader outputs to ConstantBuffer addresses
         *
         */
        /*
         * maps
         * 0 => 0
         * 1 => 4
         * 1 => 2
         * // add expr0, l12(0), g1
         * // add expr8, l12(0), g3
         * // add expr16, l12(0), g5
         *
         *
         *              //
         *              // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
         *              //
         *              // Parameters:
         *              //
         *              //   float4 g1;
         *              //   float4 g3;
         *              //   float4 g5;
         *              //
         *              //
         *              // Registers:
         *              //
         *              //   Name         Reg   Size
         *              //   ------------ ----- ----
         *              //   g1           c0       1
         *              //   g3           c1       1
         *              //   g5           c2       1
         *              //
         *
         *                      preshader
         *                      add c0, (5, 5, 5, 5), c0
         *                      add c2, (5, 5, 5, 5), c1
         *                      add c4, (5, 5, 5, 5), c2
         *
         *              // approximately 3 instructions used
         *              //
         *              // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
         *                      vs_2_0
         *                      def c5, 0, 0, 0, 0
         *                      mov oPos, c0
         *                      mov oD0, c5.x
         *                      mov oD1, c2
         *                      mov oT0, c5.x
         *                      mov oT1, c4
         *
         *              // approximately 5 instruction slots used
         *              };
         */
        public static DebugPrsiToken Parse(DebugBytecodeReader reader, uint size)
        {
            var result = new DebugPrsiToken();

            Debug.Assert(size > 6, "PRSI size too small");
            // Preshader outputs begin at this offset
            // eg RegisterOffset = 10
            //preshader
            //mul c10.xyz, c0.xyz, c1.xyz
            var outputRegisterOffset = reader.ReadUInt32("RegisterOffset");
            var unk1 = reader.ReadUInt32("Unk1");
            var unk2 = reader.ReadUInt32("Unk2");
            var outputRegisterCount = reader.ReadUInt32("OutputRegisterCount?");
            var unk3         = reader.ReadUInt32("Unk3");
            var unk4         = reader.ReadUInt32("Unk4");
            var mappingCount = reader.ReadUInt32("MappingCount");
            var unk5         = reader.ReadUInt32("Unk5");
            var unk6         = reader.ReadUInt32("Unk6");

            Debug.Assert(unk1 == 0, $"unk1={unk1}");
            Debug.Assert(unk2 == 0, $"unk2={unk2}");
            Debug.Assert(unk3 == 0, $"unk3={unk3}");
            Debug.Assert(unk4 == 0, $"unk4={unk4}");

            Debug.Assert(unk5 == outputRegisterOffset,
                         $"unk5 ({unk5}) and OutputRegisterOffset ({outputRegisterOffset}) differ");
            //Debug.Assert(unk6 == outputRegisterCount,
            //	$"unk6 ({unk6}) and OutputRegisterCount ({outputRegisterCount}) differ");
            for (int i = 0; i < mappingCount; i++)
            {
                reader.AddIndent($"Mapping{i}");
                reader.ReadUInt32("ConstOutput");
                reader.ReadUInt32("ConstInput");
                reader.RemoveIndent();
            }
            //if(size != 12) throw new System.Exception($"PRSI TOKEN Size {size}");
            //Debug.Assert(true, "PRSI Token");
            return(result);
        }