X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcommandinterpreter.cpp;h=d02a0b49901d55ac396175958b53bc796ecf0013;hb=64592975a49e2bd26a561f36425071427f37d5fb;hp=c51d0a2b223a326ff297be9d37e6fb46df573eae;hpb=0be9f22fa27bfca77f494489fce0e62b66882e5b;p=gldbg.git diff --git a/source/commandinterpreter.cpp b/source/commandinterpreter.cpp index c51d0a2..d02a0b4 100644 --- a/source/commandinterpreter.cpp +++ b/source/commandinterpreter.cpp @@ -6,12 +6,14 @@ Distributed under the GPL */ #include +#include #include #include #include #include #include #include "commandinterpreter.h" +#include "enums.h" #include "gldbg.h" #include "tracer.h" @@ -29,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"); @@ -46,12 +49,40 @@ CommandInterpreter::CommandInterpreter(GlDbg &d): commands["trace"] = Command(&CommandInterpreter::cmd_trace, "Traces GL function calls", - "trace >FILE\n" - " Send trace output to FILE. As a special case, - means stdout.\n\n" + "trace\n" + " Send trace output to stdout.\n\n" + "trace FILE\n" + " Send trace output to FILE (- for stdout).\n\n" "trace {off|on}\n" " Temporarily suspend or resume trace without closing the file.\n\n" "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" + " Print current vertex attributes\n\n" + "state bind\n" + " Show current bindings\n"); + + commands["texture"] = Command(&CommandInterpreter::cmd_texture, + "Inspect texture state", + "texture\n" + " Lists texture objects\n\n" + "texture ID\n" + " Print information about a texture object\n"); + + commands["buffer"] = Command(&CommandInterpreter::cmd_buffer, + "Inspect buffer object state", + "buffer\n" + " Lists buffer objects\n\n" + "buffer ID\n" + " Print information about a buffer object\n"); } void CommandInterpreter::execute(const string &cmd) @@ -80,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); } } @@ -100,6 +137,7 @@ void CommandInterpreter::cmd_run(const string &) void CommandInterpreter::cmd_continue(const string &) { + IO::print("Continuing.\n"); gldbg.get_process().resume(); } @@ -130,58 +168,172 @@ void CommandInterpreter::cmd_kill(const string &) void CommandInterpreter::cmd_exit(const string &) { - gldbg.quit(); + if(gldbg.get_process().get_state()!=Process::INACTIVE) + { + IO::print("Program is still running. Kill it?\n"); + char *answer = readline("[y/n] "); + if(answer[0]=='y') + { + gldbg.get_process().kill(); + gldbg.quit(true); + } + else + IO::print("Not confirmed.\n"); + } + else + gldbg.quit(false); } void CommandInterpreter::cmd_trace(const string &args) { Tracer &tracer = gldbg.get_tracer(); - if(args[0]=='>') + if(args.empty() || args=="-") + { + tracer.set_output(IO::cout); + IO::print("Tracing to stdout\n"); + } + else if(args=="on") + { + tracer.enable(); + IO::print("Tracing enabled\n"); + } + else if(args=="off") + { + tracer.disable(); + IO::print("Tracing disabled\n"); + } + else if(args=="end") + { + tracer.set_output(0); + IO::print("Tracing terminated\n"); + } + else + { + tracer.set_output(new IO::File(args, IO::M_WRITE)); + IO::print("Tracing to %s\n", 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(); + if(args=="vertex") { - string fn = args.substr(1); - if(fn=="-") + IO::print("Current vertex attributes:\n"); + const Vector4 &color = glstate.get_color(); + IO::print(" Color: [%05.3f, %05.3f, %05.3f, %05.3f]\n", color.r, color.g, color.b, color.a); + for(unsigned i=0; i<8; ++i) { - tracer.set_output(IO::cout); - IO::print("Tracing to stdout\n"); + const Vector4 &texcoord = glstate.get_texcoord(i); + IO::print(" TexCoord%d: [%05.3f, %05.3f, %05.3f, %05.3f]\n", i, texcoord.s, texcoord.t, texcoord.p, texcoord.q); } - else + const Vector3 &normal = glstate.get_normal(); + IO::print(" Normal: [%05.3f, %05.3f, %05.3f]\n", normal.x, normal.y, normal.z); + } + else if(args=="bind") + { + IO::print("Current bindings:\n"); + for(unsigned i=0; i<8; ++i) { - tracer.set_output(new IO::File(fn, IO::M_WRITE)); - IO::print("Tracing to %s\n", fn); + IO::print(" Texture unit %d:\n", i); + const TexUnitState &unit = glstate.get_texture_unit(i); + IO::print(" GL_TEXTURE_2D: %s\n", unit.describe_binding(GL_TEXTURE_2D)); + IO::print(" GL_TEXTURE_3D: %s\n", unit.describe_binding(GL_TEXTURE_3D)); } + IO::print(" Buffers:\n"); + const BufferState *buf = glstate.get_current_buffer(GL_ARRAY_BUFFER); + IO::print(" GL_ARRAY_BUFFER: %d\n", (buf ? buf->id : 0)); + buf = glstate.get_current_buffer(GL_ELEMENT_ARRAY_BUFFER); + IO::print(" GL_ELEMENT_ARRAY_BUFFER: %d\n", (buf ? buf->id : 0)); } else + throw InvalidParameterValue("Invalid or missing argument"); +} + +void CommandInterpreter::cmd_texture(const string &args) +{ + if(args.empty()) { - if(args=="on") + const map &textures = gldbg.get_glstate().get_textures(); + IO::print("%d texture objects:\n", textures.size()); + for(map::const_iterator i = textures.begin(); i!=textures.end(); ++i) { - tracer.enable(); - IO::print("Tracing enabled\n"); + const TextureState &tex = i->second; + IO::print(" %d: %s, %d images\n", i->first, tex.describe(), tex.images.size()); } - else if(args=="off") - { - tracer.disable(); - IO::print("Tracing disabled\n"); - } - else if(args=="end") + } + else + { + unsigned id = lexical_cast(args); + const TextureState &tex = gldbg.get_glstate().get_texture(id); + IO::print("Texture object %d\n", id); + IO::print(" Target: %s\n", describe_enum(tex.target, "TextureTarget")); + IO::print(" Images:\n"); + for(unsigned i=0; ifirst, i->second.describe()); + } + else + { + unsigned id = lexical_cast(args); + const BufferState &buf = gldbg.get_glstate().get_buffer(id); + IO::print("Buffer %d:\n", id); + IO::print(" Size: %d bytes\n", buf.size); + IO::print(" Usage: %s\n", describe_enum(buf.usage, "")); } } 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) { }