X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fretrace_main.cpp;h=bff8983b15a99becb7ac6dbe06ab58fcffcafdf5;hb=66ce10aed5cd8c4b1df5b53645b92ee81b16d8e2;hp=492deca4a921f822c2404bdb474b5c480e470606;hpb=90808c138de511a81b6b85d22a9400007d91336b;p=apitrace diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp index 492deca..bff8983 100644 --- a/retrace/retrace_main.cpp +++ b/retrace/retrace_main.cpp @@ -30,6 +30,9 @@ #include // for CHAR_MAX #include #include +#ifndef _WIN32 +#include // for isatty() +#endif #include "os_binary.hpp" #include "os_time.hpp" @@ -44,7 +47,6 @@ static bool waitOnFinish = false; static bool loopOnFinish = false; -static const char *comparePrefix = NULL; static const char *snapshotPrefix = NULL; static enum { PNM_FMT, @@ -52,7 +54,6 @@ static enum { } snapshotFormat = PNM_FMT; static trace::CallSet snapshotFrequency; -static trace::CallSet compareFrequency; static trace::ParseBookmark lastFrameStart; static unsigned dumpStateCallNo = ~0; @@ -101,26 +102,13 @@ Dumper *dumper = &defaultDumper; /** - * Take/compare snapshots. + * Take snapshots. */ static void takeSnapshot(unsigned call_no) { static unsigned snapshot_no = 0; - assert(snapshotPrefix || comparePrefix); - - image::Image *ref = NULL; - - if (comparePrefix) { - os::String filename = os::String::format("%s%010u.png", comparePrefix, call_no); - ref = image::readPNG(filename); - if (!ref) { - return; - } - if (retrace::verbosity >= 0) { - std::cout << "Read " << filename << "\n"; - } - } + assert(snapshotPrefix); image::Image *src = dumper->getSnapshot(); if (!src) { @@ -147,11 +135,6 @@ takeSnapshot(unsigned call_no) { } } - if (ref) { - std::cout << "Snapshot " << call_no << " average precision of " << src->compare(*ref) << " bits\n"; - delete ref; - } - delete src; snapshot_no++; @@ -170,8 +153,7 @@ static void retraceCall(trace::Call *call) { bool swapRenderTarget = call->flags & trace::CALL_FLAG_SWAP_RENDERTARGET; - bool doSnapshot = snapshotFrequency.contains(*call) || - compareFrequency.contains(*call); + bool doSnapshot = snapshotFrequency.contains(*call); // For calls which cause rendertargets to be swaped, we take the // snapshot _before_ swapping the rendertargets. @@ -284,6 +266,12 @@ public: } } + ~RelayRunner() { + if (thread.joinable()) { + thread.join(); + } + } + /** * Thread main loop. */ @@ -567,8 +555,6 @@ usage(const char *argv0) { " --pgpu gpu profiling (gpu times per draw call)\n" " --ppd pixels drawn profiling (pixels drawn per draw call)\n" " --pmem memory usage profiling (vsize rss per 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" @@ -600,14 +586,12 @@ enum { }; const static char * -shortOptions = "bc:C:D:hs:S:vw"; +shortOptions = "bD:hs:S:vw"; 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}, {"db", no_argument, 0, DB_OPT}, {"driver", required_argument, 0, DRIVER_OPT}, @@ -641,7 +625,6 @@ int main(int argc, char **argv) using namespace retrace; int i; - assert(compareFrequency.empty()); assert(snapshotFrequency.empty()); int opt; @@ -657,18 +640,6 @@ int main(int argc, char **argv) case CALL_NOS_OPT: useCallNos = trace::boolOption(optarg); break; - case 'c': - comparePrefix = optarg; - if (compareFrequency.empty()) { - compareFrequency = trace::CallSet(trace::FREQUENCY_FRAME); - } - break; - case 'C': - compareFrequency = trace::CallSet(optarg); - if (comparePrefix == NULL) { - comparePrefix = ""; - } - break; case 'D': dumpStateCallNo = atoi(optarg); dumpingState = true; @@ -708,6 +679,23 @@ int main(int argc, char **argv) if (snapshotPrefix[0] == '-' && snapshotPrefix[1] == 0) { os::setBinaryMode(stdout); retrace::verbosity = -2; + } else { + /* + * Create the snapshot directory if it does not exist. + * + * We can't just use trimFilename() because when applied to + * "/foo/boo/" it would merely return "/foo". + * + * XXX: create nested directories. + */ + os::String prefix(snapshotPrefix); + os::String::iterator sep = prefix.rfindSep(false); + if (sep != prefix.end()) { + prefix.erase(sep, prefix.end()); + if (!prefix.exists() && !os::createDirectory(prefix)) { + std::cerr << "error: failed to create `" << prefix.str() << "` directory\n"; + } + } } break; case SNAPSHOT_FORMAT_OPT: @@ -766,6 +754,12 @@ int main(int argc, char **argv) } } +#ifndef _WIN32 + if (!isatty(STDOUT_FILENO)) { + dumpFlags |= trace::DUMP_FLAG_NO_COLOR; + } +#endif + retrace::setUp(); if (retrace::profiling) { retrace::profiler.setup(retrace::profilingCpuTimes, retrace::profilingGpuTimes, retrace::profilingPixelsDrawn, retrace::profilingMemoryUsage);