1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef nanobench_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define nanobench_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/GrContextFactory.h" 16*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/ContextFactory.h" 18*c8dee2aaSAndroid Build Coastguard Worker #endif 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap; 21*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 22*c8dee2aaSAndroid Build Coastguard Worker class NanoJSONResultsWriter; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker struct Config { 25*c8dee2aaSAndroid Build Coastguard Worker SkString name; 26*c8dee2aaSAndroid Build Coastguard Worker Benchmark::Backend backend; 27*c8dee2aaSAndroid Build Coastguard Worker SkColorType color; 28*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType alpha; 29*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpace; 30*c8dee2aaSAndroid Build Coastguard Worker int samples; 31*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::GrContextFactory::ContextType ctxType; 32*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::GrContextFactory::ContextOverrides ctxOverrides; 33*c8dee2aaSAndroid Build Coastguard Worker uint32_t surfaceFlags; 34*c8dee2aaSAndroid Build Coastguard Worker }; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker struct Target { TargetTarget37*c8dee2aaSAndroid Build Coastguard Worker explicit Target(const Config& c) : config(c) { } ~TargetTarget38*c8dee2aaSAndroid Build Coastguard Worker virtual ~Target() { } 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker const Config config; 41*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** Called once per target, immediately before any timing or drawing. */ setupTarget44*c8dee2aaSAndroid Build Coastguard Worker void setup() { 45*c8dee2aaSAndroid Build Coastguard Worker this->onSetup(); 46*c8dee2aaSAndroid Build Coastguard Worker // Make sure we're done with setup work before we start timing. 47*c8dee2aaSAndroid Build Coastguard Worker this->submitWorkAndSyncCPU(); 48*c8dee2aaSAndroid Build Coastguard Worker } onSetupTarget49*c8dee2aaSAndroid Build Coastguard Worker virtual void onSetup() { } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker /** Called *after* the clock timer is started, before the benchmark 52*c8dee2aaSAndroid Build Coastguard Worker is drawn. Most back ends just return the canvas passed in, 53*c8dee2aaSAndroid Build Coastguard Worker but some may replace it. */ beginTimingTarget54*c8dee2aaSAndroid Build Coastguard Worker virtual SkCanvas* beginTiming(SkCanvas* canvas) { return canvas; } 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker /** Called *after* a benchmark is drawn, but before the clock timer 57*c8dee2aaSAndroid Build Coastguard Worker is stopped. */ endTimingTarget58*c8dee2aaSAndroid Build Coastguard Worker virtual void endTiming() { } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker /** Called between benchmarks (or between calibration and measured 61*c8dee2aaSAndroid Build Coastguard Worker runs) to make sure all pending work in drivers / threads is 62*c8dee2aaSAndroid Build Coastguard Worker complete. */ submitWorkAndSyncCPUTarget63*c8dee2aaSAndroid Build Coastguard Worker virtual void submitWorkAndSyncCPU() { } 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker /** CPU-like targets can just be timed, but GPU-like 66*c8dee2aaSAndroid Build Coastguard Worker targets need to pay attention to frame boundaries 67*c8dee2aaSAndroid Build Coastguard Worker or other similar details. */ needsFrameTimingTarget68*c8dee2aaSAndroid Build Coastguard Worker virtual bool needsFrameTiming(int* frameLag) const { return false; } 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker /** Called once per target, during program initialization. 71*c8dee2aaSAndroid Build Coastguard Worker Returns false if initialization fails. */ 72*c8dee2aaSAndroid Build Coastguard Worker virtual bool init(SkImageInfo info, Benchmark* bench); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker /** Stores any pixels drawn to the screen in the bitmap. 75*c8dee2aaSAndroid Build Coastguard Worker Returns false on error. */ 76*c8dee2aaSAndroid Build Coastguard Worker virtual bool capturePixels(SkBitmap* bmp); 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker /** Writes gathered stats using SkDebugf. */ dumpStatsTarget79*c8dee2aaSAndroid Build Coastguard Worker virtual void dumpStats() {} 80*c8dee2aaSAndroid Build Coastguard Worker getCanvasTarget81*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* getCanvas() const { 82*c8dee2aaSAndroid Build Coastguard Worker if (!surface) { 83*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker return surface->getCanvas(); 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker }; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker #endif // nanobench_DEFINED 90