static void
usage(void)
+{
+ std::cout
+ << "usage: apitrace trim [OPTIONS] TRACE_FILE...\n"
+ << synopsis << "\n"
+ "\n"
+ " -h, --help Show detailed help for trim options and exit\n"
+ " --calls=CALLSET Include specified calls in the trimmed output.\n"
+ " --deps Include additional calls to satisfy dependencies\n"
+ " --no-deps Do not include calls from dependency analysis\n"
+ " --prune Omit uninteresting calls from the trace output\n"
+ " --no-prune Do not prune uninteresting calls from the trace.\n"
+ " -x, --exact Include exactly the calls specified in --calls\n"
+ " Equivalent to both --no-deps and --no-prune\n"
+ " --thread=THREAD_ID Only retain calls from specified thread\n"
+ " -o, --output=TRACE_FILE Output trace file\n"
+ ;
+}
+
+static void
+help()
{
std::cout
<< "usage: apitrace trim [OPTIONS] TRACE_FILE...\n"
/* Compute and record all the resources provided by this call. */
void analyze(trace::Call *call) {
+ /* If there are no side effects, this call provides nothing. */
+ if (call->flags & trace::CALL_FLAG_NO_SIDE_EFFECTS) {
+ return;
+ }
+
+ /* Similarly, calls that swap buffers don't have other side effects. */
+ if (call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET &&
+ call->flags & trace::CALL_FLAG_END_FRAME) {
+ return;
+ }
+
+ /* By default, assume this call affects the state somehow. */
resources["state"].insert(call->no);
}
/* In pass 1, analyze which calls are needed. */
trace::Call *call;
while ((call = p.parse_call())) {
+
+ /* There's no use doing any work past the last call requested
+ * by the user. */
+ if (call->no > options->calls.getLast())
+ break;
+
/* If requested, ignore all calls not belonging to the specified thread. */
if (options->thread != -1 && call->thread_id != options->thread)
continue;
required = analyzer.get_required();
while ((call = p.parse_call())) {
+
+ /* There's no use doing any work past the last call requested
+ * by the user. */
+ if (call->no > options->calls.getLast())
+ break;
+
if (required->find(call->no) != required->end()) {
writer.writeCall(call);
}
while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
switch (opt) {
case 'h':
- usage();
+ help();
return 0;
case CALLS_OPT:
options.calls = trace::CallSet(optarg);
const Command trim_command = {
"trim",
synopsis,
- usage,
+ help,
command
};