int tool_main(int argc, char** argv) { SkString usage; usage.printf("Time drawing .skp files.\n" "\tPossible arguments for --filter: [%s]\n\t\t[%s]", filterTypesUsage().c_str(), filterFlagsUsage().c_str()); SkCommandLineFlags::SetUsage(usage.c_str()); SkCommandLineFlags::Parse(argc, argv); if (FLAGS_repeat < 1) { SkString error; error.printf("--repeats must be >= 1. Was %i\n", FLAGS_repeat); gLogger.logError(error); exit(-1); } if (FLAGS_logFile.count() == 1) { if (!gLogger.SetLogFile(FLAGS_logFile[0])) { SkString str; str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); gLogger.logError(str); // TODO(borenet): We're disabling this for now, due to // write-protected Android devices. The very short-term // solution is to ignore the fact that we have no log file. //exit(-1); } } #if SK_ENABLE_INST_COUNT gPrintInstCount = true; #endif SkAutoGraphics ag; sk_tools::PictureBenchmark benchmark; setup_benchmark(&benchmark); int failures = 0; for (int i = 0; i < FLAGS_readPath.count(); ++i) { failures += process_input(FLAGS_readPath[i], benchmark); } if (failures != 0) { SkString err; err.printf("Failed to run %i benchmarks.\n", failures); gLogger.logError(err); return 1; } #if LAZY_CACHE_STATS if (FLAGS_trackDeferredCaching) { SkDebugf("Total cache hit rate: %f\n", (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses)); } #endif return 0; }
int tool_main(int argc, char** argv) { SetupCrashHandler(); SkString usage; usage.printf("Time drawing .skp files.\n" "\tPossible arguments for --filter: [%s]\n\t\t[%s]", filterTypesUsage().c_str(), filterFlagsUsage().c_str()); SkCommandLineFlags::SetUsage(usage.c_str()); SkCommandLineFlags::Parse(argc, argv); if (FLAGS_repeat < 1) { SkString error; error.printf("--repeats must be >= 1. Was %i\n", FLAGS_repeat); gLogger.logError(error); exit(-1); } if (FLAGS_logFile.count() == 1) { if (!gLogger.SetLogFile(FLAGS_logFile[0])) { SkString str; str.printf("Could not open %s for writing.\n", FLAGS_logFile[0]); gLogger.logError(str); // TODO(borenet): We're disabling this for now, due to // write-protected Android devices. The very short-term // solution is to ignore the fact that we have no log file. //exit(-1); } } SkAutoTDelete<PictureJSONResultsWriter> jsonWriter; if (FLAGS_jsonLog.count() == 1) { SkASSERT(FLAGS_builderName.count() == 1 && FLAGS_gitHash.count() == 1); jsonWriter.reset(SkNEW(PictureJSONResultsWriter( FLAGS_jsonLog[0], FLAGS_builderName[0], FLAGS_buildNumber, FLAGS_timestamp, FLAGS_gitHash[0], FLAGS_gitNumber))); gWriter.add(jsonWriter.get()); } gWriter.add(&gLogWriter); #if SK_ENABLE_INST_COUNT gPrintInstCount = true; #endif SkAutoGraphics ag; sk_tools::PictureBenchmark benchmark; setup_benchmark(&benchmark); int failures = 0; for (int i = 0; i < FLAGS_readPath.count(); ++i) { failures += process_input(FLAGS_readPath[i], benchmark); } if (failures != 0) { SkString err; err.printf("Failed to run %i benchmarks.\n", failures); gLogger.logError(err); return 1; } #if SK_LAZY_CACHE_STATS if (FLAGS_trackDeferredCaching) { SkDebugf("Total cache hit rate: %f\n", (double) gTotalCacheHits / (gTotalCacheHits + gTotalCacheMisses)); } #endif #if GR_GPU_STATS if (FLAGS_gpuStats && benchmark.renderer()->isUsingGpuDevice()) { GrContext* ctx = benchmark.renderer()->getGrContext(); SkDebugf("RenderTarget Binds: %d\n", ctx->gpuStats()->renderTargetBinds()); SkDebugf("Shader Compilations: %d\n", ctx->gpuStats()->shaderCompilations()); } #endif gWriter.end(); return 0; }
static void usage(const char* argv0) { SkDebugf("SkPicture benchmarking tool\n"); SkDebugf("\n" "Usage: \n" " %s <inputDir>...\n" " [--logFile filename][--timers [wcgWC]*][--logPerIter 1|0][--min]\n" " [--repeat][--timeIndividualTiles] \n" " [--mode pow2tile minWidth height | record | simple\n" " | tile width height | playbackCreation]\n" " [--pipe]\n" " [--bbh bbhType]\n" " [--multi numThreads]\n" " [--viewport width height]\n" " [--device bitmap" #if SK_SUPPORT_GPU " | gpu" #endif "]\n" " [--filter [%s]:\n [%s]]\n" , argv0, filterTypesUsage().c_str(), filterFlagsUsage().c_str()); SkDebugf("\n"); SkDebugf( " inputDir: A list of directories and files to use as input. Files are\n" " expected to have the .skp extension.\n\n" " --logFile filename : destination for writing log output, in addition to stdout.\n"); SkDebugf(" --logPerIter 1|0 : " "Log each repeat timer instead of mean, default is disabled.\n"); SkDebugf(" --min : Print the minimum times (instead of average).\n"); SkDebugf(" --timers [wcgWC]* : " "Display wall, cpu, gpu, truncated wall or truncated cpu time for each picture.\n"); SkDebugf(" --timeIndividualTiles : Report times for drawing individual tiles, rather than\n" " times for drawing the whole page.\n" " Requires --mode tile\n"); SkDebugf( " --mode pow2tile minWidth height | copyTile width height | record | simple\n" " | tile width height | playbackCreation:\n" " Run in the corresponding mode.\n" " Default is simple.\n"); SkDebugf( " pow2tile minWidth height, Creates tiles with widths\n" " that are all a power of two\n" " such that they minimize the\n" " amount of wasted tile space.\n" " minWidth is the minimum width\n" " of these tiles and must be a\n" " power of two. Simple\n" " rendering using these tiles\n" " is benchmarked.\n"); SkDebugf( " record, Benchmark picture to picture recording.\n"); SkDebugf( " simple, Benchmark a simple rendering.\n"); SkDebugf( " tile width height, Benchmark simple rendering using\n" " tiles with the given dimensions.\n" " copyTile width height, Draw the picture, then copy it into tiles.\n" " Does not support percentages.\n" " If the picture is large enough, breaks it into\n" " larger tiles (and draws the picture once per\n" " larger tile) to avoid creating a large canvas.\n" " Add --tiles x y to specify the number of tiles\n" " per larger tile in the x and y direction.\n" ); SkDebugf( " playbackCreation, Benchmark creation of the SkPicturePlayback.\n"); SkDebugf("\n"); SkDebugf( " --multi numThreads : Set the number of threads for multi threaded drawing. Must be greater\n" " than 1. Only works with tiled rendering.\n" " --viewport width height : Set the viewport.\n" " --pipe: Benchmark SkGPipe rendering. Currently incompatible with \"mode\".\n"); SkDebugf( " --bbh bbhType [width height]: Set the bounding box hierarchy type to\n" " be used. Accepted values are: none, rtree, grid. Default\n" " value is none. Not compatible with --pipe. With value\n" " 'grid', width and height must be specified. 'grid' can\n" " only be used with modes tile, record, and\n" " playbackCreation."); SkDebugf( " --device bitmap" #if SK_SUPPORT_GPU " | gpu" #endif ": Use the corresponding device. Default is bitmap.\n"); SkDebugf( " bitmap, Render to a bitmap.\n"); #if SK_SUPPORT_GPU SkDebugf( " gpu, Render to the GPU.\n"); #endif SkDebugf("\n"); SkDebugf( " --repeat: " "Set the number of times to repeat each test." " Default is %i.\n", DEFAULT_REPEATS); SkDebugf( " --filter type:flag : Enable canvas filtering to disable a paint flag,\n" " use no blur or low quality blur, or use no hinting or\n" " slight hinting. For all flags except AAClip, specify the\n" " type of primitive to effect, or choose all. for AAClip\n" " alone, the filter affects all clips independent of type.\n"); }