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 { 25c47635e0ed52970fa40a16ffb280071e6b838a52svaisanen SkString name; 26d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Benchmark::Backend backend; 27d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson SkColorType color; 28d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson SkAlphaType alpha; 29b109b8c5ec40a7dd85a0a2951a1f98fa63b805aabrianosman sk_sp<SkColorSpace> colorSpace; 30d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson int samples; 31d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#if SK_SUPPORT_GPU 3285b4b53e78dcdeae2a51935ca5e214b0f1a06492bsalomon sk_gpu_test::GrContextFactory::ContextType ctxType; 33e812d496aaa5e5e9f2117de8f442c297c9cb1367csmartdalton sk_gpu_test::GrContextFactory::ContextOverrides ctxOverrides; 34d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson bool useDFText; 35d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#else 36d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson int bogusInt; 375219fd9ff7aa6ebf64c905ad40f5e0027a39962bkkinnunen int bogusIntOption; 38d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson bool bogusBool; 39d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#endif 40d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson}; 41d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 42d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudsonstruct Target { 43d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson explicit Target(const Config& c) : config(c) { } 44d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual ~Target() { } 45d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 46d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson const Config config; 47e8f3062a36d3682f4019309a32b5b84dc9eddf8creed sk_sp<SkSurface> surface; 48d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 49d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called once per target, immediately before any timing or drawing. */ 50d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void setup() { } 51d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 52d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called *after* the clock timer is started, before the benchmark 5375a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson is drawn. Most back ends just return the canvas passed in, 5475a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson but some may replace it. */ 55d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual SkCanvas* beginTiming(SkCanvas* canvas) { return canvas; } 56d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 57d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called *after* a benchmark is drawn, but before the clock timer 58d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson is stopped. */ 59d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void endTiming() { } 60d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 61d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called between benchmarks (or between calibration and measured 62d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson runs) to make sure all pending work in drivers / threads is 63d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson complete. */ 64d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void fence() { } 65d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 66d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** CPU-like targets can just be timed, but GPU-like 67d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson targets need to pay attention to frame boundaries 68d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson or other similar details. */ 69d416a5b10ff9e6d4f55a1f5b0419722132d68ff3cdalton virtual bool needsFrameTiming(int* frameLag) const { return false; } 70d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 71d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Called once per target, during program initialization. 72d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Returns false if initialization fails. */ 73d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual bool init(SkImageInfo info, Benchmark* bench); 74d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 75d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Stores any pixels drawn to the screen in the bitmap. 76d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson Returns false on error. */ 77d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual bool capturePixels(SkBitmap* bmp); 78d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 79d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson /** Writes any config-specific data to the log. */ 80d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson virtual void fillOptions(ResultsWriter*) { } 8175a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson 8275a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson SkCanvas* getCanvas() const { 8375a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson if (!surface.get()) { 8496fcdcc219d2a0d3579719b84b28bede76efba64halcanary return nullptr; 8575a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson } 8675a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson return surface->getCanvas(); 8775a0ebb0d0bd852e3b068bf14370c6689242a89ctomhudson } 88d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson}; 89d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson 90d968a6f29e92230ee118ec9cdfff0329bf83d602tomhudson#endif // nanobench_DEFINED 91