aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2015-12-02 09:05:37 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-02 09:05:38 -0800
commite45c81c8f3bb62e45f2ff3b8772b4b23f1ddc6ca (patch)
treefba6f2308c97b0ff2b611447a2d78e32f990be89 /bench
parent6ee690e1d838e152c134257bdd57e9a1509ee7c2 (diff)
Began logging more gpu stats from nanobench
Diffstat (limited to 'bench')
-rw-r--r--bench/Benchmark.h2
-rw-r--r--bench/ResultsWriter.h14
-rw-r--r--bench/SKPBench.cpp38
-rw-r--r--bench/SKPBench.h2
-rw-r--r--bench/nanobench.cpp26
5 files changed, 73 insertions, 9 deletions
diff --git a/bench/Benchmark.h b/bench/Benchmark.h
index a403a6e318..30c7aa9345 100644
--- a/bench/Benchmark.h
+++ b/bench/Benchmark.h
@@ -124,6 +124,8 @@ public:
this->perCanvasPostDraw(canvas);
}
+ virtual void getGpuStats(SkCanvas*, SkTArray<SkString>* keys, SkTArray<double>* values) {}
+
protected:
virtual void setupPaint(SkPaint* paint);
diff --git a/bench/ResultsWriter.h b/bench/ResultsWriter.h
index 2906429bf0..bf74d47826 100644
--- a/bench/ResultsWriter.h
+++ b/bench/ResultsWriter.h
@@ -87,26 +87,26 @@ public:
}
// Added under "key".
- virtual void key(const char name[], const char value[]) {
+ void key(const char name[], const char value[]) override {
fRoot["key"][name] = value;
}
// Inserted directly into the root.
- virtual void property(const char name[], const char value[]) {
+ void property(const char name[], const char value[]) override {
fRoot[name] = value;
}
- virtual void bench(const char name[], int32_t x, int32_t y) {
+ void bench(const char name[], int32_t x, int32_t y) override {
SkString id = SkStringPrintf( "%s_%d_%d", name, x, y);
fResults[id.c_str()] = Json::Value(Json::objectValue);
fBench = &fResults[id.c_str()];
}
- virtual void config(const char name[]) {
+ void config(const char name[]) override {
SkASSERT(fBench);
fConfig = &(*fBench)[name];
}
- virtual void configOption(const char name[], const char* value) {
+ void configOption(const char name[], const char* value) override {
(*fConfig)["options"][name] = value;
}
- virtual void metric(const char name[], double ms) {
+ void metric(const char name[], double ms) override {
// Don't record if nan, or -nan.
if (sk_double_isnan(ms)) {
return;
@@ -116,7 +116,7 @@ public:
}
// Flush to storage now please.
- virtual void flush() {
+ void flush() override {
SkString dirname = SkOSPath::Dirname(fFilename.c_str());
if (!sk_exists(dirname.c_str(), kWrite_SkFILE_Flag)) {
if (!sk_mkdir(dirname.c_str())) {
diff --git a/bench/SKPBench.cpp b/bench/SKPBench.cpp
index 910af6b802..c548090405 100644
--- a/bench/SKPBench.cpp
+++ b/bench/SKPBench.cpp
@@ -155,3 +155,41 @@ void SKPBench::drawPicture() {
fSurfaces[j]->getCanvas()->flush();
}
}
+
+#if SK_SUPPORT_GPU
+static void draw_pic_for_stats(SkCanvas* canvas, GrContext* context, const SkPicture* picture,
+ SkTArray<SkString>* keys, SkTArray<double>* values,
+ const char* tag) {
+ context->resetGpuStats();
+ canvas->drawPicture(picture);
+ canvas->flush();
+
+ int offset = keys->count();
+ context->dumpGpuStatsKeyValuePairs(keys, values);
+
+ // append tag, but only to new tags
+ for (int i = offset; i < keys->count(); i++, offset++) {
+ (*keys)[i].appendf("_%s", tag);
+ }
+}
+#endif
+
+void SKPBench::getGpuStats(SkCanvas* canvas, SkTArray<SkString>* keys, SkTArray<double>* values) {
+#if SK_SUPPORT_GPU
+ // we do a special single draw and then dump the key / value pairs
+ GrContext* context = canvas->getGrContext();
+ if (!context) {
+ return;
+ }
+
+ // TODO refactor this out if we want to test other subclasses of skpbench
+ context->flush();
+ context->freeGpuResources();
+ context->resetContext();
+ draw_pic_for_stats(canvas, context, fPic, keys, values, "first_frame");
+
+ // draw second frame
+ draw_pic_for_stats(canvas, context, fPic, keys, values, "second_frame");
+
+#endif
+}
diff --git a/bench/SKPBench.h b/bench/SKPBench.h
index 89c9a369a0..1f34a003b2 100644
--- a/bench/SKPBench.h
+++ b/bench/SKPBench.h
@@ -28,6 +28,8 @@ public:
return fDoLooping ? defaultLoops : 1;
}
+ void getGpuStats(SkCanvas*, SkTArray<SkString>* keys, SkTArray<double>* values) override;
+
protected:
const char* onGetName() override;
const char* onGetUniqueName() override;
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index 99483ebd99..602d6137ca 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -107,6 +107,7 @@ DEFINE_bool(loopSKP, true, "Loop SKPs like we do for micro benches?");
DEFINE_int32(flushEvery, 10, "Flush --outResultsFile every Nth run.");
DEFINE_bool(resetGpuContext, true, "Reset the GrContext before running each test.");
DEFINE_bool(gpuStats, false, "Print GPU stats after each gpu benchmark?");
+DEFINE_bool(gpuStatsDump, false, "Dump GPU states after each benchmark to json");
static double now_ms() { return SkTime::GetNSecs() * 1e-6; }
@@ -1184,6 +1185,16 @@ int nanobench_main() {
}
}
+#if SK_SUPPORT_GPU
+ SkTArray<SkString> keys;
+ SkTArray<double> values;
+ bool gpuStatsDump = FLAGS_gpuStatsDump && Benchmark::kGPU_Backend == configs[i].backend;
+ if (gpuStatsDump) {
+ // TODO cache stats
+ bench->getGpuStats(canvas, &keys, &values);
+ }
+#endif
+
bench->perCanvasPostDraw(canvas);
if (Benchmark::kNonRendering_Backend != target->config.backend &&
@@ -1206,6 +1217,16 @@ int nanobench_main() {
benchStream.fillCurrentOptions(log.get());
target->fillOptions(log.get());
log->metric("min_ms", stats.min);
+#if SK_SUPPORT_GPU
+ if (gpuStatsDump) {
+ // dump to json, only SKPBench currently returns valid keys / values
+ SkASSERT(keys.count() == values.count());
+ for (int i = 0; i < keys.count(); i++) {
+ log->metric(keys[i].c_str(), values[i]);
+ }
+ }
+#endif
+
if (runs++ % FLAGS_flushEvery == 0) {
log->flush();
}
@@ -1240,13 +1261,14 @@ int nanobench_main() {
, bench->getUniqueName()
);
}
+
#if SK_SUPPORT_GPU
- if (FLAGS_gpuStats &&
- Benchmark::kGPU_Backend == configs[i].backend) {
+ if (FLAGS_gpuStats && Benchmark::kGPU_Backend == configs[i].backend) {
gGrFactory->get(configs[i].ctxType)->printCacheStats();
gGrFactory->get(configs[i].ctxType)->printGpuStats();
}
#endif
+
if (FLAGS_verbose) {
SkDebugf("Samples: ");
for (int i = 0; i < samples.count(); i++) {