| Index: bench/benchmain.cpp
|
| diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp
|
| index 7aeeba63e8b73daa18f80ba02588e36045f04ffc..f86d603ba650f1092feed847e02e8784dd2fc131 100644
|
| --- a/bench/benchmain.cpp
|
| +++ b/bench/benchmain.cpp
|
| @@ -782,6 +782,8 @@ int tool_main(int argc, char** argv) {
|
| for (int x = 0; x < configs.count(); ++x) {
|
| int configIndex = configs[x];
|
|
|
| + bool setupFailed = false;
|
| +
|
| if (kNonRendering_Backend == gConfigs[configIndex].fBackend) {
|
| if (bench->isRendering()) {
|
| continue;
|
| @@ -816,156 +818,164 @@ int tool_main(int argc, char** argv) {
|
|
|
| if (kNonRendering_Backend != backend) {
|
| device = make_device(outConfig, dim, backend, sampleCount, context);
|
| -
|
| - switch(benchMode) {
|
| - case kDeferredSilent_benchModes:
|
| - case kDeferred_benchModes:
|
| - canvas =
|
| + if (NULL == device) {
|
| + SkString error;
|
| + error.printf("Device creation failure for config %s. Will skip.\n", configName);
|
| + logger.logError(error.c_str());
|
| + setupFailed = true;
|
| + } else {
|
| + switch(benchMode) {
|
| + case kDeferredSilent_benchModes:
|
| + case kDeferred_benchModes:
|
| + canvas =
|
| #if SK_DEFERRED_CANVAS_USES_FACTORIES
|
| - SkDeferredCanvas::Create(device);
|
| + SkDeferredCanvas::Create(device);
|
| #else
|
| - SkNEW_ARGS(SkDeferredCanvas, (device));
|
| + SkNEW_ARGS(SkDeferredCanvas, (device));
|
| #endif
|
| - 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;
|
| + 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();
|
| + canvas->clear(SK_ColorWHITE);
|
| }
|
| - device->unref();
|
| - canvas->clear(SK_ColorWHITE);
|
| }
|
| SkAutoUnref canvasUnref(canvas);
|
| -
|
| - 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 (!setupFailed) {
|
| + 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 (!loggedBenchStart) {
|
| - loggedBenchStart = true;
|
| - SkString str;
|
| - str.printf("running bench [%d %d] %28s", dim.fX, dim.fY, bench->getName());
|
| - logger.logProgress(str);
|
| - }
|
| + if (!loggedBenchStart) {
|
| + loggedBenchStart = true;
|
| + SkString str;
|
| + str.printf("running bench [%d %d] %28s", dim.fX, dim.fY, bench->getName());
|
| + logger.logProgress(str);
|
| + }
|
|
|
| - // warm up caches if needed
|
| - if (repeatDraw > 1 && NULL != canvas) {
|
| + // warm up caches if needed
|
| + if (repeatDraw > 1 && NULL != canvas) {
|
| #if SK_SUPPORT_GPU
|
| - // purge the GPU resources to reduce variance
|
| - if (NULL != context) {
|
| - context->freeGpuResources();
|
| - }
|
| + // purge the GPU resources to reduce variance
|
| + if (NULL != context) {
|
| + context->freeGpuResources();
|
| + }
|
| #endif
|
| - SkAutoCanvasRestore acr(canvas, true);
|
| - if (benchMode == kPictureRecord_benchModes) {
|
| - pictureRecordFrom.draw(canvas);
|
| - } else {
|
| - bench->draw(canvas);
|
| - }
|
| + SkAutoCanvasRestore acr(canvas, true);
|
| + if (benchMode == kPictureRecord_benchModes) {
|
| + pictureRecordFrom.draw(canvas);
|
| + } else {
|
| + bench->draw(canvas);
|
| + }
|
|
|
| - if (kDeferredSilent_benchModes == benchMode) {
|
| - static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
|
| - } else {
|
| - canvas->flush();
|
| - }
|
| + if (kDeferredSilent_benchModes == benchMode) {
|
| + static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
|
| + } else {
|
| + canvas->flush();
|
| + }
|
| #if SK_SUPPORT_GPU
|
| - if (NULL != context) {
|
| - context->flush();
|
| - SK_GL(*glContext, Finish());
|
| - }
|
| + if (NULL != context) {
|
| + context->flush();
|
| + SK_GL(*glContext, Finish());
|
| + }
|
| #endif
|
| - }
|
| -
|
| - // 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)) {
|
| - // This will clear the recorded commands so that they do not
|
| - // accumulate.
|
| - canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY,
|
| - SkPicture::kUsePathBoundsForClip_RecordingFlag);
|
| }
|
|
|
| - timer->start(bench->getDurationScale());
|
| - if (NULL != canvas) {
|
| - canvas->save();
|
| - }
|
| - if (benchMode == kPictureRecord_benchModes) {
|
| - pictureRecordFrom.draw(canvas);
|
| - } else {
|
| - bench->draw(canvas);
|
| - }
|
| + // 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)) {
|
| + // This will clear the recorded commands so that they do not
|
| + // accumulate.
|
| + canvas = pictureRecordTo.beginRecording(dim.fX, dim.fY,
|
| + SkPicture::kUsePathBoundsForClip_RecordingFlag);
|
| + }
|
|
|
| - if (kDeferredSilent_benchModes == benchMode) {
|
| - static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
|
| - } else if (NULL != canvas) {
|
| - canvas->flush();
|
| - }
|
| + timer->start(bench->getDurationScale());
|
| + if (NULL != canvas) {
|
| + canvas->save();
|
| + }
|
| + if (benchMode == kPictureRecord_benchModes) {
|
| + pictureRecordFrom.draw(canvas);
|
| + } else {
|
| + bench->draw(canvas);
|
| + }
|
|
|
| - if (NULL != canvas) {
|
| - canvas->restore();
|
| - }
|
| + if (kDeferredSilent_benchModes == benchMode) {
|
| + static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
|
| + } else if (NULL != canvas) {
|
| + canvas->flush();
|
| + }
|
|
|
| - // stop the truncated timer after the last canvas call but
|
| - // don't wait for all the GL calls to complete
|
| - timer->truncatedEnd();
|
| + 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();
|
| #if SK_SUPPORT_GPU
|
| - if (NULL != glContext) {
|
| - context->flush();
|
| - SK_GL(*glContext, Finish());
|
| - }
|
| + if (NULL != glContext) {
|
| + context->flush();
|
| + SK_GL(*glContext, Finish());
|
| + }
|
| #endif
|
| - // stop the inclusive and gpu timers once all the GL calls
|
| - // have completed
|
| - timer->end();
|
| + // stop the inclusive and gpu timers once all the GL calls
|
| + // have completed
|
| + timer->end();
|
|
|
| - timerData.appendTimes(timer, repeatDraw - 1 == i);
|
| + timerData.appendTimes(timer, repeatDraw - 1 == i);
|
|
|
| + }
|
| + if (repeatDraw > 1) {
|
| + SkString result = timerData.getResult(
|
| + logPerIter, printMin, repeatDraw, configName,
|
| + timerWall, truncatedTimerWall, timerCpu,
|
| + truncatedTimerCpu,
|
| + timerGpu && NULL != context);
|
| + logger.logProgress(result);
|
| + }
|
| + if (outDir.size() > 0 && kNonRendering_Backend != backend) {
|
| + saveFile(bench->getName(), configName, outDir.c_str(),
|
| + device->accessBitmap(false));
|
| + }
|
| }
|
| - if (repeatDraw > 1) {
|
| - SkString result = timerData.getResult(logPerIter, printMin, repeatDraw, configName,
|
| - timerWall, truncatedTimerWall, timerCpu,
|
| - truncatedTimerCpu,
|
| - timerGpu && NULL != context);
|
| - logger.logProgress(result);
|
| - }
|
| - if (outDir.size() > 0 && kNonRendering_Backend != backend) {
|
| - saveFile(bench->getName(), configName, outDir.c_str(),
|
| - device->accessBitmap(false));
|
| + if (loggedBenchStart) {
|
| + logger.logProgress(SkString("\n"));
|
| }
|
| }
|
| - if (loggedBenchStart) {
|
| - logger.logProgress(SkString("\n"));
|
| - }
|
| }
|
| #if SK_SUPPORT_GPU
|
| #if GR_CACHE_STATS
|
|
|