| Index: bench/nanobench.cpp
 | 
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
 | 
| index 4aad61da72aece64376e4d378dfe1ea7d8e93857..19fdac0d47ea12199cd347c330faee40ce76ade2 100644
 | 
| --- a/bench/nanobench.cpp
 | 
| +++ b/bench/nanobench.cpp
 | 
| @@ -488,17 +488,6 @@ static Target* is_enabled(Benchmark* bench, const Config& config) {
 | 
|      return target;
 | 
|  }
 | 
|  
 | 
| -// Creates targets for a benchmark and a set of configs.
 | 
| -static void create_targets(SkTDArray<Target*>* targets, Benchmark* b,
 | 
| -                           const SkTDArray<Config>& configs) {
 | 
| -    for (int i = 0; i < configs.count(); ++i) {
 | 
| -        if (Target* t = is_enabled(b, configs[i])) {
 | 
| -            targets->push(t);
 | 
| -        }
 | 
| -
 | 
| -    }
 | 
| -}
 | 
| -
 | 
|  /*
 | 
|   * Returns true if set up for a subset decode succeeds, false otherwise
 | 
|   * If the set-up succeeds, the width and height parameters will be set
 | 
| @@ -558,6 +547,18 @@ static bool valid_subset_bench(const SkString& path, SkColorType colorType, bool
 | 
|      return true;
 | 
|  }
 | 
|  
 | 
| +static void cleanup_run(Target* target) {
 | 
| +    SkDELETE(target);
 | 
| +#if SK_SUPPORT_GPU
 | 
| +    if (FLAGS_abandonGpuContext) {
 | 
| +        gGrFactory->abandonContexts();
 | 
| +    }
 | 
| +    if (FLAGS_resetGpuContext || FLAGS_abandonGpuContext) {
 | 
| +        gGrFactory->destroyContexts();
 | 
| +    }
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
|  class BenchmarkStream {
 | 
|  public:
 | 
|      BenchmarkStream() : fBenches(BenchRegistry::Head())
 | 
| @@ -1026,30 +1027,32 @@ int nanobench_main() {
 | 
|              continue;
 | 
|          }
 | 
|  
 | 
| -        SkTDArray<Target*> targets;
 | 
| -        create_targets(&targets, bench.get(), configs);
 | 
| -
 | 
| -        if (!targets.isEmpty()) {
 | 
| +        if (!configs.isEmpty()) {
 | 
|              log->bench(bench->getUniqueName(), bench->getSize().fX, bench->getSize().fY);
 | 
|              bench->preDraw();
 | 
|          }
 | 
| -        for (int j = 0; j < targets.count(); j++) {
 | 
| +        for (int i = 0; i < configs.count(); ++i) {
 | 
| +            Target* target = is_enabled(b, configs[i]);
 | 
| +            if (!target) {
 | 
| +                continue;
 | 
| +            }
 | 
| +
 | 
|              // During HWUI output this canvas may be NULL.
 | 
| -            SkCanvas* canvas = targets[j]->getCanvas();
 | 
| -            const char* config = targets[j]->config.name;
 | 
| +            SkCanvas* canvas = target->getCanvas();
 | 
| +            const char* config = target->config.name;
 | 
|  
 | 
| -            targets[j]->setup();
 | 
| +            target->setup();
 | 
|              bench->perCanvasPreDraw(canvas);
 | 
|  
 | 
|              int maxFrameLag;
 | 
| -            const int loops = targets[j]->needsFrameTiming(&maxFrameLag)
 | 
| -                ? setup_gpu_bench(targets[j], bench.get(), maxFrameLag)
 | 
| -                : setup_cpu_bench(overhead, targets[j], bench.get());
 | 
| +            const int loops = target->needsFrameTiming(&maxFrameLag)
 | 
| +                ? setup_gpu_bench(target, bench.get(), maxFrameLag)
 | 
| +                : setup_cpu_bench(overhead, target, bench.get());
 | 
|  
 | 
|              if (kTimedSampling != FLAGS_samples) {
 | 
|                  samples.reset(FLAGS_samples);
 | 
|                  for (int s = 0; s < FLAGS_samples; s++) {
 | 
| -                    samples[s] = time(loops, bench, targets[j]) / loops;
 | 
| +                    samples[s] = time(loops, bench, target) / loops;
 | 
|                  }
 | 
|              } else if (samplingTimeMs) {
 | 
|                  samples.reset();
 | 
| @@ -1060,23 +1063,24 @@ int nanobench_main() {
 | 
|                  WallTimer timer;
 | 
|                  timer.start();
 | 
|                  do {
 | 
| -                    samples.push_back(time(loops, bench, targets[j]) / loops);
 | 
| +                    samples.push_back(time(loops, bench, target) / loops);
 | 
|                      timer.end();
 | 
|                  } while (timer.fWall < samplingTimeMs);
 | 
|              }
 | 
|  
 | 
|              bench->perCanvasPostDraw(canvas);
 | 
|  
 | 
| -            if (Benchmark::kNonRendering_Backend != targets[j]->config.backend &&
 | 
| +            if (Benchmark::kNonRendering_Backend != target->config.backend &&
 | 
|                  !FLAGS_writePath.isEmpty() && FLAGS_writePath[0]) {
 | 
|                  SkString pngFilename = SkOSPath::Join(FLAGS_writePath[0], config);
 | 
|                  pngFilename = SkOSPath::Join(pngFilename.c_str(), bench->getUniqueName());
 | 
|                  pngFilename.append(".png");
 | 
| -                write_canvas_png(targets[j], pngFilename);
 | 
| +                write_canvas_png(target, pngFilename);
 | 
|              }
 | 
|  
 | 
|              if (kFailedLoops == loops) {
 | 
|                  // Can't be timed.  A warning note has already been printed.
 | 
| +                cleanup_run(target);
 | 
|                  continue;
 | 
|              }
 | 
|  
 | 
| @@ -1084,14 +1088,14 @@ int nanobench_main() {
 | 
|              log->config(config);
 | 
|              log->configOption("name", bench->getName());
 | 
|              benchStream.fillCurrentOptions(log.get());
 | 
| -            targets[j]->fillOptions(log.get());
 | 
| +            target->fillOptions(log.get());
 | 
|              log->metric("min_ms",    stats.min);
 | 
|              if (runs++ % FLAGS_flushEvery == 0) {
 | 
|                  log->flush();
 | 
|              }
 | 
|  
 | 
|              if (kAutoTuneLoops != FLAGS_loops) {
 | 
| -                if (targets.count() == 1) {
 | 
| +                if (configs.count() == 1) {
 | 
|                      config = ""; // Only print the config if we run the same bench on more than one.
 | 
|                  }
 | 
|                  SkDebugf("%4d/%-4dMB\t%s\t%s\n"
 | 
| @@ -1105,7 +1109,7 @@ int nanobench_main() {
 | 
|                  }
 | 
|                  SkDebugf("%s\n", bench->getUniqueName());
 | 
|              } else if (FLAGS_quiet) {
 | 
| -                if (targets.count() == 1) {
 | 
| +                if (configs.count() == 1) {
 | 
|                      config = ""; // Only print the config if we run the same bench on more than one.
 | 
|                  }
 | 
|                  SkDebugf("%s\t%s\t%s\n", HUMANIZE(stats.median), bench->getUniqueName(), config);
 | 
| @@ -1128,22 +1132,13 @@ int nanobench_main() {
 | 
|              }
 | 
|  #if SK_SUPPORT_GPU
 | 
|              if (FLAGS_gpuStats &&
 | 
| -                Benchmark::kGPU_Backend == targets[j]->config.backend) {
 | 
| -                gGrFactory->get(targets[j]->config.ctxType)->printCacheStats();
 | 
| -                gGrFactory->get(targets[j]->config.ctxType)->printGpuStats();
 | 
| +                Benchmark::kGPU_Backend == configs[i].backend) {
 | 
| +                gGrFactory->get(configs[i].ctxType)->printCacheStats();
 | 
| +                gGrFactory->get(configs[i].ctxType)->printGpuStats();
 | 
|              }
 | 
|  #endif
 | 
| +            cleanup_run(target);
 | 
|          }
 | 
| -        targets.deleteAll();
 | 
| -
 | 
| -#if SK_SUPPORT_GPU
 | 
| -        if (FLAGS_abandonGpuContext) {
 | 
| -            gGrFactory->abandonContexts();
 | 
| -        }
 | 
| -        if (FLAGS_resetGpuContext || FLAGS_abandonGpuContext) {
 | 
| -            gGrFactory->destroyContexts();
 | 
| -        }
 | 
| -#endif
 | 
|      }
 | 
|  
 | 
|      log->bench("memory_usage", 0,0);
 | 
| 
 |