DM: also run benches once.

Also:
  - make GrMemoryPoolBenches threadsafe
  - some tweaks to various DM code
  - rename GM::shortName() to getName() to match benches and tests

On my desktop, (289 GMs, 617 benches) x 4 configs, 227 tests takes 46s in Debug, 14s in Release.  (Still minutes faster than running tests && bench && gm.)  GPU singlethreading is definitely the limiting factor again; going to reexamine whether that's helpful to thread it again.

BUG=skia:
R=reed@google.com, bsalomon@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/178473006

git-svn-id: http://skia.googlecode.com/svn/trunk@13603 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/dm/DMBenchTask.cpp b/dm/DMBenchTask.cpp
new file mode 100644
index 0000000..4e251de
--- /dev/null
+++ b/dm/DMBenchTask.cpp
@@ -0,0 +1,86 @@
+#include "DMBenchTask.h"
+#include "DMUtil.h"
+#include "SkSurface.h"
+
+namespace DM {
+
+static SkString bench_name(const char* name, const char* config) {
+    SkString result("bench ");
+    result.appendf("%s_%s", name, config);
+    return result;
+}
+
+NonRenderingBenchTask::NonRenderingBenchTask(const char* config,
+                                             Reporter* reporter,
+                                             TaskRunner* tasks,
+                                             BenchRegistry::Factory factory)
+    : Task(reporter, tasks)
+    , fBench(factory(NULL))
+    , fName(bench_name(fBench->getName(), config)) {}
+
+CpuBenchTask::CpuBenchTask(const char* config,
+                           Reporter* reporter,
+                           TaskRunner* tasks,
+                           BenchRegistry::Factory factory,
+                           SkColorType colorType)
+    : Task(reporter, tasks)
+    , fBench(factory(NULL))
+    , fName(bench_name(fBench->getName(), config))
+    , fColorType(colorType) {}
+
+GpuBenchTask::GpuBenchTask(const char* config,
+                           Reporter* reporter,
+                           TaskRunner* tasks,
+                           BenchRegistry::Factory factory,
+                           GrContextFactory::GLContextType contextType,
+                           int sampleCount)
+    : Task(reporter, tasks)
+    , fBench(factory(NULL))
+    , fName(bench_name(fBench->getName(), config))
+    , fContextType(contextType)
+    , fSampleCount(sampleCount) {}
+
+bool NonRenderingBenchTask::shouldSkip() const {
+    return !fBench->isSuitableFor(SkBenchmark::kNonRendering_Backend);
+}
+
+bool CpuBenchTask::shouldSkip() const {
+    return !fBench->isSuitableFor(SkBenchmark::kRaster_Backend);
+}
+
+bool GpuBenchTask::shouldSkip() const {
+    return !fBench->isSuitableFor(SkBenchmark::kGPU_Backend);
+}
+
+static void draw_raster(SkBenchmark* bench, SkColorType colorType) {
+    SkBitmap bitmap;
+    SetupBitmap(colorType, bench, &bitmap);
+    SkCanvas canvas(bitmap);
+
+    bench->preDraw();
+    bench->draw(1, &canvas);
+    bench->postDraw();
+}
+
+void NonRenderingBenchTask::draw() {
+    draw_raster(fBench.get(), kPMColor_SkColorType);
+}
+
+void CpuBenchTask::draw() {
+    draw_raster(fBench.get(), fColorType);
+}
+
+void GpuBenchTask::draw() {
+    SkImageInfo info = SkImageInfo::Make(fBench->getSize().x(),
+                                         fBench->getSize().y(),
+                                         kPMColor_SkColorType,
+                                         kPremul_SkAlphaType);
+    SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(
+            this->getGrContextFactory()->get(fContextType), info, fSampleCount));
+
+    fBench->preDraw();
+    fBench->draw(1, surface->getCanvas());
+    fBench->postDraw();
+}
+
+}  // namespace DM