1 2 /* 3 * Copyright 2013 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "Benchmark.h" 10 #include "SkDeferredCanvas.h" 11 #include "SkDevice.h" 12 #include "SkImage.h" 13 #include "SkSurface.h" 14 #if SK_SUPPORT_GPU 15 #include "GrRenderTarget.h" 16 #endif 17 18 class DeferredSurfaceCopyBench : public Benchmark { 19 enum { 20 kSurfaceWidth = 1000, 21 kSurfaceHeight = 1000, 22 }; 23 public: 24 DeferredSurfaceCopyBench(bool discardableContents) { 25 fDiscardableContents = discardableContents; 26 } 27 28 protected: 29 virtual const char* onGetName() SK_OVERRIDE { 30 return fDiscardableContents ? "DeferredSurfaceCopy_discardable" : 31 "DeferredSurfaceCopy_nonDiscardable"; 32 } 33 34 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 35 // The canvas is not actually used for this test except to provide 36 // configuration information: gpu, multisampling, size, etc? 37 SkImageInfo info; 38 info.fWidth = kSurfaceWidth; 39 info.fHeight = kSurfaceHeight; 40 info.fColorType = kN32_SkColorType; 41 info.fAlphaType = kPremul_SkAlphaType; 42 const SkRect fullCanvasRect = SkRect::MakeWH( 43 SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); 44 SkSurface* surface; 45 #if SK_SUPPORT_GPU 46 GrRenderTarget* rt = reinterpret_cast<GrRenderTarget*>( 47 canvas->getDevice()->accessRenderTarget()); 48 if (NULL != rt) { 49 surface = SkSurface::NewRenderTarget(rt->getContext(), info, rt->numSamples()); 50 } else 51 #endif 52 { 53 surface = SkSurface::NewRaster(info); 54 } 55 SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface)); 56 surface->unref(); 57 58 for (int iteration = 0; iteration < loops; iteration++) { 59 drawingCanvas->clear(0); 60 SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot()); 61 SkPaint paint; 62 if (!fDiscardableContents) { 63 // If paint is not opaque, prior canvas contents are 64 // not discardable because they are needed for compositing. 65 paint.setAlpha(127); 66 } 67 drawingCanvas->drawRect(fullCanvasRect, paint); 68 // Trigger copy on write, which should be faster in the discardable case. 69 drawingCanvas->flush(); 70 } 71 } 72 73 private: 74 bool fDiscardableContents; 75 76 typedef Benchmark INHERITED; 77 }; 78 79 ////////////////////////////////////////////////////////////////////////////// 80 81 DEF_BENCH( return new DeferredSurfaceCopyBench(false); ) 82 DEF_BENCH( return new DeferredSurfaceCopyBench(true); ) 83