| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include <ctype.h> | 8 #include <ctype.h> |
| 9 | 9 |
| 10 #include "nanobench.h" | 10 #include "nanobench.h" |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 this->con
fig.ctxOptions), | 178 this->con
fig.ctxOptions), |
| 179 SkSurface::kNo_Budgeted
, info, | 179 SkSurface::kNo_Budgeted
, info, |
| 180 this->config.samples, &
props)); | 180 this->config.samples, &
props)); |
| 181 this->gl = gGrFactory->getContextInfo(this->config.ctxType, | 181 this->gl = gGrFactory->getContextInfo(this->config.ctxType, |
| 182 this->config.ctxOptions).fGLContex
t; | 182 this->config.ctxOptions).fGLContex
t; |
| 183 if (!this->surface.get()) { | 183 if (!this->surface.get()) { |
| 184 return false; | 184 return false; |
| 185 } | 185 } |
| 186 if (!this->gl->fenceSyncSupport()) { | 186 if (!this->gl->fenceSyncSupport()) { |
| 187 SkDebugf("WARNING: GL context for config \"%s\" does not support fen
ce sync. " | 187 SkDebugf("WARNING: GL context for config \"%s\" does not support fen
ce sync. " |
| 188 "Timings might not be accurate.\n", this->config.name); | 188 "Timings might not be accurate.\n", this->config.name.c_str
()); |
| 189 } | 189 } |
| 190 return true; | 190 return true; |
| 191 } | 191 } |
| 192 void fillOptions(ResultsWriter* log) override { | 192 void fillOptions(ResultsWriter* log) override { |
| 193 const GrGLubyte* version; | 193 const GrGLubyte* version; |
| 194 SK_GL_RET(*this->gl, version, GetString(GR_GL_VERSION)); | 194 SK_GL_RET(*this->gl, version, GetString(GR_GL_VERSION)); |
| 195 log->configOption("GL_VERSION", (const char*)(version)); | 195 log->configOption("GL_VERSION", (const char*)(version)); |
| 196 | 196 |
| 197 SK_GL_RET(*this->gl, version, GetString(GR_GL_RENDERER)); | 197 SK_GL_RET(*this->gl, version, GetString(GR_GL_RENDERER)); |
| 198 log->configOption("GL_RENDERER", (const char*) version); | 198 log->configOption("GL_RENDERER", (const char*) version); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 | 365 |
| 366 // Pretty much the same deal as the calibration: do some warmup to make | 366 // Pretty much the same deal as the calibration: do some warmup to make |
| 367 // sure we're timing steady-state pipelined frames. | 367 // sure we're timing steady-state pipelined frames. |
| 368 for (int i = 0; i < maxGpuFrameLag - 1; i++) { | 368 for (int i = 0; i < maxGpuFrameLag - 1; i++) { |
| 369 time(loops, bench, target); | 369 time(loops, bench, target); |
| 370 } | 370 } |
| 371 | 371 |
| 372 return loops; | 372 return loops; |
| 373 } | 373 } |
| 374 | 374 |
| 375 static SkString to_lower(const char* str) { | |
| 376 SkString lower(str); | |
| 377 for (size_t i = 0; i < lower.size(); i++) { | |
| 378 lower[i] = tolower(lower[i]); | |
| 379 } | |
| 380 return lower; | |
| 381 } | |
| 382 | |
| 383 static bool is_cpu_config_allowed(const char* name) { | |
| 384 for (int i = 0; i < FLAGS_config.count(); i++) { | |
| 385 if (to_lower(FLAGS_config[i]).equals(name)) { | |
| 386 return true; | |
| 387 } | |
| 388 } | |
| 389 return false; | |
| 390 } | |
| 391 | |
| 392 #if SK_SUPPORT_GPU | |
| 393 static bool is_gpu_config_allowed(const char* name, GrContextFactory::GLContextT
ype ctxType, | |
| 394 GrContextFactory::GLContextOptions ctxOptions, | |
| 395 int sampleCnt) { | |
| 396 if (!is_cpu_config_allowed(name)) { | |
| 397 return false; | |
| 398 } | |
| 399 if (const GrContext* ctx = gGrFactory->get(ctxType, ctxOptions)) { | |
| 400 return sampleCnt <= ctx->caps()->maxSampleCount(); | |
| 401 } | |
| 402 return false; | |
| 403 } | |
| 404 #endif | |
| 405 | |
| 406 #if SK_SUPPORT_GPU | 375 #if SK_SUPPORT_GPU |
| 407 #define kBogusGLContextType GrContextFactory::kNative_GLContextType | 376 #define kBogusGLContextType GrContextFactory::kNative_GLContextType |
| 408 #define kBogusGLContextOptions GrContextFactory::kNone_GLContextOptions | 377 #define kBogusGLContextOptions GrContextFactory::kNone_GLContextOptions |
| 409 #else | 378 #else |
| 410 #define kBogusGLContextType 0 | 379 #define kBogusGLContextType 0 |
| 411 #define kBogusGLContextOptions 0 | 380 #define kBogusGLContextOptions 0 |
| 412 #endif | 381 #endif |
| 413 | 382 |
| 414 // Append all configs that are enabled and supported. | 383 static void create_config(const SkCommandLineConfig* config, SkTArray<Config>* c
onfigs) { |
| 415 static void create_configs(SkTDArray<Config>* configs) { | 384 |
| 416 #define CPU_CONFIG(name, backend, color, alpha) \ | 385 #if SK_SUPPORT_GPU |
| 417 if (is_cpu_config_allowed(#name)) { \ | 386 if (const auto* gpuConfig = config->asConfigGpu()) { |
| 418 Config config = { #name, Benchmark::backend, color, alpha, 0, \ | 387 if (!FLAGS_gpu) |
| 419 kBogusGLContextType, kBogusGLContextOptions, \ | 388 return; |
| 420 false }; \ | 389 |
| 421 configs->push(config); \ | 390 const auto ctxOptions = gpuConfig->getUseNVPR() ? GrContextFactory::kEna
bleNVPR_GLContextOptions |
| 391 : GrContextFactory::kNon
e_GLContextOptions; |
| 392 const auto ctxType = gpuConfig->getContextType(); |
| 393 const auto sampleCount = gpuConfig->getSamples(); |
| 394 |
| 395 if (const GrContext* ctx = gGrFactory->get(ctxType, ctxOptions)) { |
| 396 const auto maxSampleCount = ctx->caps()->maxSampleCount(); |
| 397 if (sampleCount > ctx->caps()->maxSampleCount()) { |
| 398 SkDebugf("Configuration sample count %d exceeds maximum %d.\n", |
| 399 sampleCount, maxSampleCount); |
| 400 return; |
| 401 } |
| 402 } else { |
| 403 SkDebugf("No context was available matching config type and options.
\n"); |
| 404 return; |
| 405 } |
| 406 |
| 407 Config target = { |
| 408 config->getTag(), |
| 409 Benchmark::kGPU_Backend, |
| 410 kN32_SkColorType, |
| 411 kPremul_SkAlphaType, |
| 412 sampleCount, |
| 413 ctxType, |
| 414 ctxOptions, |
| 415 false }; |
| 416 |
| 417 configs->push_back(target); |
| 418 return; |
| 419 } |
| 420 #endif |
| 421 |
| 422 #define CPU_CONFIG(name, backend, color, alpha)
\ |
| 423 if (config->getTag().equals(#name)) {
\ |
| 424 Config config = { SkString(#name), Benchmark::backend, color, alpha,
0, \ |
| 425 kBogusGLContextType, kBogusGLContextOptions,
\ |
| 426 false };
\ |
| 427 configs->push_back(config);
\ |
| 428 return;
\ |
| 422 } | 429 } |
| 423 | 430 |
| 424 if (FLAGS_cpu) { | 431 if (FLAGS_cpu) { |
| 425 CPU_CONFIG(nonrendering, kNonRendering_Backend, kUnknown_SkColorType, kU
npremul_SkAlphaType) | 432 CPU_CONFIG(nonrendering, kNonRendering_Backend, kUnknown_SkColorType, kU
npremul_SkAlphaType) |
| 426 CPU_CONFIG(8888, kRaster_Backend, kN32_SkColorType, kPremul_SkAlphaType) | 433 CPU_CONFIG(8888, kRaster_Backend, kN32_SkColorType, kPremul_SkAlphaType) |
| 427 CPU_CONFIG(565, kRaster_Backend, kRGB_565_SkColorType, kOpaque_SkAlphaTy
pe) | 434 CPU_CONFIG(565, kRaster_Backend, kRGB_565_SkColorType, kOpaque_SkAlphaTy
pe) |
| 428 } | 435 } |
| 429 | 436 |
| 430 #if SK_SUPPORT_GPU | 437 #undef CPU_CONFIG |
| 431 #define GPU_CONFIG(name, ctxType, ctxOptions, samples, useDFText)
\ | |
| 432 if (is_gpu_config_allowed(#name, GrContextFactory::ctxType,
\ | |
| 433 GrContextFactory::ctxOptions, samples)) {
\ | |
| 434 Config config = {
\ | |
| 435 #name,
\ | |
| 436 Benchmark::kGPU_Backend,
\ | |
| 437 kN32_SkColorType,
\ | |
| 438 kPremul_SkAlphaType,
\ | |
| 439 samples,
\ | |
| 440 GrContextFactory::ctxType,
\ | |
| 441 GrContextFactory::ctxOptions,
\ | |
| 442 useDFText };
\ | |
| 443 configs->push(config);
\ | |
| 444 } | |
| 445 | |
| 446 if (FLAGS_gpu) { | |
| 447 GPU_CONFIG(gpu, kNative_GLContextType, kNone_GLContextOptions, 0, false) | |
| 448 GPU_CONFIG(msaa4, kNative_GLContextType, kNone_GLContextOptions, 4, fals
e) | |
| 449 GPU_CONFIG(msaa16, kNative_GLContextType, kNone_GLContextOptions, 16, fa
lse) | |
| 450 GPU_CONFIG(nvprmsaa4, kNative_GLContextType, kEnableNVPR_GLContextOption
s, 4, false) | |
| 451 GPU_CONFIG(nvprmsaa16, kNative_GLContextType, kEnableNVPR_GLContextOptio
ns, 16, false) | |
| 452 GPU_CONFIG(gpudft, kNative_GLContextType, kNone_GLContextOptions, 0, tru
e) | |
| 453 GPU_CONFIG(debug, kDebug_GLContextType, kNone_GLContextOptions, 0, false
) | |
| 454 GPU_CONFIG(nullgpu, kNull_GLContextType, kNone_GLContextOptions, 0, fals
e) | |
| 455 #if SK_ANGLE | |
| 456 #ifdef SK_BUILD_FOR_WIN | |
| 457 GPU_CONFIG(angle, kANGLE_GLContextType, kNone_GLContextOptions, 0, false
) | |
| 458 #endif | |
| 459 GPU_CONFIG(angle-gl, kANGLE_GL_GLContextType, kNone_GLContextOptions, 0,
false) | |
| 460 #endif | |
| 461 #if SK_COMMAND_BUFFER | |
| 462 GPU_CONFIG(commandbuffer, kCommandBuffer_GLContextType, kNone_GLContextO
ptions, 0, false) | |
| 463 #endif | |
| 464 #if SK_MESA | |
| 465 GPU_CONFIG(mesa, kMESA_GLContextType, kNone_GLContextOptions, 0, false) | |
| 466 #endif | |
| 467 } | |
| 468 #endif | |
| 469 | 438 |
| 470 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK | 439 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK |
| 471 if (is_cpu_config_allowed("hwui")) { | 440 if (is_cpu_config_allowed("hwui", config)) { |
| 472 Config config = { "hwui", Benchmark::kHWUI_Backend, kRGBA_8888_SkColorTy
pe, | 441 Config config = { "hwui", Benchmark::kHWUI_Backend, kRGBA_8888_SkColorTy
pe, |
| 473 kPremul_SkAlphaType, 0, kBogusGLContextType, kBogusGLC
ontextOptions, | 442 kPremul_SkAlphaType, 0, kBogusGLContextType, kBogusGLC
ontextOptions, |
| 474 false }; | 443 false }; |
| 475 configs->push(config); | 444 configs->push_back(config); |
| 445 return; |
| 476 } | 446 } |
| 477 #endif | 447 #endif |
| 478 } | 448 } |
| 479 | 449 |
| 450 // Append all configs that are enabled and supported. |
| 451 void create_configs(SkTArray<Config>* configs) { |
| 452 SkCommandLineConfigArray array; |
| 453 ParseConfigs(FLAGS_config, &array); |
| 454 for (int i = 0; i < array.count(); ++i) { |
| 455 create_config(array[i], configs); |
| 456 } |
| 457 } |
| 458 |
| 480 // If bench is enabled for config, returns a Target* for it, otherwise nullptr. | 459 // If bench is enabled for config, returns a Target* for it, otherwise nullptr. |
| 481 static Target* is_enabled(Benchmark* bench, const Config& config) { | 460 static Target* is_enabled(Benchmark* bench, const Config& config) { |
| 482 if (!bench->isSuitableFor(config.backend)) { | 461 if (!bench->isSuitableFor(config.backend)) { |
| 483 return nullptr; | 462 return nullptr; |
| 484 } | 463 } |
| 485 | 464 |
| 486 SkImageInfo info = SkImageInfo::Make(bench->getSize().fX, bench->getSize().f
Y, | 465 SkImageInfo info = SkImageInfo::Make(bench->getSize().fX, bench->getSize().f
Y, |
| 487 config.color, config.alpha); | 466 config.color, config.alpha); |
| 488 | 467 |
| 489 Target* target = nullptr; | 468 Target* target = nullptr; |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 } else if (FLAGS_quiet) { | 1062 } else if (FLAGS_quiet) { |
| 1084 SkDebugf("! -> high variance, ? -> moderate variance\n"); | 1063 SkDebugf("! -> high variance, ? -> moderate variance\n"); |
| 1085 SkDebugf(" micros \tbench\n"); | 1064 SkDebugf(" micros \tbench\n"); |
| 1086 } else if (FLAGS_ms) { | 1065 } else if (FLAGS_ms) { |
| 1087 SkDebugf("curr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\tsamples\tc
onfig\tbench\n"); | 1066 SkDebugf("curr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\tsamples\tc
onfig\tbench\n"); |
| 1088 } else { | 1067 } else { |
| 1089 SkDebugf("curr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\t%-*s\tconf
ig\tbench\n", | 1068 SkDebugf("curr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\t%-*s\tconf
ig\tbench\n", |
| 1090 FLAGS_samples, "samples"); | 1069 FLAGS_samples, "samples"); |
| 1091 } | 1070 } |
| 1092 | 1071 |
| 1093 SkTDArray<Config> configs; | 1072 SkTArray<Config> configs; |
| 1094 create_configs(&configs); | 1073 create_configs(&configs); |
| 1095 | 1074 |
| 1096 if (FLAGS_keepAlive) { | 1075 if (FLAGS_keepAlive) { |
| 1097 start_keepalive(); | 1076 start_keepalive(); |
| 1098 } | 1077 } |
| 1099 | 1078 |
| 1100 int runs = 0; | 1079 int runs = 0; |
| 1101 BenchmarkStream benchStream; | 1080 BenchmarkStream benchStream; |
| 1102 while (Benchmark* b = benchStream.next()) { | 1081 while (Benchmark* b = benchStream.next()) { |
| 1103 SkAutoTDelete<Benchmark> bench(b); | 1082 SkAutoTDelete<Benchmark> bench(b); |
| 1104 if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getUniqueName()))
{ | 1083 if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getUniqueName()))
{ |
| 1105 continue; | 1084 continue; |
| 1106 } | 1085 } |
| 1107 | 1086 |
| 1108 if (!configs.isEmpty()) { | 1087 if (!configs.empty()) { |
| 1109 log->bench(bench->getUniqueName(), bench->getSize().fX, bench->getSi
ze().fY); | 1088 log->bench(bench->getUniqueName(), bench->getSize().fX, bench->getSi
ze().fY); |
| 1110 bench->delayedSetup(); | 1089 bench->delayedSetup(); |
| 1111 } | 1090 } |
| 1112 for (int i = 0; i < configs.count(); ++i) { | 1091 for (int i = 0; i < configs.count(); ++i) { |
| 1113 Target* target = is_enabled(b, configs[i]); | 1092 Target* target = is_enabled(b, configs[i]); |
| 1114 if (!target) { | 1093 if (!target) { |
| 1115 continue; | 1094 continue; |
| 1116 } | 1095 } |
| 1117 | 1096 |
| 1118 // During HWUI output this canvas may be nullptr. | 1097 // During HWUI output this canvas may be nullptr. |
| 1119 SkCanvas* canvas = target->getCanvas(); | 1098 SkCanvas* canvas = target->getCanvas(); |
| 1120 const char* config = target->config.name; | 1099 const char* config = target->config.name.c_str(); |
| 1121 | 1100 |
| 1122 target->setup(); | 1101 target->setup(); |
| 1123 bench->perCanvasPreDraw(canvas); | 1102 bench->perCanvasPreDraw(canvas); |
| 1124 | 1103 |
| 1125 int maxFrameLag; | 1104 int maxFrameLag; |
| 1126 int loops = target->needsFrameTiming(&maxFrameLag) | 1105 int loops = target->needsFrameTiming(&maxFrameLag) |
| 1127 ? setup_gpu_bench(target, bench.get(), maxFrameLag) | 1106 ? setup_gpu_bench(target, bench.get(), maxFrameLag) |
| 1128 : setup_cpu_bench(overhead, target, bench.get()); | 1107 : setup_cpu_bench(overhead, target, bench.get()); |
| 1129 | 1108 |
| 1130 if (FLAGS_ms) { | 1109 if (FLAGS_ms) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1253 | 1232 |
| 1254 return 0; | 1233 return 0; |
| 1255 } | 1234 } |
| 1256 | 1235 |
| 1257 #if !defined SK_BUILD_FOR_IOS | 1236 #if !defined SK_BUILD_FOR_IOS |
| 1258 int main(int argc, char** argv) { | 1237 int main(int argc, char** argv) { |
| 1259 SkCommandLineFlags::Parse(argc, argv); | 1238 SkCommandLineFlags::Parse(argc, argv); |
| 1260 return nanobench_main(); | 1239 return nanobench_main(); |
| 1261 } | 1240 } |
| 1262 #endif | 1241 #endif |
| OLD | NEW |