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 = SkImageInfo::MakeN32Premul(kSurfaceWidth, kSurfaceHeight); 38 const SkRect fullCanvasRect = SkRect::MakeWH( 39 SkIntToScalar(kSurfaceWidth), SkIntToScalar(kSurfaceHeight)); 40 SkAutoTUnref<SkSurface> surface(canvas->newSurface(info)); 41 SkAutoTUnref<SkDeferredCanvas> drawingCanvas(SkDeferredCanvas::Create(surface)); 42 43 for (int iteration = 0; iteration < loops; iteration++) { 44 drawingCanvas->clear(0); 45 SkAutoTUnref<SkImage> image(drawingCanvas->newImageSnapshot()); 46 SkPaint paint; 47 if (!fDiscardableContents) { 48 // If paint is not opaque, prior canvas contents are 49 // not discardable because they are needed for compositing. 50 paint.setAlpha(127); 51 } 52 drawingCanvas->drawRect(fullCanvasRect, paint); 53 // Trigger copy on write, which should be faster in the discardable case. 54 drawingCanvas->flush(); 55 } 56 } 57 58 private: 59 bool fDiscardableContents; 60 61 typedef Benchmark INHERITED; 62 }; 63 64 ////////////////////////////////////////////////////////////////////////////// 65 66 DEF_BENCH( return new DeferredSurfaceCopyBench(false); ) 67 DEF_BENCH( return new DeferredSurfaceCopyBench(true); ) 68