| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index 853492b3e05250b65aaca716dec5bf371c352ecd..67646c266770adccafd78800b98850dd8f19ff97 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -12,6 +12,7 @@
|
| #include "GMBench.h"
|
| #include "ProcStats.h"
|
| #include "ResultsWriter.h"
|
| +#include "RecordingBench.h"
|
| #include "SKPBench.h"
|
| #include "Stats.h"
|
| #include "Timer.h"
|
| @@ -407,6 +408,7 @@ class BenchmarkStream {
|
| public:
|
| BenchmarkStream() : fBenches(BenchRegistry::Head())
|
| , fGMs(skiagm::GMRegistry::Head())
|
| + , fCurrentRecording(0)
|
| , fCurrentScale(0)
|
| , fCurrentSKP(0) {
|
| for (int i = 0; i < FLAGS_skps.count(); i++) {
|
| @@ -435,11 +437,33 @@ public:
|
| }
|
| }
|
|
|
| + static bool ReadPicture(const char* path, SkAutoTUnref<SkPicture>* pic) {
|
| + // Not strictly necessary, as it will be checked again later,
|
| + // but helps to avoid a lot of pointless work if we're going to skip it.
|
| + if (SkCommandLineFlags::ShouldSkip(FLAGS_match, path)) {
|
| + return false;
|
| + }
|
| +
|
| + SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path));
|
| + if (stream.get() == NULL) {
|
| + SkDebugf("Could not read %s.\n", path);
|
| + return false;
|
| + }
|
| +
|
| + pic->reset(SkPicture::CreateFromStream(stream.get()));
|
| + if (pic->get() == NULL) {
|
| + SkDebugf("Could not read %s as an SkPicture.\n", path);
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| Benchmark* next() {
|
| if (fBenches) {
|
| Benchmark* bench = fBenches->factory()(NULL);
|
| fBenches = fBenches->next();
|
| fSourceType = "bench";
|
| + fBenchType = "micro";
|
| return bench;
|
| }
|
|
|
| @@ -448,34 +472,32 @@ public:
|
| fGMs = fGMs->next();
|
| if (gm->getFlags() & skiagm::GM::kAsBench_Flag) {
|
| fSourceType = "gm";
|
| + fBenchType = "micro";
|
| return SkNEW_ARGS(GMBench, (gm.detach()));
|
| }
|
| }
|
|
|
| + // First add all .skps as RecordingBenches.
|
| + while (fCurrentRecording < fSKPs.count()) {
|
| + const SkString& path = fSKPs[fCurrentRecording++];
|
| + SkAutoTUnref<SkPicture> pic;
|
| + if (!ReadPicture(path.c_str(), &pic)) {
|
| + continue;
|
| + }
|
| + SkString name = SkOSPath::Basename(path.c_str());
|
| + fSourceType = "skp";
|
| + fBenchType = "recording";
|
| + return SkNEW_ARGS(RecordingBench, (name.c_str(), pic.get(), FLAGS_bbh));
|
| + }
|
| +
|
| + // Then once each for each scale as SKPBenches (playback).
|
| while (fCurrentScale < fScales.count()) {
|
| while (fCurrentSKP < fSKPs.count()) {
|
| const SkString& path = fSKPs[fCurrentSKP++];
|
| -
|
| - // Not strictly necessary, as it will be checked again later,
|
| - // but helps to avoid a lot of pointless work if we're going to skip it.
|
| - if (SkCommandLineFlags::ShouldSkip(FLAGS_match, path.c_str())) {
|
| + SkAutoTUnref<SkPicture> pic;
|
| + if (!ReadPicture(path.c_str(), &pic)) {
|
| continue;
|
| }
|
| -
|
| - SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path.c_str()));
|
| - if (stream.get() == NULL) {
|
| - SkDebugf("Could not read %s.\n", path.c_str());
|
| - exit(1);
|
| - }
|
| -
|
| - SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(stream.get()));
|
| - if (pic.get() == NULL) {
|
| - SkDebugf("Could not read %s as an SkPicture.\n", path.c_str());
|
| - exit(1);
|
| - }
|
| -
|
| - SkString name = SkOSPath::Basename(path.c_str());
|
| -
|
| if (FLAGS_bbh) {
|
| // The SKP we read off disk doesn't have a BBH. Re-record so it grows one.
|
| // Here we use an SkTileGrid with parameters optimized for FLAGS_clip.
|
| @@ -491,8 +513,9 @@ public:
|
| &factory));
|
| pic.reset(recorder.endRecording());
|
| }
|
| -
|
| + SkString name = SkOSPath::Basename(path.c_str());
|
| fSourceType = "skp";
|
| + fBenchType = "playback";
|
| return SkNEW_ARGS(SKPBench,
|
| (name.c_str(), pic.get(), fClip, fScales[fCurrentScale]));
|
| }
|
| @@ -505,6 +528,7 @@ public:
|
|
|
| void fillCurrentOptions(ResultsWriter* log) const {
|
| log->configOption("source_type", fSourceType);
|
| + log->configOption("bench_type", fBenchType);
|
| if (0 == strcmp(fSourceType, "skp")) {
|
| log->configOption("clip",
|
| SkStringPrintf("%d %d %d %d", fClip.fLeft, fClip.fTop,
|
| @@ -520,7 +544,9 @@ private:
|
| SkTArray<SkScalar> fScales;
|
| SkTArray<SkString> fSKPs;
|
|
|
| - const char* fSourceType;
|
| + const char* fSourceType; // What we're benching: bench, GM, SKP, ...
|
| + const char* fBenchType; // How we bench it: micro, recording, playback, ...
|
| + int fCurrentRecording;
|
| int fCurrentScale;
|
| int fCurrentSKP;
|
| };
|
|
|