X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=inline;f=source%2Fcommandinterpreter.cpp;h=e73494c1e013790e0b7d209c24d36d90e6f31f28;hb=b59ce8a9d7d249b1b3f96b039ac80ccf83298b9a;hp=abc9dda60b07bc83d5125eac1612f8096d5e25eb;hpb=2f49929fc383eab718b5fb64d966535b753e7024;p=gldbg.git diff --git a/source/commandinterpreter.cpp b/source/commandinterpreter.cpp index abc9dda..e73494c 100644 --- a/source/commandinterpreter.cpp +++ b/source/commandinterpreter.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of gldbg -Copyright © 2009 Mikko Rasa, Mikkosoft Productions +Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions Distributed under the GPL */ @@ -31,6 +31,7 @@ CommandInterpreter::CommandInterpreter(GlDbg &d): " Gives detailed information on a command\n"); commands["exit"] = Command(&CommandInterpreter::cmd_exit, "Ends the debugging session"); + commands["quit"] = Command(&commands["exit"]); commands["run"] = Command(&CommandInterpreter::cmd_run, "Starts the program"); @@ -49,7 +50,7 @@ CommandInterpreter::CommandInterpreter(GlDbg &d): commands["trace"] = Command(&CommandInterpreter::cmd_trace, "Traces GL function calls", "trace\n" - " Send trace output to stdout.\n" + " Send trace output to stdout.\n\n" "trace FILE\n" " Send trace output to FILE (- for stdout).\n\n" "trace {off|on}\n" @@ -57,6 +58,11 @@ CommandInterpreter::CommandInterpreter(GlDbg &d): "trace end\n" " Terminate trace, closing the file.\n"); + commands["profile"] = Command(&CommandInterpreter::cmd_profile, + "Profiles GL usage and performance", + "profile {on|off}\n" + " Enables or disables profiling\n"); + commands["state"] = Command(&CommandInterpreter::cmd_state, "Inspects general GL state", "state vertex\n" @@ -105,16 +111,22 @@ void CommandInterpreter::cmd_help(const string &args) if(args.empty()) { for(map::const_iterator i=commands.begin(); i!=commands.end(); ++i) - IO::print("%-10s : %s\n", i->first, i->second.description); + if(!i->second.alias_for) + IO::print("%-10s : %s\n", i->first, i->second.description); } else { map::const_iterator i = commands.find(args); if(i==commands.end()) throw KeyError("Unknown command", args); - IO::print("%s : %s\n", i->first, i->second.description); + + const Command *cmd = &i->second; + while(cmd->alias_for) + cmd = cmd->alias_for; + + IO::print("%s : %s\n", i->first, cmd->description); if(!i->second.help.empty()) - IO::print("\n%s", i->second.help); + IO::print("\n%s", cmd->help); } } @@ -202,6 +214,17 @@ void CommandInterpreter::cmd_trace(const string &args) } } +void CommandInterpreter::cmd_profile(const string &args) +{ + Profiler &profiler = gldbg.get_profiler(); + if(args.empty() || args=="on") + profiler.enable(); + else if(args=="off") + profiler.disable(); + else + throw InvalidParameterValue("Invalid argument"); +} + void CommandInterpreter::cmd_state(const string &args) { const GlState &glstate = gldbg.get_glstate(); @@ -288,21 +311,111 @@ void CommandInterpreter::cmd_buffer(const string &args) IO::print("Buffer %d:\n", id); IO::print(" Size: %d bytes\n", buf.size); IO::print(" Usage: %s\n", describe_enum(buf.usage, "")); + if(buf.content.stride) + { + IO::print(" Stride: %d bytes\n", buf.content.stride); + + IO::print(" Arrays:\n"); + const vector &arrays = buf.content.arrays; + for(vector::const_iterator i=arrays.begin(); i!=arrays.end(); ++i) + { + if(i->kind) + IO::print(" %2d: %s, %d %s\n", i->offset, + describe_enum(i->kind, ""), i->size, describe_enum(i->type, "DataType")); + else + IO::print(" %2d: Attrib %d, %d %s\n", i->offset, + i->index, i->size, describe_enum(i->type, "DataType")); + } + + IO::print(" Data:\n"); + string header; + for(vector::const_iterator i=arrays.begin(); i!=arrays.end(); ++i) + { + if(!header.empty()) + header += " | "; + + string label; + if(i->kind==GL_VERTEX_ARRAY) + label = "Vertex"; + else if(i->kind==GL_NORMAL_ARRAY) + label = "Normal"; + else if(i->kind==GL_COLOR_ARRAY) + label = "Color"; + else if(i->kind==GL_TEXTURE_COORD_ARRAY) + { + if(i->size==1) + label = "TexC"; + else + label = "TexCoord"; + } + else if(!i->kind) + { + if(i->size==1) + label = format("A %d", i->index); + else + label = format("Attrib %d", i->index); + } + + unsigned width = i->size; + if(i->type==GL_FLOAT) + width *= 5; + else if(i->type==GL_UNSIGNED_BYTE) + width *= 3; + width += i->size-1; + + header.append((width-label.size())/2, ' '); + header += label; + header.append((width-label.size()+1)/2, ' '); + } + IO::print(" %s\n", header); + + unsigned n_verts = buf.size/buf.content.stride; + for(unsigned i=0; i::const_iterator j=arrays.begin(); j!=arrays.end(); ++j) + { + if(!line.empty()) + line += " |"; + + const char *base = vertex+j->offset; + for(unsigned k=0; ksize; ++k) + { + if(j->type==GL_FLOAT) + line += format(" %5.2f", *(reinterpret_cast(base)+k)); + else if(j->type==GL_UNSIGNED_BYTE) + line += format(" %3u", *(reinterpret_cast(base)+k)); + } + } + + IO::print("%3d:%s\n", i, line); + } + } } } CommandInterpreter::Command::Command(): - func(0) + func(0), + alias_for(0) +{ } + +CommandInterpreter::Command::Command(Command *cmd): + func(cmd->func), + alias_for(cmd) { } CommandInterpreter::Command::Command(Func f, const string &d): func(f), - description(d) + description(d), + alias_for(0) { } CommandInterpreter::Command::Command(Func f, const string &d, const string &h): func(f), description(d), - help(h) + help(h), + alias_for(0) { }