Chromium Code Reviews| Index: bench/benchmain.cpp |
| =================================================================== |
| --- bench/benchmain.cpp (revision 8152) |
| +++ bench/benchmain.cpp (working copy) |
| @@ -186,6 +186,7 @@ |
| } |
| enum Backend { |
| + kNonRendering_Backend, |
| kRaster_Backend, |
| kGPU_Backend, |
| kPDF_Backend, |
| @@ -240,17 +241,18 @@ |
| Backend fBackend; |
| GLContextType fContextType; |
| } gConfigs[] = { |
| - { SkBitmap::kARGB_8888_Config, "8888", kRaster_Backend, kDontCareGLCtxType }, |
| - { SkBitmap::kRGB_565_Config, "565", kRaster_Backend, kDontCareGLCtxType }, |
| + { SkBitmap::kNo_Config, "NONRENDERING", kNonRendering_Backend, kDontCareGLCtxType }, |
| + { SkBitmap::kARGB_8888_Config, "8888", kRaster_Backend, kDontCareGLCtxType }, |
| + { SkBitmap::kRGB_565_Config, "565", kRaster_Backend, kDontCareGLCtxType }, |
| #if SK_SUPPORT_GPU |
| - { SkBitmap::kARGB_8888_Config, "GPU", kGPU_Backend, GrContextFactory::kNative_GLContextType }, |
| + { SkBitmap::kARGB_8888_Config, "GPU", kGPU_Backend, GrContextFactory::kNative_GLContextType }, |
| #if SK_ANGLE |
| - { SkBitmap::kARGB_8888_Config, "ANGLE", kGPU_Backend, GrContextFactory::kANGLE_GLContextType }, |
| + { SkBitmap::kARGB_8888_Config, "ANGLE", kGPU_Backend, GrContextFactory::kANGLE_GLContextType }, |
| #endif // SK_ANGLE |
| #ifdef SK_DEBUG |
| - { SkBitmap::kARGB_8888_Config, "Debug", kGPU_Backend, GrContextFactory::kDebug_GLContextType }, |
| + { SkBitmap::kARGB_8888_Config, "Debug", kGPU_Backend, GrContextFactory::kDebug_GLContextType }, |
| #endif // SK_DEBUG |
| - { SkBitmap::kARGB_8888_Config, "NULLGPU", kGPU_Backend, GrContextFactory::kNull_GLContextType }, |
| + { SkBitmap::kARGB_8888_Config, "NULLGPU", kGPU_Backend, GrContextFactory::kNull_GLContextType }, |
| #endif // SK_SUPPORT_GPU |
| }; |
| @@ -325,13 +327,12 @@ |
| " picturerecord, Benchmark the time to do record from a \n" |
| " SkPicture to a SkPicture.\n"); |
| SkDebugf(" --logFile filename : destination for writing log output, in addition to stdout.\n"); |
| -#if SK_SUPPORT_GPU |
| - SkDebugf(" --config 8888|565|GPU|ANGLE|NULLGPU : " |
| - "Run bench in corresponding config mode.\n"); |
| -#else |
| - SkDebugf(" --config 8888|565: " |
| - "Run bench in corresponding config mode.\n"); |
| -#endif |
| + SkDebugf(" --config "); |
| + static const int kConfigCount = SK_ARRAY_COUNT(gConfigs); |
|
robertphillips
2013/03/14 21:13:51
size_t -> int? or kConfigCount -> size_t?
bsalomon
2013/03/15 15:44:10
Done. (kConfigCount -> size_t).
|
| + for (size_t i = 0; i < kConfigCount; ++i) { |
| + SkDebugf("%s%s", gConfigs[i].fName, ((i == kConfigCount - 1) ? "" : "|")); |
| + } |
| + SkDebugf(" : Run bench in corresponding config mode.\n"); |
| SkDebugf(" -Dfoo bar : Add extra definition to bench.\n"); |
| SkDebugf(" -h|--help : Show this help message.\n"); |
| } |
| @@ -592,6 +593,16 @@ |
| *configs.append() = i; |
| } |
| } |
| + if (kNormal_benchModes != benchMode) { |
| + // Non-rendering configs only run in normal mode |
| + for (int i = 0; i < configs.count(); ++i) { |
| + int configIdx = configs[i]; |
| + if (kNonRendering_Backend == gConfigs[configIdx].fBackend) { |
| + configs.remove(i, 1); |
| + --i; |
| + } |
| + } |
| + } |
| // report our current settings |
| { |
| @@ -697,24 +708,23 @@ |
| continue; |
| } |
| - { |
| - SkString str; |
| - str.printf("running bench [%d %d] %28s", dim.fX, dim.fY, |
| - bench->getName()); |
| - logger.logProgress(str); |
| - } |
| + bool loggedBenchStart = false; |
| AutoPrePostDraw appd(bench); |
| - bool runOnce = false; |
| for (int x = 0; x < configs.count(); ++x) { |
| - if (!bench->isRendering() && runOnce) { |
| - continue; |
| + int configIndex = configs[x]; |
| + |
| + if (kNonRendering_Backend == gConfigs[configIndex].fBackend) { |
| + if (bench->isRendering()) { |
| + continue; |
| + } |
| + } else { |
| + if (!bench->isRendering()) { |
| + continue; |
| + } |
| } |
| - runOnce = true; |
| - int configIndex = configs[x]; |
| - |
| outConfig = gConfigs[configIndex].fConfig; |
| configName = gConfigs[configIndex].fName; |
| backend = gConfigs[configIndex].fBackend; |
| @@ -731,56 +741,70 @@ |
| glContext = gContextFactory.getGLContext(gConfigs[configIndex].fContextType); |
| } |
| #endif |
| - SkDevice* device = make_device(outConfig, dim, backend, context); |
| + SkDevice* device = NULL; |
| SkCanvas* canvas = NULL; |
| SkPicture pictureRecordFrom; |
| SkPicture pictureRecordTo; |
| - switch(benchMode) { |
| - case kDeferredSilent_benchModes: |
| - case kDeferred_benchModes: |
| - canvas = new SkDeferredCanvas(device); |
| - break; |
| - case kRecord_benchModes: |
| - canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY, |
| - SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| - canvas->ref(); |
| - break; |
| - case kPictureRecord_benchModes: { |
| - // This sets up picture-to-picture recording. |
| - // The C++ drawing calls for the benchmark are recorded into |
| - // pictureRecordFrom. As the benchmark, we will time how |
| - // long it takes to playback pictureRecordFrom into |
| - // pictureRecordTo. |
| - SkCanvas* tempCanvas = pictureRecordFrom.beginRecording(dim.fX, dim.fY, |
| - SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| - bench->draw(tempCanvas); |
| - pictureRecordFrom.endRecording(); |
| - canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY, |
| - SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| - canvas->ref(); |
| - break; |
| + |
| + if (kNonRendering_Backend != backend) { |
| + device = make_device(outConfig, dim, backend, context); |
| + |
| + switch(benchMode) { |
| + case kDeferredSilent_benchModes: |
| + case kDeferred_benchModes: |
| + canvas = new SkDeferredCanvas(device); |
| + break; |
| + case kRecord_benchModes: |
| + canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY, |
| + SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| + canvas->ref(); |
| + break; |
| + case kPictureRecord_benchModes: { |
| + // This sets up picture-to-picture recording. |
| + // The C++ drawing calls for the benchmark are recorded into |
| + // pictureRecordFrom. As the benchmark, we will time how |
| + // long it takes to playback pictureRecordFrom into |
| + // pictureRecordTo. |
| + SkCanvas* tempCanvas = pictureRecordFrom.beginRecording(dim.fX, dim.fY, |
| + SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| + bench->draw(tempCanvas); |
| + pictureRecordFrom.endRecording(); |
| + canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY, |
| + SkPicture::kUsePathBoundsForClip_RecordingFlag); |
| + canvas->ref(); |
| + break; |
| + } |
| + case kNormal_benchModes: |
| + canvas = new SkCanvas(device); |
| + break; |
| + default: |
| + SkASSERT(0); |
| } |
| - case kNormal_benchModes: |
| - canvas = new SkCanvas(device); |
| - break; |
| - default: |
| - SkASSERT(0); |
| + device->unref(); |
| } |
| - device->unref(); |
| SkAutoUnref canvasUnref(canvas); |
| - if (doClip) { |
| - performClip(canvas, dim.fX, dim.fY); |
| + if (NULL != canvas) { |
| + if (doClip) { |
| + performClip(canvas, dim.fX, dim.fY); |
| + } |
| + if (doScale) { |
| + performScale(canvas, dim.fX, dim.fY); |
| + } |
| + if (doRotate) { |
| + performRotate(canvas, dim.fX, dim.fY); |
| + } |
| } |
| - if (doScale) { |
| - performScale(canvas, dim.fX, dim.fY); |
| + |
| + if (!loggedBenchStart) { |
| + loggedBenchStart = true; |
| + SkString str; |
| + str.printf("running bench [%d %d] %28s", dim.fX, dim.fY, bench->getName()); |
| + logger.logProgress(str); |
| } |
| - if (doRotate) { |
| - performRotate(canvas, dim.fX, dim.fY); |
| - } |
| // warm up caches if needed |
| - if (repeatDraw > 1) { |
| + if (repeatDraw > 1 && NULL != canvas) { |
| #if SK_SUPPORT_GPU |
| // purge the GPU resources to reduce variance |
| if (NULL != context) { |
| @@ -810,8 +834,7 @@ |
| // record timer values for each repeat, and their sum |
| TimerData timerData(perIterTimeformat, normalTimeFormat); |
| for (int i = 0; i < repeatDraw; i++) { |
| - if ((benchMode == kRecord_benchModes |
| - || benchMode == kPictureRecord_benchModes)) { |
| + if ((benchMode == kRecord_benchModes || benchMode == kPictureRecord_benchModes)) { |
| // This will clear the recorded commands so that they do not |
| // accumulate. |
| canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY, |
| @@ -819,7 +842,9 @@ |
| } |
| timer->start(); |
| - SkAutoCanvasRestore acr(canvas, true); |
| + if (NULL != canvas) { |
| + canvas->save(); |
| + } |
| if (benchMode == kPictureRecord_benchModes) { |
| pictureRecordFrom.draw(canvas); |
| } else { |
| @@ -828,10 +853,14 @@ |
| if (kDeferredSilent_benchModes == benchMode) { |
| static_cast<SkDeferredCanvas*>(canvas)->silentFlush(); |
| - } else { |
| + } else if (NULL != canvas) { |
| canvas->flush(); |
| } |
| + if (NULL != canvas) { |
| + canvas->restore(); |
| + } |
| + |
| // stop the truncated timer after the last canvas call but |
| // don't wait for all the GL calls to complete |
| timer->truncatedEnd(); |
| @@ -855,13 +884,15 @@ |
| timerGpu && NULL != context); |
| logger.logProgress(result); |
| } |
| - if (outDir.size() > 0) { |
| + if (outDir.size() > 0 && kNonRendering_Backend != backend) { |
| saveFile(bench->getName(), configName, outDir.c_str(), |
| device->accessBitmap(false)); |
| canvas->clear(SK_ColorWHITE); |
| } |
| } |
| - logger.logProgress(SkString("\n")); |
| + if (loggedBenchStart) { |
| + logger.logProgress(SkString("\n")); |
| + } |
| } |
| #if SK_SUPPORT_GPU |
| #if GR_CACHE_STATS |