1d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson/* 2d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson * Copyright 2015 Google Inc. 3d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson * 4d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson * Use of this source code is governed by a BSD-style license that can be 5d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson * found in the LICENSE file. 6d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson */ 7d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 8d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#ifndef nanobench_DEFINED 9d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#define nanobench_DEFINED 10d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 11d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#include "Benchmark.h" 12d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#include "SkImageInfo.h" 13d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#include "SkSurface.h" 14d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#include "SkTypes.h" 15d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 16d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#if SK_SUPPORT_GPU 17d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#include "GrContextFactory.h" 18d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#endif 19d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 20d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonclass ResultsWriter; 21d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonclass SkBitmap; 22d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonclass SkCanvas; 23d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 24d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonstruct Config { 25d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson const char* name; 26d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Benchmark::Backend backend; 27d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson SkColorType color; 28d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson SkAlphaType alpha; 29d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson int samples; 30d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#if SK_SUPPORT_GPU 31d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson GrContextFactory::GLContextType ctxType; 32d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson bool useDFText; 33d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#else 34d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson int bogusInt; 35d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson bool bogusBool; 36d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#endif 37d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson}; 38d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 39d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonstruct Target { 40d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson explicit Target(const Config& c) : config(c) { } 41d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual ~Target() { } 42d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 43d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson const Config config; 44d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson SkAutoTDelete<SkSurface> surface; 45d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 46d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called once per target, immediately before any timing or drawing. */ 47d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void setup() { } 48d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 49d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called *after* the clock timer is started, before the benchmark 5075a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson is drawn. Most back ends just return the canvas passed in, 5175a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson but some may replace it. */ 52d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual SkCanvas* beginTiming(SkCanvas* canvas) { return canvas; } 53d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 54d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called *after* a benchmark is drawn, but before the clock timer 55d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson is stopped. */ 56d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void endTiming() { } 57d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 58d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called between benchmarks (or between calibration and measured 59d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson runs) to make sure all pending work in drivers / threads is 60d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson complete. */ 61d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void fence() { } 62d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 63d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** CPU-like targets can just be timed, but GPU-like 64d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson targets need to pay attention to frame boundaries 65d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson or other similar details. */ 66d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual bool needsFrameTiming() const { return false; } 67d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 68d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called once per target, during program initialization. 69d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Returns false if initialization fails. */ 70d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual bool init(SkImageInfo info, Benchmark* bench); 71d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 72d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Stores any pixels drawn to the screen in the bitmap. 73d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Returns false on error. */ 74d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual bool capturePixels(SkBitmap* bmp); 75d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 76d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Writes any config-specific data to the log. */ 77d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void fillOptions(ResultsWriter*) { } 7875a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson 7975a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson SkCanvas* getCanvas() const { 8075a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson if (!surface.get()) { 8175a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson return NULL; 8275a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson } 8375a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson return surface->getCanvas(); 8475a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson } 85d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson}; 86d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 87d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#endif // nanobench_DEFINED 88