| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index 0af05527f12d70f96115af7604bb24936a365067..23148743ea3c469885a67b9caba5941b0a6a92b0 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -153,6 +153,7 @@ static int gpu_bench(SkGLContextHelper* gl,
|
| Benchmark* bench,
|
| SkCanvas* canvas,
|
| double* samples) {
|
| + gl->makeCurrent();
|
| // Make sure we're done with whatever came before.
|
| SK_GL(*gl, Finish());
|
|
|
| @@ -200,73 +201,138 @@ static SkString to_lower(const char* str) {
|
| return lower;
|
| }
|
|
|
| -struct Target {
|
| - const char* config;
|
| +struct Config {
|
| + const char* name;
|
| Benchmark::Backend backend;
|
| + SkColorType color;
|
| + SkAlphaType alpha;
|
| + int samples;
|
| +#if SK_SUPPORT_GPU
|
| + GrContextFactory::GLContextType ctxType;
|
| +#else
|
| + int bogusInt;
|
| +#endif
|
| +};
|
| +
|
| +struct Target {
|
| + explicit Target(const Config& c) : config(c) {}
|
| + const Config config;
|
| SkAutoTDelete<SkSurface> surface;
|
| #if SK_SUPPORT_GPU
|
| SkGLContextHelper* gl;
|
| #endif
|
| };
|
|
|
| -// If bench is enabled for backend/config, returns a Target* for them, otherwise NULL.
|
| -static Target* is_enabled(Benchmark* bench, Benchmark::Backend backend, const char* config) {
|
| - if (!bench->isSuitableFor(backend)) {
|
| - return NULL;
|
| - }
|
| -
|
| +static bool is_cpu_config_allowed(const char* name) {
|
| for (int i = 0; i < FLAGS_config.count(); i++) {
|
| - if (to_lower(FLAGS_config[i]).equals(config)) {
|
| - Target* target = new Target;
|
| - target->config = config;
|
| - target->backend = backend;
|
| - return target;
|
| + if (to_lower(FLAGS_config[i]).equals(name)) {
|
| + return true;
|
| }
|
| }
|
| - return NULL;
|
| + return false;
|
| }
|
|
|
| -// Append all targets that are suitable for bench.
|
| -static void create_targets(Benchmark* bench, SkTDArray<Target*>* targets) {
|
| - const int w = bench->getSize().fX,
|
| - h = bench->getSize().fY;
|
| - const SkImageInfo _8888 = { w, h, kN32_SkColorType, kPremul_SkAlphaType },
|
| - _565 = { w, h, kRGB_565_SkColorType, kOpaque_SkAlphaType };
|
| -
|
| - #define CPU_TARGET(config, backend, code) \
|
| - if (Target* t = is_enabled(bench, Benchmark::backend, #config)) { \
|
| - t->surface.reset(code); \
|
| - targets->push(t); \
|
| +#if SK_SUPPORT_GPU
|
| +static bool is_gpu_config_allowed(const char* name, GrContextFactory::GLContextType ctxType,
|
| + int sampleCnt) {
|
| + if (!is_cpu_config_allowed(name)) {
|
| + return false;
|
| + }
|
| + if (const GrContext* ctx = gGrFactory.get(ctxType)) {
|
| + return sampleCnt <= ctx->getMaxSampleCount();
|
| + }
|
| + return false;
|
| +}
|
| +#endif
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +#define kBogusGLContextType GrContextFactory::kNative_GLContextType
|
| +#else
|
| +#define kBogusGLContextType 0
|
| +#endif
|
| +
|
| +// Append all configs that are enabled and supported.
|
| +static void create_configs(SkTDArray<Config>* configs) {
|
| + #define CPU_CONFIG(name, backend, color, alpha) \
|
| + if (is_cpu_config_allowed(#name)) { \
|
| + Config config = { #name, Benchmark::backend, color, alpha, 0, kBogusGLContextType }; \
|
| + configs->push(config); \
|
| }
|
| +
|
| if (FLAGS_cpu) {
|
| - CPU_TARGET(nonrendering, kNonRendering_Backend, NULL)
|
| - CPU_TARGET(8888, kRaster_Backend, SkSurface::NewRaster(_8888))
|
| - CPU_TARGET(565, kRaster_Backend, SkSurface::NewRaster(_565))
|
| + CPU_CONFIG(nonrendering, kNonRendering_Backend, kUnknown_SkColorType, kUnpremul_SkAlphaType)
|
| + CPU_CONFIG(8888, kRaster_Backend, kN32_SkColorType, kPremul_SkAlphaType)
|
| + CPU_CONFIG(565, kRaster_Backend, kRGB_565_SkColorType, kOpaque_SkAlphaType)
|
| }
|
|
|
| #if SK_SUPPORT_GPU
|
| -
|
| - #define GPU_TARGET(config, ctxType, info, samples) \
|
| - if (Target* t = is_enabled(bench, Benchmark::kGPU_Backend, #config)) { \
|
| - t->surface.reset(SkSurface::NewRenderTarget(gGrFactory.get(ctxType), info, samples)); \
|
| - t->gl = gGrFactory.getGLContext(ctxType); \
|
| - targets->push(t); \
|
| + #define GPU_CONFIG(name, ctxType, samples) \
|
| + if (is_gpu_config_allowed(#name, GrContextFactory::ctxType, samples)) { \
|
| + Config config = { \
|
| + #name, \
|
| + Benchmark::kGPU_Backend, \
|
| + kN32_SkColorType, \
|
| + kPremul_SkAlphaType, \
|
| + samples, \
|
| + GrContextFactory::ctxType }; \
|
| + configs->push(config); \
|
| }
|
| +
|
| if (FLAGS_gpu) {
|
| - GPU_TARGET(gpu, GrContextFactory::kNative_GLContextType, _8888, 0)
|
| - GPU_TARGET(msaa4, GrContextFactory::kNative_GLContextType, _8888, 4)
|
| - GPU_TARGET(msaa16, GrContextFactory::kNative_GLContextType, _8888, 16)
|
| - GPU_TARGET(nvprmsaa4, GrContextFactory::kNVPR_GLContextType, _8888, 4)
|
| - GPU_TARGET(nvprmsaa16, GrContextFactory::kNVPR_GLContextType, _8888, 16)
|
| - GPU_TARGET(debug, GrContextFactory::kDebug_GLContextType, _8888, 0)
|
| - GPU_TARGET(nullgpu, GrContextFactory::kNull_GLContextType, _8888, 0)
|
| - #if SK_ANGLE
|
| - GPU_TARGET(angle, GrContextFactory::kANGLE_GLContextType, _8888, 0)
|
| - #endif
|
| + GPU_CONFIG(gpu, kNative_GLContextType, 0)
|
| + GPU_CONFIG(msaa4, kNative_GLContextType, 4)
|
| + GPU_CONFIG(msaa16, kNative_GLContextType, 16)
|
| + GPU_CONFIG(nvprmsaa4, kNVPR_GLContextType, 4)
|
| + GPU_CONFIG(nvprmsaa16, kNVPR_GLContextType, 16)
|
| + GPU_CONFIG(debug, kDebug_GLContextType, 0)
|
| + GPU_CONFIG(nullgpu, kNull_GLContextType, 0)
|
| }
|
| #endif
|
| }
|
|
|
| +// If bench is enabled for config, returns a Target* for it, otherwise NULL.
|
| +static Target* is_enabled(Benchmark* bench, const Config& config) {
|
| + if (!bench->isSuitableFor(config.backend)) {
|
| + return NULL;
|
| + }
|
| +
|
| + SkImageInfo info;
|
| + info.fAlphaType = config.alpha;
|
| + info.fColorType = config.color;
|
| + info.fWidth = bench->getSize().fX;
|
| + info.fHeight = bench->getSize().fY;
|
| +
|
| + Target* target = new Target(config);
|
| +
|
| + if (Benchmark::kRaster_Backend == config.backend) {
|
| + target->surface.reset(SkSurface::NewRaster(info));
|
| + }
|
| +#if SK_SUPPORT_GPU
|
| + else if (Benchmark::kGPU_Backend == config.backend) {
|
| + target->surface.reset(SkSurface::NewRenderTarget(gGrFactory.get(config.ctxType), info,
|
| + config.samples));
|
| + target->gl = gGrFactory.getGLContext(config.ctxType);
|
| + }
|
| +#endif
|
| +
|
| + if (Benchmark::kNonRendering_Backend != config.backend && !target->surface.get()) {
|
| + delete target;
|
| + return NULL;
|
| + }
|
| + 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);
|
| + }
|
| +
|
| + }
|
| +}
|
| +
|
| static void fill_static_options(ResultsWriter* log) {
|
| #if defined(SK_BUILD_FOR_WIN32)
|
| log->option("system", "WIN32");
|
| @@ -342,6 +408,9 @@ int tool_main(int argc, char** argv) {
|
| SkDebugf("loops\tmin\tmedian\tmean\tmax\tstddev\tsamples\tconfig\tbench\n");
|
| }
|
|
|
| + SkTDArray<Config> configs;
|
| + create_configs(&configs);
|
| +
|
| for (const BenchRegistry* r = BenchRegistry::Head(); r != NULL; r = r->next()) {
|
| SkAutoTDelete<Benchmark> bench(r->factory()(NULL));
|
| if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getName())) {
|
| @@ -349,7 +418,7 @@ int tool_main(int argc, char** argv) {
|
| }
|
|
|
| SkTDArray<Target*> targets;
|
| - create_targets(bench.get(), &targets);
|
| + create_targets(&targets, bench.get(), configs);
|
|
|
| if (!targets.isEmpty()) {
|
| log.bench(bench->getName(), bench->getSize().fX, bench->getSize().fY);
|
| @@ -357,11 +426,11 @@ int tool_main(int argc, char** argv) {
|
| }
|
| for (int j = 0; j < targets.count(); j++) {
|
| SkCanvas* canvas = targets[j]->surface.get() ? targets[j]->surface->getCanvas() : NULL;
|
| - const char* config = targets[j]->config;
|
| + const char* config = targets[j]->config.name;
|
|
|
| const int loops =
|
| #if SK_SUPPORT_GPU
|
| - Benchmark::kGPU_Backend == targets[j]->backend
|
| + Benchmark::kGPU_Backend == targets[j]->config.backend
|
| ? gpu_bench(targets[j]->gl, bench.get(), canvas, samples.get())
|
| :
|
| #endif
|
| @@ -376,7 +445,7 @@ int tool_main(int argc, char** argv) {
|
| Stats stats(samples.get(), FLAGS_samples);
|
| log.config(config);
|
| #if SK_SUPPORT_GPU
|
| - if (Benchmark::kGPU_Backend == targets[j]->backend) {
|
| + if (Benchmark::kGPU_Backend == targets[j]->config.backend) {
|
| fill_gpu_options(&log, targets[j]->gl);
|
| }
|
| #endif
|
|
|