IDebugToken ReadInstruction(DebugBytecodeReader reader) { uint instructionToken = reader.ReadUInt32("Token"); Opcode opcode = (Opcode)(instructionToken & 0xffff); uint size; if (opcode == Opcode.Comment) { size = (uint)((instructionToken >> 16) & 0x7FFF); } else { size = (uint)((instructionToken >> 24) & 0x0f); } var entry = reader.LocalMembers.Last(); entry.AddNote("TokenOpcode", opcode.ToString()); entry.AddNote("TokenSize", size.ToString()); IDebugToken result; if (opcode == Opcode.Comment) { var token = new DebugToken(); token.Token = instructionToken; token.Opcode = opcode; token.Data = reader.ReadBytes("CommentData", (int)size * 4); result = token; } else { result = DebugInstructionToken.Parse(reader, instructionToken, opcode, size); } if (opcode != Opcode.Comment) { var token = result as DebugInstructionToken; token.Modifier = (int)((instructionToken >> 16) & 0xff); token.Predicated = (instructionToken & 0x10000000) != 0; token.CoIssue = (instructionToken & 0x40000000) != 0; entry.AddNote("Modifer", token.Modifier); entry.AddNote("Predicated", token.Predicated); entry.AddNote("CoIssue", token.CoIssue); } return(result); }
public static DebugShaderProgramChunk Parse(DebugBytecodeReader reader) { var program = new DebugShaderProgramChunk { Version = DebugShaderVersion.ParseShex(reader), Length = reader.ReadUInt32("Length") }; while (!reader.EndOfBuffer) { var opcodeIndex = program.Tokens.Count; var opcodeToken0 = reader.PeakUint32(); var opcodeHeader = new DebugOpcodeHeader { OpcodeType = opcodeToken0.DecodeValue <OpcodeType>(0, 10), Length = opcodeToken0.DecodeValue(24, 30), IsExtended = (opcodeToken0.DecodeValue(31, 31) == 1) }; reader.AddIndent(opcodeHeader.OpcodeType.ToString()); if (opcodeHeader.Length == 0 && opcodeHeader.OpcodeType != OpcodeType.CustomData) { throw new Exception("Error parsing shader"); } DebugOpcodeToken opcodeToken; if (opcodeHeader.OpcodeType == OpcodeType.CustomData) { opcodeToken = DebugCustomDataToken.Parse(reader, opcodeToken0); } else if (opcodeHeader.OpcodeType.IsDeclaration()) { opcodeToken = DebugDeclarationToken.Parse(reader, opcodeHeader.OpcodeType, program.Version); } else // Not custom data or declaration, so must be instruction. { opcodeToken = DebugInstructionToken.Parse(reader, opcodeHeader); } program.Tokens.Add(opcodeToken); reader.RemoveIndent(); } return(program); }