| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "BenchTimer.h" | 8 #include "BenchTimer.h" |
| 9 #include "ResultsWriter.h" | 9 #include "ResultsWriter.h" |
| 10 #include "SkBenchLogger.h" | 10 #include "SkBenchLogger.h" |
| 11 #include "SkBenchmark.h" | 11 #include "SkBenchmark.h" |
| 12 #include "SkBitmapDevice.h" | 12 #include "SkBitmapDevice.h" |
| 13 #include "SkCanvas.h" | 13 #include "SkCanvas.h" |
| 14 #include "SkColorPriv.h" | 14 #include "SkColorPriv.h" |
| 15 #include "SkCommandLineFlags.h" | 15 #include "SkCommandLineFlags.h" |
| 16 #include "SkData.h" |
| 16 #include "SkDeferredCanvas.h" | 17 #include "SkDeferredCanvas.h" |
| 17 #include "SkGraphics.h" | 18 #include "SkGraphics.h" |
| 18 #include "SkImageEncoder.h" | 19 #include "SkImageEncoder.h" |
| 19 #include "SkOSFile.h" | 20 #include "SkOSFile.h" |
| 20 #include "SkPicture.h" | 21 #include "SkPicture.h" |
| 21 #include "SkString.h" | 22 #include "SkString.h" |
| 23 #include "SkSurface.h" |
| 22 | 24 |
| 23 #if SK_SUPPORT_GPU | 25 #if SK_SUPPORT_GPU |
| 24 #include "GrContext.h" | 26 #include "GrContext.h" |
| 25 #include "GrContextFactory.h" | 27 #include "GrContextFactory.h" |
| 26 #include "GrRenderTarget.h" | 28 #include "GrRenderTarget.h" |
| 27 #include "SkGpuDevice.h" | 29 #include "SkGpuDevice.h" |
| 28 #include "gl/GrGLDefines.h" | 30 #include "gl/GrGLDefines.h" |
| 29 #else | 31 #else |
| 30 class GrContext; | 32 class GrContext; |
| 31 #endif // SK_SUPPORT_GPU | 33 #endif // SK_SUPPORT_GPU |
| 32 | 34 |
| 33 #include <limits> | 35 #include <limits> |
| 34 | 36 |
| 35 enum BenchMode { | 37 enum BenchMode { |
| 36 kNormal_BenchMode, | 38 kNormal_BenchMode, |
| 37 kDeferred_BenchMode, | 39 kDeferred_BenchMode, |
| 38 kDeferredSilent_BenchMode, | 40 kDeferredSilent_BenchMode, |
| 39 kRecord_BenchMode, | 41 kRecord_BenchMode, |
| 40 kPictureRecord_BenchMode | 42 kPictureRecord_BenchMode |
| 41 }; | 43 }; |
| 42 const char* BenchMode_Name[] = { | 44 const char* BenchMode_Name[] = { |
| 43 "normal", "deferred", "deferredSilent", "record", "picturerecord" | 45 "normal", "deferred", "deferredSilent", "record", "picturerecord" |
| 44 }; | 46 }; |
| 45 | 47 |
| 46 static const char kDefaultsConfigStr[] = "defaults"; | 48 static const char kDefaultsConfigStr[] = "defaults"; |
| 47 | 49 |
| 48 /////////////////////////////////////////////////////////////////////////////// | 50 /////////////////////////////////////////////////////////////////////////////// |
| 49 | 51 |
| 50 static void erase(SkBitmap& bm) { | |
| 51 if (bm.config() == SkBitmap::kA8_Config) { | |
| 52 bm.eraseColor(SK_ColorTRANSPARENT); | |
| 53 } else { | |
| 54 bm.eraseColor(SK_ColorWHITE); | |
| 55 } | |
| 56 } | |
| 57 | |
| 58 class Iter { | 52 class Iter { |
| 59 public: | 53 public: |
| 60 Iter() : fBench(BenchRegistry::Head()) {} | 54 Iter() : fBench(BenchRegistry::Head()) {} |
| 61 | 55 |
| 62 SkBenchmark* next() { | 56 SkBenchmark* next() { |
| 63 if (fBench) { | 57 if (fBench) { |
| 64 BenchRegistry::Factory f = fBench->factory(); | 58 BenchRegistry::Factory f = fBench->factory(); |
| 65 fBench = fBench->next(); | 59 fBench = fBench->next(); |
| 66 return f(); | 60 return f(); |
| 67 } | 61 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 94 case ':': | 88 case ':': |
| 95 path->writable_str()[i] = '-'; | 89 path->writable_str()[i] = '-'; |
| 96 break; | 90 break; |
| 97 default: | 91 default: |
| 98 break; | 92 break; |
| 99 } | 93 } |
| 100 } | 94 } |
| 101 } | 95 } |
| 102 | 96 |
| 103 static void saveFile(const char name[], const char config[], const char dir[], | 97 static void saveFile(const char name[], const char config[], const char dir[], |
| 104 const SkBitmap& bm) { | 98 const SkImage* image) { |
| 105 SkBitmap copy; | 99 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100)); |
| 106 if (!bm.copyTo(©, SkBitmap::kARGB_8888_Config)) { | 100 if (NULL == data.get()) { |
| 107 return; | 101 return; |
| 108 } | 102 } |
| 109 | 103 |
| 110 if (bm.config() == SkBitmap::kA8_Config) { | |
| 111 // turn alpha into gray-scale | |
| 112 size_t size = copy.getSize() >> 2; | |
| 113 SkPMColor* p = copy.getAddr32(0, 0); | |
| 114 for (size_t i = 0; i < size; i++) { | |
| 115 int c = (*p >> SK_A32_SHIFT) & 0xFF; | |
| 116 c = 255 - c; | |
| 117 c |= (c << 24) | (c << 16) | (c << 8); | |
| 118 *p++ = c | (SK_A32_MASK << SK_A32_SHIFT); | |
| 119 } | |
| 120 } | |
| 121 | |
| 122 SkString filename; | 104 SkString filename; |
| 123 make_filename(name, &filename); | 105 make_filename(name, &filename); |
| 124 filename.appendf("_%s.png", config); | 106 filename.appendf("_%s.png", config); |
| 125 SkString path = SkOSPath::SkPathJoin(dir, filename.c_str()); | 107 SkString path = SkOSPath::SkPathJoin(dir, filename.c_str()); |
| 126 ::remove(path.c_str()); | 108 ::remove(path.c_str()); |
| 127 SkImageEncoder::EncodeFile(path.c_str(), copy, SkImageEncoder::kPNG_Type, 10
0); | 109 |
| 110 SkFILEWStream stream(filename.c_str()); |
| 111 stream.write(data->data(), data->size()); |
| 128 } | 112 } |
| 129 | 113 |
| 130 static void performClip(SkCanvas* canvas, int w, int h) { | 114 static void performClip(SkCanvas* canvas, int w, int h) { |
| 131 SkRect r; | 115 SkRect r; |
| 132 | 116 |
| 133 r.set(SkIntToScalar(10), SkIntToScalar(10), | 117 r.set(SkIntToScalar(10), SkIntToScalar(10), |
| 134 SkIntToScalar(w*2/3), SkIntToScalar(h*2/3)); | 118 SkIntToScalar(w*2/3), SkIntToScalar(h*2/3)); |
| 135 canvas->clipRect(r, SkRegion::kIntersect_Op); | 119 canvas->clipRect(r, SkRegion::kIntersect_Op); |
| 136 | 120 |
| 137 r.set(SkIntToScalar(w/3), SkIntToScalar(h/3), | 121 r.set(SkIntToScalar(w/3), SkIntToScalar(h/3), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 151 static void performScale(SkCanvas* canvas, int w, int h) { | 135 static void performScale(SkCanvas* canvas, int w, int h) { |
| 152 const SkScalar x = SkIntToScalar(w) / 2; | 136 const SkScalar x = SkIntToScalar(w) / 2; |
| 153 const SkScalar y = SkIntToScalar(h) / 2; | 137 const SkScalar y = SkIntToScalar(h) / 2; |
| 154 | 138 |
| 155 canvas->translate(x, y); | 139 canvas->translate(x, y); |
| 156 // just enough so we can't take the sprite case | 140 // just enough so we can't take the sprite case |
| 157 canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100); | 141 canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100); |
| 158 canvas->translate(-x, -y); | 142 canvas->translate(-x, -y); |
| 159 } | 143 } |
| 160 | 144 |
| 161 static SkBaseDevice* make_device(SkBitmap::Config config, const SkIPoint& size, | 145 static SkSurface* make_surface(SkColorType colorType, const SkIPoint& size, |
| 162 SkBenchmark::Backend backend, int sampleCount,
GrContext* context) { | 146 SkBenchmark::Backend backend, int sampleCount, |
| 163 SkBaseDevice* device = NULL; | 147 GrContext* context) { |
| 164 SkBitmap bitmap; | 148 SkSurface* surface = NULL; |
| 165 bitmap.setConfig(config, size.fX, size.fY); | 149 SkImageInfo info = SkImageInfo::Make(size.fX, size.fY, colorType, |
| 150 kPremul_SkAlphaType); |
| 166 | 151 |
| 167 switch (backend) { | 152 switch (backend) { |
| 168 case SkBenchmark::kRaster_Backend: | 153 case SkBenchmark::kRaster_Backend: |
| 169 bitmap.allocPixels(); | 154 surface = SkSurface::NewRaster(info); |
| 170 erase(bitmap); | 155 surface->getCanvas()->clear(SK_ColorWHITE); |
| 171 device = SkNEW_ARGS(SkBitmapDevice, (bitmap)); | |
| 172 break; | 156 break; |
| 173 #if SK_SUPPORT_GPU | 157 #if SK_SUPPORT_GPU |
| 174 case SkBenchmark::kGPU_Backend: { | 158 case SkBenchmark::kGPU_Backend: { |
| 175 GrTextureDesc desc; | 159 surface = SkSurface::NewRenderTarget(context, info, sampleCount); |
| 176 desc.fConfig = kSkia8888_GrPixelConfig; | |
| 177 desc.fFlags = kRenderTarget_GrTextureFlagBit; | |
| 178 desc.fWidth = size.fX; | |
| 179 desc.fHeight = size.fY; | |
| 180 desc.fSampleCnt = sampleCount; | |
| 181 SkAutoTUnref<GrTexture> texture(context->createUncachedTexture(desc,
NULL, 0)); | |
| 182 if (!texture) { | |
| 183 return NULL; | |
| 184 } | |
| 185 device = SkNEW_ARGS(SkGpuDevice, (context, texture.get())); | |
| 186 break; | 160 break; |
| 187 } | 161 } |
| 188 #endif | 162 #endif |
| 189 case SkBenchmark::kPDF_Backend: | 163 case SkBenchmark::kPDF_Backend: |
| 190 default: | 164 default: |
| 191 SkDEBUGFAIL("unsupported"); | 165 SkDEBUGFAIL("unsupported"); |
| 192 } | 166 } |
| 193 return device; | 167 return surface; |
| 194 } | 168 } |
| 195 | 169 |
| 196 #if SK_SUPPORT_GPU | 170 #if SK_SUPPORT_GPU |
| 197 GrContextFactory gContextFactory; | 171 GrContextFactory gContextFactory; |
| 198 typedef GrContextFactory::GLContextType GLContextType; | 172 typedef GrContextFactory::GLContextType GLContextType; |
| 199 static const GLContextType kNative = GrContextFactory::kNative_GLContextType; | 173 static const GLContextType kNative = GrContextFactory::kNative_GLContextType; |
| 200 static const GLContextType kNVPR = GrContextFactory::kNVPR_GLContextType; | 174 static const GLContextType kNVPR = GrContextFactory::kNVPR_GLContextType; |
| 201 #if SK_ANGLE | 175 #if SK_ANGLE |
| 202 static const GLContextType kANGLE = GrContextFactory::kANGLE_GLContextType; | 176 static const GLContextType kANGLE = GrContextFactory::kANGLE_GLContextType; |
| 203 #endif | 177 #endif |
| 204 static const GLContextType kDebug = GrContextFactory::kDebug_GLContextType; | 178 static const GLContextType kDebug = GrContextFactory::kDebug_GLContextType; |
| 205 static const GLContextType kNull = GrContextFactory::kNull_GLContextType; | 179 static const GLContextType kNull = GrContextFactory::kNull_GLContextType; |
| 206 #else | 180 #else |
| 207 typedef int GLContextType; | 181 typedef int GLContextType; |
| 208 static const GLContextType kNative = 0, kANGLE = 0, kDebug = 0, kNull = 0; | 182 static const GLContextType kNative = 0, kANGLE = 0, kDebug = 0, kNull = 0; |
| 209 #endif | 183 #endif |
| 210 | 184 |
| 211 #ifdef SK_DEBUG | 185 #ifdef SK_DEBUG |
| 212 static const bool kIsDebug = true; | 186 static const bool kIsDebug = true; |
| 213 #else | 187 #else |
| 214 static const bool kIsDebug = false; | 188 static const bool kIsDebug = false; |
| 215 #endif | 189 #endif |
| 216 | 190 |
| 217 static const struct Config { | 191 static const struct Config { |
| 218 SkBitmap::Config config; | 192 SkColorType fColorType; |
| 219 const char* name; | 193 const char* name; |
| 220 int sampleCount; | 194 int sampleCount; |
| 221 SkBenchmark::Backend backend; | 195 SkBenchmark::Backend backend; |
| 222 GLContextType contextType; | 196 GLContextType contextType; |
| 223 bool runByDefault; | 197 bool runByDefault; |
| 224 } gConfigs[] = { | 198 } gConfigs[] = { |
| 225 { SkBitmap::kNo_Config, "NONRENDERING", 0, SkBenchmark::kNonRendering
_Backend, kNative, true}, | 199 { kPMColor_SkColorType, "NONRENDERING", 0, SkBenchmark::kNonRendering_Backen
d, kNative, true}, |
| 226 { SkBitmap::kARGB_8888_Config, "8888", 0, SkBenchmark::kRaster_Backe
nd, kNative, true}, | 200 { kPMColor_SkColorType, "8888", 0, SkBenchmark::kRaster_Backend,
kNative, true}, |
| 227 { SkBitmap::kRGB_565_Config, "565", 0, SkBenchmark::kRaster_Backe
nd, kNative, true}, | 201 { kRGB_565_SkColorType, "565", 0, SkBenchmark::kRaster_Backend,
kNative, true}, |
| 228 #if SK_SUPPORT_GPU | 202 #if SK_SUPPORT_GPU |
| 229 { SkBitmap::kARGB_8888_Config, "GPU", 0, SkBenchmark::kGPU_Backend,
kNative, true}, | 203 { kPMColor_SkColorType, "GPU", 0, SkBenchmark::kGPU_Backend,
kNative, true}, |
| 230 { SkBitmap::kARGB_8888_Config, "MSAA4", 4, SkBenchmark::kGPU_Backend,
kNative, false}, | 204 { kPMColor_SkColorType, "MSAA4", 4, SkBenchmark::kGPU_Backend,
kNative, false}, |
| 231 { SkBitmap::kARGB_8888_Config, "MSAA16", 16, SkBenchmark::kGPU_Backend,
kNative, false}, | 205 { kPMColor_SkColorType, "MSAA16", 16, SkBenchmark::kGPU_Backend,
kNative, false}, |
| 232 { SkBitmap::kARGB_8888_Config, "NVPRMSAA4", 4, SkBenchmark::kGPU_Backend,
kNVPR, true}, | 206 { kPMColor_SkColorType, "NVPRMSAA4", 4, SkBenchmark::kGPU_Backend,
kNVPR, true}, |
| 233 { SkBitmap::kARGB_8888_Config, "NVPRMSAA16", 16, SkBenchmark::kGPU_Backend,
kNVPR, false}, | 207 { kPMColor_SkColorType, "NVPRMSAA16", 16, SkBenchmark::kGPU_Backend,
kNVPR, false}, |
| 234 #if SK_ANGLE | 208 #if SK_ANGLE |
| 235 { SkBitmap::kARGB_8888_Config, "ANGLE", 0, SkBenchmark::kGPU_Backend,
kANGLE, true}, | 209 { kPMColor_SkColorType, "ANGLE", 0, SkBenchmark::kGPU_Backend,
kANGLE, true}, |
| 236 #endif // SK_ANGLE | 210 #endif // SK_ANGLE |
| 237 { SkBitmap::kARGB_8888_Config, "Debug", 0, SkBenchmark::kGPU_Backend,
kDebug, kIsDebug}, | 211 { kPMColor_SkColorType, "Debug", 0, SkBenchmark::kGPU_Backend,
kDebug, kIsDebug}, |
| 238 { SkBitmap::kARGB_8888_Config, "NULLGPU", 0, SkBenchmark::kGPU_Backend,
kNull, true}, | 212 { kPMColor_SkColorType, "NULLGPU", 0, SkBenchmark::kGPU_Backend,
kNull, true}, |
| 239 #endif // SK_SUPPORT_GPU | 213 #endif // SK_SUPPORT_GPU |
| 240 }; | 214 }; |
| 241 | 215 |
| 242 DEFINE_string(outDir, "", "If given, image of each bench will be put in outDir."
); | 216 DEFINE_string(outDir, "", "If given, image of each bench will be put in outDir."
); |
| 243 DEFINE_string(timers, "cg", "Timers to display. " | 217 DEFINE_string(timers, "cg", "Timers to display. " |
| 244 "Options: w(all) W(all, truncated) c(pu) C(pu, truncated) g(pu)"); | 218 "Options: w(all) W(all, truncated) c(pu) C(pu, truncated) g(pu)"); |
| 245 | 219 |
| 246 DEFINE_bool(rotate, false, "Rotate canvas before bench run?"); | 220 DEFINE_bool(rotate, false, "Rotate canvas before bench run?"); |
| 247 DEFINE_bool(scale, false, "Scale canvas before bench run?"); | 221 DEFINE_bool(scale, false, "Scale canvas before bench run?"); |
| 248 DEFINE_bool(clip, false, "Clip canvas before bench run?"); | 222 DEFINE_bool(clip, false, "Clip canvas before bench run?"); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 #if SK_SUPPORT_GPU | 458 #if SK_SUPPORT_GPU |
| 485 SkGLContextHelper* glContext = NULL; | 459 SkGLContextHelper* glContext = NULL; |
| 486 if (SkBenchmark::kGPU_Backend == config.backend) { | 460 if (SkBenchmark::kGPU_Backend == config.backend) { |
| 487 context = gContextFactory.get(config.contextType); | 461 context = gContextFactory.get(config.contextType); |
| 488 if (NULL == context) { | 462 if (NULL == context) { |
| 489 continue; | 463 continue; |
| 490 } | 464 } |
| 491 glContext = gContextFactory.getGLContext(config.contextType); | 465 glContext = gContextFactory.getGLContext(config.contextType); |
| 492 } | 466 } |
| 493 #endif | 467 #endif |
| 494 SkAutoTUnref<SkBaseDevice> device; | 468 |
| 495 SkAutoTUnref<SkCanvas> canvas; | 469 SkAutoTUnref<SkCanvas> canvas; |
| 496 SkPicture recordFrom, recordTo; | 470 SkPicture recordFrom, recordTo; |
| 497 const SkIPoint dim = bench->getSize(); | 471 const SkIPoint dim = bench->getSize(); |
| 498 | 472 |
| 499 const SkPicture::RecordingFlags kRecordFlags = | 473 const SkPicture::RecordingFlags kRecordFlags = |
| 500 SkPicture::kUsePathBoundsForClip_RecordingFlag; | 474 SkPicture::kUsePathBoundsForClip_RecordingFlag; |
| 501 | 475 |
| 476 SkAutoTUnref<SkSurface> surface; |
| 502 if (SkBenchmark::kNonRendering_Backend != config.backend) { | 477 if (SkBenchmark::kNonRendering_Backend != config.backend) { |
| 503 device.reset(make_device(config.config, | 478 surface.reset(make_surface(config.fColorType, |
| 504 dim, | 479 dim, |
| 505 config.backend, | 480 config.backend, |
| 506 config.sampleCount, | 481 config.sampleCount, |
| 507 context)); | 482 context)); |
| 508 if (!device.get()) { | 483 if (!surface.get()) { |
| 509 logger.logError(SkStringPrintf( | 484 logger.logError(SkStringPrintf( |
| 510 "Device creation failure for config %s. Will skip.\n", c
onfig.name)); | 485 "Device creation failure for config %s. Will skip.\n", c
onfig.name)); |
| 511 continue; | 486 continue; |
| 512 } | 487 } |
| 513 | 488 |
| 514 switch(benchMode) { | 489 switch(benchMode) { |
| 515 case kDeferredSilent_BenchMode: | 490 case kDeferredSilent_BenchMode: |
| 516 case kDeferred_BenchMode: | 491 case kDeferred_BenchMode: |
| 517 canvas.reset(SkDeferredCanvas::Create(device.get())); | 492 canvas.reset(SkDeferredCanvas::Create(surface.get())); |
| 518 break; | 493 break; |
| 519 case kRecord_BenchMode: | 494 case kRecord_BenchMode: |
| 520 canvas.reset(SkRef(recordTo.beginRecording(dim.fX, dim.f
Y, kRecordFlags))); | 495 canvas.reset(SkRef(recordTo.beginRecording(dim.fX, dim.f
Y, kRecordFlags))); |
| 521 break; | 496 break; |
| 522 case kPictureRecord_BenchMode: | 497 case kPictureRecord_BenchMode: |
| 523 bench->draw(1, recordFrom.beginRecording(dim.fX, dim.fY,
kRecordFlags)); | 498 bench->draw(1, recordFrom.beginRecording(dim.fX, dim.fY,
kRecordFlags)); |
| 524 recordFrom.endRecording(); | 499 recordFrom.endRecording(); |
| 525 canvas.reset(SkRef(recordTo.beginRecording(dim.fX, dim.f
Y, kRecordFlags))); | 500 canvas.reset(SkRef(recordTo.beginRecording(dim.fX, dim.f
Y, kRecordFlags))); |
| 526 break; | 501 break; |
| 527 case kNormal_BenchMode: | 502 case kNormal_BenchMode: |
| 528 canvas.reset(new SkCanvas(device.get())); | 503 canvas.reset(SkRef(surface->getCanvas())); |
| 529 break; | 504 break; |
| 530 default: | 505 default: |
| 531 SkASSERT(false); | 506 SkASSERT(false); |
| 532 } | 507 } |
| 533 } | 508 } |
| 534 | 509 |
| 535 if (NULL != canvas) { | 510 if (NULL != canvas) { |
| 536 canvas->clear(SK_ColorWHITE); | 511 canvas->clear(SK_ColorWHITE); |
| 537 if (FLAGS_clip) { performClip(canvas, dim.fX, dim.fY); } | 512 if (FLAGS_clip) { performClip(canvas, dim.fX, dim.fY); } |
| 538 if (FLAGS_scale) { performScale(canvas, dim.fX, dim.fY); } | 513 if (FLAGS_scale) { performScale(canvas, dim.fX, dim.fY); } |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 | 628 |
| 654 const double current = timer.fWall / loopsPerIter; | 629 const double current = timer.fWall / loopsPerIter; |
| 655 if (FLAGS_verbose && current > previous) { SkDebugf("↑"); } | 630 if (FLAGS_verbose && current > previous) { SkDebugf("↑"); } |
| 656 if (FLAGS_verbose) { SkDebugf("%.3g ", current); } | 631 if (FLAGS_verbose) { SkDebugf("%.3g ", current); } |
| 657 converged = HasConverged(previous, current, timer.fWall); | 632 converged = HasConverged(previous, current, timer.fWall); |
| 658 previous = current; | 633 previous = current; |
| 659 } while (!kIsDebug && !converged); | 634 } while (!kIsDebug && !converged); |
| 660 if (FLAGS_verbose) { SkDebugf("\n"); } | 635 if (FLAGS_verbose) { SkDebugf("\n"); } |
| 661 | 636 |
| 662 if (FLAGS_outDir.count() && SkBenchmark::kNonRendering_Backend != co
nfig.backend) { | 637 if (FLAGS_outDir.count() && SkBenchmark::kNonRendering_Backend != co
nfig.backend) { |
| 663 saveFile(bench->getName(), | 638 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
| 664 config.name, | 639 if (image.get()) { |
| 665 FLAGS_outDir[0], | 640 saveFile(bench->getName(), config.name, FLAGS_outDir[0], |
| 666 device->accessBitmap(false)); | 641 image); |
| 642 } |
| 667 } | 643 } |
| 668 | 644 |
| 669 if (kIsDebug) { | 645 if (kIsDebug) { |
| 670 // Let's not mislead ourselves by looking at Debug build bench t
imes! | 646 // Let's not mislead ourselves by looking at Debug build bench t
imes! |
| 671 continue; | 647 continue; |
| 672 } | 648 } |
| 673 | 649 |
| 674 // Normalize to ms per 1000 iterations. | 650 // Normalize to ms per 1000 iterations. |
| 675 const double normalize = 1000.0 / loopsPerIter; | 651 const double normalize = 1000.0 / loopsPerIter; |
| 676 const struct { char shortName; const char* longName; double ms; } ti
mes[] = { | 652 const struct { char shortName; const char* longName; double ms; } ti
mes[] = { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 693 gContextFactory.destroyContexts(); | 669 gContextFactory.destroyContexts(); |
| 694 #endif | 670 #endif |
| 695 return 0; | 671 return 0; |
| 696 } | 672 } |
| 697 | 673 |
| 698 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 674 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 699 int main(int argc, char * const argv[]) { | 675 int main(int argc, char * const argv[]) { |
| 700 return tool_main(argc, (char**) argv); | 676 return tool_main(argc, (char**) argv); |
| 701 } | 677 } |
| 702 #endif | 678 #endif |
| OLD | NEW |