예제 #1
0
        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);
        }
예제 #2
0
        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);
        }