1 #include "DMBenchTask.h" 2 #include "DMUtil.h" 3 #include "SkSurface.h" 4 5 namespace DM { 6 7 static SkString bench_name(const char* name, const char* config) { 8 SkString result("bench "); 9 result.appendf("%s_%s", name, config); 10 return result; 11 } 12 13 NonRenderingBenchTask::NonRenderingBenchTask(const char* config, 14 Reporter* reporter, 15 TaskRunner* tasks, 16 BenchRegistry::Factory factory) 17 : CpuTask(reporter, tasks) 18 , fBench(factory(NULL)) 19 , fName(bench_name(fBench->getName(), config)) {} 20 21 CpuBenchTask::CpuBenchTask(const char* config, 22 Reporter* reporter, 23 TaskRunner* tasks, 24 BenchRegistry::Factory factory, 25 SkColorType colorType) 26 : CpuTask(reporter, tasks) 27 , fBench(factory(NULL)) 28 , fName(bench_name(fBench->getName(), config)) 29 , fColorType(colorType) {} 30 31 GpuBenchTask::GpuBenchTask(const char* config, 32 Reporter* reporter, 33 TaskRunner* tasks, 34 BenchRegistry::Factory factory, 35 GrContextFactory::GLContextType contextType, 36 int sampleCount) 37 : GpuTask(reporter, tasks) 38 , fBench(factory(NULL)) 39 , fName(bench_name(fBench->getName(), config)) 40 , fContextType(contextType) 41 , fSampleCount(sampleCount) {} 42 43 bool NonRenderingBenchTask::shouldSkip() const { 44 return !fBench->isSuitableFor(Benchmark::kNonRendering_Backend); 45 } 46 47 bool CpuBenchTask::shouldSkip() const { 48 return !fBench->isSuitableFor(Benchmark::kRaster_Backend); 49 } 50 51 bool GpuBenchTask::shouldSkip() const { 52 return kGPUDisabled || !fBench->isSuitableFor(Benchmark::kGPU_Backend); 53 } 54 55 static void draw_raster(Benchmark* bench, SkColorType colorType) { 56 SkBitmap bitmap; 57 AllocatePixels(colorType, bench->getSize().x(), bench->getSize().y(), &bitmap); 58 SkCanvas canvas(bitmap); 59 60 bench->preDraw(); 61 bench->draw(1, &canvas); 62 } 63 64 void NonRenderingBenchTask::draw() { 65 draw_raster(fBench.get(), kN32_SkColorType); 66 } 67 68 void CpuBenchTask::draw() { 69 draw_raster(fBench.get(), fColorType); 70 } 71 72 void GpuBenchTask::draw(GrContextFactory* grFactory) { 73 SkImageInfo info = SkImageInfo::Make(fBench->getSize().x(), 74 fBench->getSize().y(), 75 kN32_SkColorType, 76 kPremul_SkAlphaType); 77 SkAutoTUnref<SkSurface> surface(NewGpuSurface(grFactory, fContextType, info, fSampleCount)); 78 79 fBench->preDraw(); 80 fBench->draw(1, surface->getCanvas()); 81 } 82 83 } // namespace DM 84