summaryrefslogtreecommitdiff
path: root/retrace/retrace_main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'retrace/retrace_main.cpp')
-rw-r--r--retrace/retrace_main.cpp59
1 files changed, 48 insertions, 11 deletions
diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp
index fc24d385..2c3ba9d2 100644
--- a/retrace/retrace_main.cpp
+++ b/retrace/retrace_main.cpp
@@ -76,6 +76,7 @@ trace::Profiler profiler;
int verbosity = 0;
unsigned debug = 1;
bool markers = false;
+bool snapshotMRT = false;
bool forceWindowed = true;
bool dumpingState = false;
bool dumpingSnapshots = false;
@@ -126,8 +127,13 @@ frameComplete(trace::Call &call) {
class DefaultDumper: public Dumper
{
public:
+ int
+ getSnapshotCount(void) override {
+ return 0;
+ }
+
image::Image *
- getSnapshot(void) override {
+ getSnapshot(int n) override {
return NULL;
}
@@ -159,15 +165,16 @@ static Snapshotter *snapshotter;
* Take snapshots.
*/
static void
-takeSnapshot(unsigned call_no) {
- static unsigned snapshot_no = 0;
+takeSnapshot(unsigned call_no, int mrt, unsigned snapshot_no) {
assert(dumpingSnapshots);
assert(snapshotPrefix);
- std::unique_ptr<image::Image> src(dumper->getSnapshot());
+ std::unique_ptr<image::Image> src(dumper->getSnapshot(mrt));
if (!src) {
- std::cerr << call_no << ": warning: failed to get snapshot\n";
+ /* TODO for mrt>0 we probably don't want to treat this as an error: */
+ if (mrt == 0)
+ std::cerr << call_no << ": warning: failed to get snapshot\n";
return;
}
@@ -193,9 +200,21 @@ takeSnapshot(unsigned call_no) {
break;
}
} else {
- os::String filename = os::String::format("%s%010u.png",
- snapshotPrefix,
- useCallNos ? call_no : snapshot_no);
+ os::String filename;
+ unsigned no = useCallNos ? call_no : snapshot_no;
+
+ if (!retrace::snapshotMRT) {
+ assert(mrt == 0);
+ filename = os::String::format("%s%010u.png", snapshotPrefix, no);
+ } else if (mrt == -2) {
+ /* stencil */
+ filename = os::String::format("%s%010u-s.png", snapshotPrefix, no);
+ } else if (mrt == -1) {
+ /* depth */
+ filename = os::String::format("%s%010u-z.png", snapshotPrefix, no);
+ } else {
+ filename = os::String::format("%s%010u-mrt%u.png", snapshotPrefix, no, mrt);
+ }
// Here we release our ownership on the Image, it is now the
// responsibility of the snapshotter to delete it.
@@ -203,11 +222,24 @@ takeSnapshot(unsigned call_no) {
}
}
- snapshot_no++;
-
return;
}
+static void
+takeSnapshot(unsigned call_no) {
+ static unsigned snapshot_no = 0;
+ int cnt = dumper->getSnapshotCount();
+
+ if (retrace::snapshotMRT) {
+ for (int mrt = -2; mrt < cnt; mrt++) {
+ takeSnapshot(call_no, mrt, snapshot_no);
+ }
+ } else {
+ takeSnapshot(call_no, 0, snapshot_no);
+ }
+
+ snapshot_no++;
+}
/**
* Retrace one call.
@@ -620,6 +652,7 @@ usage(const char *argv0) {
" --fullscreen allow fullscreen\n"
" --headless don't show windows\n"
" --sb use a single buffer visual\n"
+ " -m, --mrt dump all MRTs and depth/stencil\n"
" -s, --snapshot-prefix=PREFIX take snapshots; `-` for PNM stdout output\n"
" --snapshot-format=FMT use (PNM, RGB, or MD5; default is PNM) when writing to stdout output\n"
" -S, --snapshot=CALLSET calls to snapshot (default is every frame)\n"
@@ -660,7 +693,7 @@ enum {
};
const static char *
-shortOptions = "bdD:hs:S:vwt";
+shortOptions = "bdD:hms:S:vwt";
const static struct option
longOptions[] = {
@@ -677,6 +710,7 @@ longOptions[] = {
{"fullscreen", no_argument, 0, FULLSCREEN_OPT},
{"headless", no_argument, 0, HEADLESS_OPT},
{"help", no_argument, 0, 'h'},
+ {"mrt", no_argument, 0, 'm'},
{"pcpu", no_argument, 0, PCPU_OPT},
{"pgpu", no_argument, 0, PGPU_OPT},
{"ppd", no_argument, 0, PPD_OPT},
@@ -782,6 +816,9 @@ int main(int argc, char **argv)
case HEADLESS_OPT:
ws::headless = true;
break;
+ case 'm':
+ retrace::snapshotMRT = true;
+ break;
case SB_OPT:
retrace::doubleBuffer = false;
break;