1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "Benchmark.h" 8 #include "SkDeferredCanvas.h" 9 #include "SkDevice.h" 10 #include "SkString.h" 11 12 class DeferredCanvasBench : public Benchmark { 13 public: 14 DeferredCanvasBench(const char name[]) { 15 fName.printf("deferred_canvas_%s", name); 16 } 17 18 enum { 19 CANVAS_WIDTH = 200, 20 CANVAS_HEIGHT = 200, 21 }; 22 protected: 23 virtual const char* onGetName() { 24 return fName.c_str(); 25 } 26 27 virtual void onDraw(const int loops, SkCanvas* canvas) { 28 #if 0 // what specifically are we interested in timing here? 29 SkBaseDevice *device = canvas->getDevice()->createCompatibleDevice( 30 SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false); 31 32 SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(device)); 33 device->unref(); 34 35 initDeferredCanvas(deferredCanvas); 36 drawInDeferredCanvas(loops, deferredCanvas); 37 finalizeDeferredCanvas(deferredCanvas); 38 deferredCanvas->flush(); 39 #endif 40 } 41 42 virtual void initDeferredCanvas(SkDeferredCanvas* canvas) = 0; 43 virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) = 0; 44 virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) = 0; 45 46 SkString fName; 47 48 private: 49 typedef Benchmark INHERITED; 50 }; 51 52 class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient { 53 public: 54 SimpleNotificationClient() : fDummy(false) {} 55 56 //bogus virtual implementations that just do something small 57 virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;} 58 virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;} 59 virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;} 60 private: 61 bool fDummy; 62 63 typedef SkDeferredCanvas::NotificationClient INHERITED; 64 }; 65 66 // Test that records very simple draw operations. 67 // This benchmark aims to capture performance fluctuations in the recording 68 // overhead of SkDeferredCanvas 69 class DeferredRecordBench : public DeferredCanvasBench { 70 public: 71 DeferredRecordBench() 72 : INHERITED("record") { 73 } 74 75 protected: 76 77 virtual void initDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE { 78 canvas->setNotificationClient(&fNotificationClient); 79 } 80 81 virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) SK_OVERRIDE { 82 SkRect rect; 83 rect.setXYWH(0, 0, 10, 10); 84 SkPaint paint; 85 for (int i = 0; i < loops; i++) { 86 canvas->save(); 87 canvas->translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT)); 88 canvas->drawRect(rect, paint); 89 canvas->restore(); 90 } 91 } 92 93 virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE { 94 canvas->clear(0x0); 95 canvas->setNotificationClient(NULL); 96 } 97 98 private: 99 typedef DeferredCanvasBench INHERITED; 100 SimpleNotificationClient fNotificationClient; 101 }; 102 103 104 /////////////////////////////////////////////////////////////////////////////// 105 106 DEF_BENCH( return new DeferredRecordBench(); ) 107