It is sometimes inconvenient to have call numbers encoded within the
snapshot filenames. For example, when doing tests of "apitrace trim"
in the test suite the call numbers frequently change even when the
image contents do not.
By accepting the --call-nos=no option, these programs will now
generate filenames with sequential numbers starting from 0 rather than
using call numbers in the filenames.
std::cout << "usage apitrace dump-images [OPTIONS] TRACE_FILE\n"
<< synopsis << "\n"
"\n"
std::cout << "usage apitrace dump-images [OPTIONS] TRACE_FILE\n"
<< synopsis << "\n"
"\n"
- " -h, --help show this help message and exit\n"
- " --calls=CALLSET dump images only for specified calls\n"
- " (default value is \"*/frame\" which\n"
- " which dumps an image for each frame)\n"
- " -o, --output=PREFIX prefix to use in naming output files\n"
- " (default is trace filename without extension)\n"
+ " -h, --help show this help message and exit\n"
+ " --calls=CALLSET dump images only for specified calls\n"
+ " (default value is \"*/frame\" which\n"
+ " which dumps an image for each frame)\n"
+ " --call-nos[=BOOL] use call numbers in image filenames,\n"
+ " otherwise use sequental numbers (default=yes)\n"
+ " -o, --output=PREFIX prefix to use in naming output files\n"
+ " (default is trace filename without extension)\n"
"\n";
}
enum {
CALLS_OPT = CHAR_MAX + 1,
"\n";
}
enum {
CALLS_OPT = CHAR_MAX + 1,
longOptions[] = {
{"help", no_argument, 0, 'h'},
{"calls", required_argument, 0, CALLS_OPT},
longOptions[] = {
{"help", no_argument, 0, 'h'},
{"calls", required_argument, 0, CALLS_OPT},
+ {"call-nos", optional_argument, 0, CALL_NOS_OPT},
{"output", required_argument, 0, 'o'},
{0, 0, 0, 0}
};
{"output", required_argument, 0, 'o'},
{0, 0, 0, 0}
};
const char *calls = NULL;
const char *traceName = NULL;
const char *output = NULL;
const char *calls = NULL;
const char *traceName = NULL;
const char *output = NULL;
int opt;
while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
int opt;
while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
case CALLS_OPT:
calls = optarg;
break;
case CALLS_OPT:
calls = optarg;
break;
+ case CALL_NOS_OPT:
+ call_nos = std::string("--call-nos=") + optarg;
+ break;
case 'o':
output = optarg;
break;
case 'o':
output = optarg;
break;
opts.push_back(calls);
else
opts.push_back("*/frame");
opts.push_back(calls);
else
opts.push_back("*/frame");
+ if (!call_nos.empty()) {
+ opts.push_back(call_nos.c_str());
+ }
return executeRetrace(opts, traceName);
}
return executeRetrace(opts, traceName);
}
#include "image.hpp"
#include "trace_callset.hpp"
#include "trace_dump.hpp"
#include "image.hpp"
#include "trace_callset.hpp"
#include "trace_dump.hpp"
+#include "trace_option.hpp"
bool profilingGpuTimes = false;
bool profilingCpuTimes = false;
bool profilingPixelsDrawn = false;
bool profilingGpuTimes = false;
bool profilingCpuTimes = false;
bool profilingPixelsDrawn = false;
unsigned frameNo = 0;
unsigned callNo = 0;
unsigned frameNo = 0;
unsigned callNo = 0;
*/
static void
takeSnapshot(unsigned call_no) {
*/
static void
takeSnapshot(unsigned call_no) {
+ static unsigned snapshot_no = 0;
+
assert(snapshotPrefix || comparePrefix);
image::Image *ref = NULL;
assert(snapshotPrefix || comparePrefix);
image::Image *ref = NULL;
if (snapshotPrefix) {
if (snapshotPrefix[0] == '-' && snapshotPrefix[1] == 0) {
char comment[21];
if (snapshotPrefix) {
if (snapshotPrefix[0] == '-' && snapshotPrefix[1] == 0) {
char comment[21];
- snprintf(comment, sizeof comment, "%u", call_no);
+ snprintf(comment, sizeof comment, "%u",
+ useCallNos ? call_no : snapshot_no);
src->writePNM(std::cout, comment);
} else {
src->writePNM(std::cout, comment);
} else {
- os::String filename = os::String::format("%s%010u.png", snapshotPrefix, call_no);
+ os::String filename = os::String::format("%s%010u.png",
+ snapshotPrefix,
+ useCallNos ? call_no : snapshot_no);
if (src->writePNG(filename) && retrace::verbosity >= 0) {
std::cout << "Wrote " << filename << "\n";
}
if (src->writePNG(filename) && retrace::verbosity >= 0) {
std::cout << "Wrote " << filename << "\n";
}
" --ppd pixels drawn profiling (pixels drawn per draw call)\n"
" -c, --compare=PREFIX compare against snapshots with given PREFIX\n"
" -C, --calls=CALLSET calls to compare (default is every frame)\n"
" --ppd pixels drawn profiling (pixels drawn per draw call)\n"
" -c, --compare=PREFIX compare against snapshots with given PREFIX\n"
" -C, --calls=CALLSET calls to compare (default is every frame)\n"
+ " --call-nos[=BOOL] use call numbers in snapshot filenames\n"
" --core use core profile\n"
" --db use a double buffer visual (default)\n"
" --driver=DRIVER force driver type (`hw`, `sw`, `ref`, `null`, or driver module name)\n"
" --core use core profile\n"
" --db use a double buffer visual (default)\n"
" --driver=DRIVER force driver type (`hw`, `sw`, `ref`, `null`, or driver module name)\n"
- CORE_OPT = CHAR_MAX + 1,
+ CALL_NOS_OPT = CHAR_MAX + 1,
+ CORE_OPT,
DB_OPT,
DRIVER_OPT,
PCPU_OPT,
DB_OPT,
DRIVER_OPT,
PCPU_OPT,
const static struct option
longOptions[] = {
{"benchmark", no_argument, 0, 'b'},
const static struct option
longOptions[] = {
{"benchmark", no_argument, 0, 'b'},
+ {"call-nos", optional_argument, 0, CALL_NOS_OPT },
{"calls", required_argument, 0, 'C'},
{"compare", required_argument, 0, 'c'},
{"core", no_argument, 0, CORE_OPT},
{"calls", required_argument, 0, 'C'},
{"compare", required_argument, 0, 'c'},
{"core", no_argument, 0, CORE_OPT},
retrace::debug = false;
retrace::verbosity = -1;
break;
retrace::debug = false;
retrace::verbosity = -1;
break;
+ case CALL_NOS_OPT:
+ useCallNos = trace::boolOption(optarg);
+ break;
case 'c':
comparePrefix = optarg;
if (compareFrequency.empty()) {
case 'c':
comparePrefix = optarg;
if (compareFrequency.empty()) {