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); }
/* * 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); }