X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=cli%2Fcli_retrace.cpp;h=db799b96ba012532ccab46fe633a22f1b7afaf32;hb=f5f7f7ff4f2af0cc920b3cdc72258a0c02ca1db5;hp=f88d7dfc59591f9ff23d64453f7030e812d787b5;hpb=3320d024ed6c0b56bda93ca876d8aec9729d7771;p=apitrace diff --git a/cli/cli_retrace.cpp b/cli/cli_retrace.cpp index f88d7df..db799b9 100644 --- a/cli/cli_retrace.cpp +++ b/cli/cli_retrace.cpp @@ -31,89 +31,120 @@ #include #include -#include "cli.hpp" - #include "os_string.hpp" #include "os_process.hpp" -#include "trace_resource.hpp" +#include "trace_parser.hpp" +#include "cli_resources.hpp" -static const char *synopsis = "Replay a trace."; +#include "cli.hpp" +#include "cli_retrace.hpp" -static void -usage(void) + +static trace::API +guessApi(const char *filename) { - 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"; -} + trace::Parser p; + if (!p.open(filename)) { + exit(1); + return trace::API_UNKNOWN; + } + trace::Call *call; + while ((call = p.parse_call())) { + delete call; -const static char * -shortOptions = "hw"; + if (p.api != trace::API_UNKNOWN) { + return p.api; + } + } -const static struct option -longOptions[] = { - {"help", no_argument, 0, 'h'}, - {"wait", required_argument, 0, 'w'}, - {0, 0, 0, 0} -}; + return trace::API_UNKNOWN; +} -static int -command(int argc, char *argv[]) -{ - bool wait = false; - const char *filename; - - 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; - } +int +executeRetrace(const std::vector & opts, + const char *traceName, + trace::API api) { + const char *retraceName; + switch (api) { + case trace::API_GL: + retraceName = "glretrace"; + break; + case trace::API_EGL: + retraceName = "eglretrace"; + break; + case trace::API_DX: + case trace::API_D3D7: + case trace::API_D3D8: + case trace::API_D3D9: + case trace::API_DXGI: + // Use prefix so that it can be used with WINE + retraceName = "d3dretrace.exe"; + break; + default: + std::cerr << "warning: could not guess trace's API\n"; + retraceName = "glretrace"; + break; } - if (optind >= argc) { - std::cerr << "error: apitrace retrace requires a trace file as an argument.\n"; - usage(); - return 1; + std::vector command; + os::String retracePath = findProgram(retraceName); + if (retracePath.length()) { + command.push_back(retracePath); + } else { + command.push_back(retraceName); } - if (optind < argc - 1) { - std::cerr << "error: apitrace retrace can accept only a single trace file argument.\n"; - usage(); - return 1; + command.insert(command.end(), opts.begin(), opts.end()); + + if (traceName) { + command.push_back(traceName); } + command.push_back(NULL); - filename = argv[optind]; + return os::execute((char * const *)&command[0]); +} - std::vector command; +int +executeRetrace(const std::vector & opts, + const char *traceName) { + trace::API api = guessApi(traceName); + return executeRetrace(opts, traceName, api); +} - os::String glretracePath = trace::findProgram("glretrace"); - command.push_back(glretracePath); - if (wait) { - command.push_back("--wait"); +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]); } - command.push_back(filename); - command.push_back(NULL); + trace::API api = trace::API_GL; + if (argc >= 1) { + const char *lastArg = argv[argc -1]; + if (lastArg[0] != '-') { + api = guessApi(lastArg); + } + } - return os::execute((char * const *)&command[0]); + return executeRetrace(opts, NULL, api); } const Command retrace_command = { - "retrace", + "replay", synopsis, usage, command