+++ /dev/null
-/**************************************************************************
- *
- * Copyright 2011 Jose Fonseca
- * Copyright 2008-2010 VMware, Inc.
- * 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 <assert.h>
-#include <math.h>
-
-#include <algorithm>
-
-#include "image.hpp"
-
-
-namespace image {
-
-
-double Image::compare(Image &ref)
-{
- if (width != ref.width ||
- height != ref.height ||
- channels < 3 ||
- ref.channels < 3) {
- return 0.0;
- }
-
- // Ignore missing alpha when comparing RGB w/ RGBA, but enforce an equal
- // number of channels otherwise.
- unsigned minChannels = std::min(channels, ref.channels);
- if (channels != ref.channels && minChannels < 3) {
- return 0.0;
- }
-
- const unsigned char *pSrc = start();
- const unsigned char *pRef = ref.start();
-
- unsigned long long error = 0;
- for (unsigned y = 0; y < height; ++y) {
- for (unsigned x = 0; x < width; ++x) {
- // FIXME: Ignore alpha channel until we are able to pick a visual
- // that matches the traces
- for (unsigned c = 0; c < minChannels; ++c) {
- int delta = pSrc[x*channels + c] - pRef[x*ref.channels + c];
- error += delta*delta;
- }
- }
-
- pSrc += stride();
- pRef += ref.stride();
- }
-
- double numerator = error*2 + 1;
- double denominator = height*width*minChannels*255ULL*255ULL*2;
- double quotient = numerator/denominator;
-
- // Precision in bits
- double precision = -log(quotient)/log(2.0);
-
- return precision;
-}
-
-
-} /* namespace image */
static bool waitOnFinish = false;
static bool loopOnFinish = false;
-static const char *comparePrefix = NULL;
static const char *snapshotPrefix = NULL;
static enum {
PNM_FMT,
} snapshotFormat = PNM_FMT;
static trace::CallSet snapshotFrequency;
-static trace::CallSet compareFrequency;
static trace::ParseBookmark lastFrameStart;
static unsigned dumpStateCallNo = ~0;
/**
- * 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) {
}
}
- if (ref) {
- std::cout << "Snapshot " << call_no << " average precision of " << src->compare(*ref) << " bits\n";
- delete ref;
- }
-
delete src;
snapshot_no++;
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.
" --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"
};
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},
using namespace retrace;
int i;
- assert(compareFrequency.empty());
assert(snapshotFrequency.empty());
int opt;
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;