#include <getopt.h>
#include <iostream>
-#include "cli.hpp"
-
#include "os_string.hpp"
#include "os_process.hpp"
+#include "trace_parser.hpp"
#include "trace_resource.hpp"
+#include "cli.hpp"
+#include "cli_retrace.hpp"
+
static const char *synopsis = "Replay a trace.";
static void
usage(void)
{
- std::cout << "usage apitrace retrace [OPTIONS] TRACE_FILE\n"
+ std::cout << "usage: apitrace retrace [OPTIONS] TRACE_FILE\n"
<< synopsis << "\n"
"\n"
" -h, --help Show this help message and exit\n"
{0, 0, 0, 0}
};
+static trace::API
+guessApi(const char *filename)
+{
+ trace::Parser p;
+ if (!p.open(filename)) {
+ return trace::API_UNKNOWN;
+ }
+ trace::Call *call;
+ while ((call = p.parse_call())) {
+ delete call;
+
+ if (p.api != trace::API_UNKNOWN) {
+ return p.api;
+ }
+ }
+
+ return trace::API_UNKNOWN;
+}
+
+int
+executeRetrace(const std::vector<const char *> & 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_D3D10:
+ case trace::API_D3D10_1:
+ case trace::API_D3D11:
+ // Can be used with WINE
+ retraceName = "d3dretrace.exe";
+ break;
+ default:
+ std::cerr << "warning: could not guess trace's API\n";
+ retraceName = "glretrace";
+ break;
+ }
+
+ std::vector<const char *> command;
+ os::String retracePath = trace::findProgram(retraceName);
+ if (retracePath.length()) {
+ command.push_back(retracePath);
+ } else {
+ command.push_back(retraceName);
+ }
+
+ command.insert(command.end(), opts.begin(), opts.end());
+
+ command.push_back(traceName);
+ command.push_back(NULL);
+
+ return os::execute((char * const *)&command[0]);
+}
+
+int
+executeRetrace(const std::vector<const char *> & opts,
+ const char *traceName) {
+ trace::API api = guessApi(traceName);
+ return executeRetrace(opts, traceName, api);
+}
+
static int
command(int argc, char *argv[])
{
- bool wait = false;
- const char *filename;
+ std::vector<const char *> opts;
+
+ const char *traceName;
int opt;
while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
usage();
return 0;
case 'w':
- wait = true;
+ opts.push_back("--wait");
break;
default:
std::cerr << "error: unexpected option `" << opt << "`\n";
return 1;
}
- filename = argv[optind];
+ traceName = argv[optind];
- std::vector<const char *> command;
-
- os::String glretracePath = trace::findProgram("glretrace");
- command.push_back(glretracePath);
-
- if (wait) {
- command.push_back("--wait");
- }
-
- command.push_back(filename);
- command.push_back(NULL);
-
- return os::execute((char * const *)&command[0]);
+ return executeRetrace(opts, traceName);
}
const Command retrace_command = {