/********************************************************************* * * Copyright 2011 Jose Fonseca * Copyright 2012 Intel Corporation * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * *********************************************************************/ #include #include // for CHAR_MAX #include #include #include "os_string.hpp" #include "os_process.hpp" #include "trace_parser.hpp" #include "cli_resources.hpp" #include "cli.hpp" #include "cli_retrace.hpp" static trace::API guessApi(const char *filename) { trace::Parser p; if (!p.open(filename)) { exit(1); 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 & 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; } std::vector command; os::String retracePath = findProgram(retraceName); if (retracePath.length()) { command.push_back(retracePath); } else { command.push_back(retraceName); } command.insert(command.end(), opts.begin(), opts.end()); 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 = { "replay", synopsis, usage, command };