+/*********************************************************************
+ *
+ * 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 <string.h>
+#include <limits.h> // for CHAR_MAX
+#include <getopt.h>
+#include <iostream>
+
+#include "cli.hpp"
+
+#include "os_string.hpp"
+#include "os_process.hpp"
+
+#include "trace_resource.hpp"
+
+static const char *synopsis = "Replay a trace.";
+
+static void
+usage(void)
+{
+ std::cout << "usage apitrace replay [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";
+
+const static struct option
+longOptions[] = {
+ {"help", no_argument, 0, 'h'},
+ {"wait", required_argument, 0, 'w'},
+ {0, 0, 0, 0}
+};
+
+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;
+ }
+ }
+
+ if (optind >= argc) {
+ std::cerr << "error: apitrace replay requires a trace file as an argument.\n";
+ usage();
+ return 1;
+ }
+
+ if (optind < argc - 1) {
+ std::cerr << "error: apitrace replay can accept only a single trace file argument.\n";
+ usage();
+ return 1;
+ }
+
+ filename = argv[optind];
+
+ /* FIXME: It would be cleaner to pull the replaying of the trace
+ * in-process here and generate the images directly. But that
+ * pulls in a non-trivial amount of the existing 'retrace' code,
+ * along with dependencies on GL, etc.
+ */
+ 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]);
+}
+
+const Command replay_command = {
+ "replay",
+ synopsis,
+ usage,
+ command
+};