| Index: tools/VisualBench/VisualBench.cpp
|
| diff --git a/tools/VisualBench/VisualBench.cpp b/tools/VisualBench/VisualBench.cpp
|
| index 3a6cb5012f67b3d8c211ce45e6aacb078720d89d..43dc56d980966bcc4bc23477b6a759282892adc0 100644
|
| --- a/tools/VisualBench/VisualBench.cpp
|
| +++ b/tools/VisualBench/VisualBench.cpp
|
| @@ -36,6 +36,9 @@ DEFINE_int32(msaa, 0, "Number of msaa samples.");
|
| DEFINE_bool2(fullscreen, f, true, "Run fullscreen.");
|
| DEFINE_bool2(verbose, v, false, "enable verbose output from the test driver.");
|
| DEFINE_string(key, "", ""); // dummy to enable gm tests that have platform-specific names
|
| +DEFINE_string(outResultsFile, "", "If given, write results here as JSON.");
|
| +DEFINE_string(properties, "",
|
| + "Space-separated key/value pairs to add to JSON identifying this run.");
|
|
|
| static SkString humanize(double ms) {
|
| if (FLAGS_verbose) {
|
| @@ -53,7 +56,8 @@ VisualBench::VisualBench(void* hwnd, int argc, char** argv)
|
| , fFlushes(1)
|
| , fLoops(1)
|
| , fState(kPreWarmLoops_State)
|
| - , fBenchmark(NULL) {
|
| + , fBenchmark(NULL)
|
| + , fResults(SkNEW(ResultsWriter)) {
|
| SkCommandLineFlags::Parse(argc, argv);
|
|
|
| this->setTitle();
|
| @@ -63,6 +67,19 @@ VisualBench::VisualBench(void* hwnd, int argc, char** argv)
|
|
|
| // Print header
|
| SkDebugf("curr/maxrss\tloops\tflushes\tmin\tmedian\tmean\tmax\tstddev\tbench\n");
|
| +
|
| + // setup json logging if required
|
| + if (!FLAGS_outResultsFile.isEmpty()) {
|
| + fResults.reset(SkNEW(NanoJSONResultsWriter(FLAGS_outResultsFile[0])));
|
| + }
|
| +
|
| + if (1 == FLAGS_properties.count() % 2) {
|
| + SkDebugf("ERROR: --properties must be passed with an even number of arguments.\n");
|
| + } else {
|
| + for (int i = 1; i < FLAGS_properties.count(); i += 2) {
|
| + fResults->property(FLAGS_properties[i - 1], FLAGS_properties[i]);
|
| + }
|
| + }
|
| }
|
|
|
| VisualBench::~VisualBench() {
|
| @@ -136,14 +153,28 @@ inline void VisualBench::renderFrame(SkCanvas* canvas) {
|
| void VisualBench::printStats() {
|
| const SkTArray<double>& measurements = fRecords.back().fMeasurements;
|
| const char* shortName = fBenchmark->getUniqueName();
|
| +
|
| + // update log
|
| + // Note: We currently log only the minimum. It would be interesting to log more information
|
| + SkString configName;
|
| + if (FLAGS_msaa > 0) {
|
| + configName.appendf("msaa_%d", FLAGS_msaa);
|
| + } else {
|
| + configName.appendf("gpu");
|
| + }
|
| + fResults->config(configName.c_str());
|
| + fResults->configOption("name", fBenchmark->getUniqueName());
|
| + SkASSERT(measurements.count());
|
| + Stats stats(measurements);
|
| + fResults->metric("min_ms", stats.min);
|
| +
|
| + // Print output
|
| if (FLAGS_verbose) {
|
| for (int i = 0; i < measurements.count(); i++) {
|
| SkDebugf("%s ", HUMANIZE(measurements[i]));
|
| }
|
| SkDebugf("%s\n", shortName);
|
| } else {
|
| - SkASSERT(measurements.count());
|
| - Stats stats(measurements);
|
| const double stdDevPercent = 100 * sqrt(stats.var) / stats.mean;
|
| SkDebugf("%4d/%-4dMB\t%d\t%d\t%s\t%s\t%s\t%s\t%.0f%%\t%s\n",
|
| sk_tools::getCurrResidentSetSizeMB(),
|
| @@ -172,6 +203,10 @@ bool VisualBench::advanceRecordIfNecessary(SkCanvas* canvas) {
|
| canvas->clear(0xffffffff);
|
| fBenchmark->preDraw();
|
| fRecords.push_back();
|
| +
|
| + // Log bench name
|
| + fResults->bench(fBenchmark->getUniqueName(), fBenchmark->getSize().fX,
|
| + fBenchmark->getSize().fY);
|
| return true;
|
| }
|
|
|
|
|