X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=cli%2Fcli_retrace.cpp;h=d22f719bd65d6a584c416db6010d558a6a55ac9a;hb=940cdb8b143455fe2fc002ffd50f5e2ffcaf1260;hp=de5eb6b9fc4daa11fb959849cd02699b0fe4e509;hpb=df8c819e1e00ee89b2c62f81e5c97ffe919f17b8;p=apitrace diff --git a/cli/cli_retrace.cpp b/cli/cli_retrace.cpp index de5eb6b..d22f719 100644 --- a/cli/cli_retrace.cpp +++ b/cli/cli_retrace.cpp @@ -31,42 +31,22 @@ #include #include -#include "cli.hpp" - #include "os_string.hpp" #include "os_process.hpp" #include "trace_parser.hpp" -#include "trace_resource.hpp" - -static const char *synopsis = "Replay a trace."; +#include "cli_resources.hpp" -static void -usage(void) -{ - std::cout << "usage apitrace retrace [OPTIONS] TRACE_FILE\n" - << synopsis << "\n" - "\n" - " -h, --help Show this help message and exit\n" - " -w, --wait Wait for user termination after the last frame\n" - "\n"; -} - -const static char * -shortOptions = "hw"; +#include "cli.hpp" +#include "cli_retrace.hpp" -const static struct option -longOptions[] = { - {"help", no_argument, 0, 'h'}, - {"wait", required_argument, 0, 'w'}, - {0, 0, 0, 0} -}; static trace::API guessApi(const char *filename) { trace::Parser p; if (!p.open(filename)) { + exit(1); return trace::API_UNKNOWN; } trace::Call *call; @@ -81,45 +61,10 @@ guessApi(const char *filename) return trace::API_UNKNOWN; } -static int -command(int argc, char *argv[]) -{ - bool wait = false; - const char *traceName; - - int opt; - while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) { - switch (opt) { - case 'h': - usage(); - return 0; - case 'w': - wait = true; - break; - default: - std::cerr << "error: unexpected option `" << opt << "`\n"; - usage(); - return 1; - } - } - - if (optind >= argc) { - std::cerr << "error: apitrace retrace requires a trace file as an argument.\n"; - usage(); - return 1; - } - - if (optind < argc - 1) { - std::cerr << "error: apitrace retrace can accept only a single trace file argument.\n"; - usage(); - return 1; - } - - traceName = argv[optind]; - - trace::API api = guessApi(traceName); - - std::vector command; +int +executeRetrace(const std::vector & opts, + const char *traceName, + trace::API api) { const char *retraceName; switch (api) { case trace::API_GL: @@ -132,10 +77,8 @@ command(int argc, char *argv[]) case trace::API_D3D7: case trace::API_D3D8: case trace::API_D3D9: - case trace::API_D3D10: - case trace::API_D3D10_1: - case trace::API_D3D11: - // Can be used with WINE + case trace::API_DXGI: + // Use prefix so that it can be used with WINE retraceName = "d3dretrace.exe"; break; default: @@ -144,23 +87,62 @@ command(int argc, char *argv[]) break; } - os::String retracePath = trace::findProgram(retraceName); - if (retracePath) { + std::vector command; + os::String retracePath = findProgram(retraceName); + if (retracePath.length()) { command.push_back(retracePath); } else { command.push_back(retraceName); } - if (wait) { - command.push_back("--wait"); - } + command.insert(command.end(), opts.begin(), opts.end()); - command.push_back(traceName); + if (traceName) { + command.push_back(traceName); + } command.push_back(NULL); return os::execute((char * const *)&command[0]); } +int +executeRetrace(const std::vector & opts, + const char *traceName) { + trace::API api = guessApi(traceName); + return executeRetrace(opts, traceName, api); +} + + +static const char *synopsis = "Replay a trace."; + +static void +usage(void) +{ + std::vectoropts; + opts.push_back("--help"); + trace::API api = trace::API_GL; + executeRetrace(opts, NULL, api); +} + +static int +command(int argc, char *argv[]) +{ + std::vector opts; + for (int i = 1; i < argc; ++i) { + opts.push_back(argv[i]); + } + + trace::API api = trace::API_GL; + if (argc >= 1) { + const char *lastArg = argv[argc -1]; + if (lastArg[0] != '-') { + api = guessApi(lastArg); + } + } + + return executeRetrace(opts, NULL, api); +} + const Command retrace_command = { "retrace", synopsis,