DeferredCanvasBench.cpp revision 5990397d08640a80a7ccb3955b9952b356be3f86
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 "SkBenchmark.h" 8#include "SkDeferredCanvas.h" 9#include "SkDevice.h" 10#include "SkString.h" 11 12class DeferredCanvasBench : public SkBenchmark { 13public: 14 DeferredCanvasBench(void* param, const char name[]) : INHERITED(param) { 15 fName.printf("deferred_canvas_%s", name); 16 } 17 18 enum { 19 N = SkBENCHLOOP(25), // number of times to create the picture 20 CANVAS_WIDTH = 200, 21 CANVAS_HEIGHT = 200, 22 }; 23protected: 24 virtual const char* onGetName() { 25 return fName.c_str(); 26 } 27 28 virtual void onDraw(SkCanvas* canvas) { 29 SkDevice *device = canvas->getDevice()->createCompatibleDevice( 30 SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false); 31 32 SkDeferredCanvas deferredCanvas(device); 33 34 device->unref(); 35 36 initDeferredCanvas(deferredCanvas); 37 38 for (int i = 0; i < N; i++) { 39 drawInDeferredCanvas(deferredCanvas); 40 } 41 42 finalizeDeferredCanvas(deferredCanvas); 43 deferredCanvas.flush(); 44 } 45 46 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) = 0; 47 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) = 0; 48 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) = 0; 49 50 SkString fName; 51 52private: 53 typedef SkBenchmark INHERITED; 54}; 55 56class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient { 57public: 58 SimpleNotificationClient() : fDummy(false) {} 59 60 //bogus virtual implementations that just do something small 61 virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;} 62 virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;} 63 virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;} 64private: 65 bool fDummy; 66 67 typedef SkDeferredCanvas::NotificationClient INHERITED; 68}; 69 70// Test that records very simple draw operations. 71// This benchmark aims to capture performance fluctuations in the recording 72// overhead of SkDeferredCanvas 73class DeferredRecordBench : public DeferredCanvasBench { 74public: 75 DeferredRecordBench(void* param) 76 : INHERITED(param, "record") { 77 } 78 79 enum { 80 M = SkBENCHLOOP(700), // number of individual draws in each loop 81 }; 82protected: 83 84 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 85 canvas.setNotificationClient(&fNotificationClient); 86 } 87 88 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 89 SkRect rect; 90 rect.setXYWH(0, 0, 10, 10); 91 SkPaint paint; 92 for (int i = 0; i < M; i++) { 93 canvas.save(SkCanvas::kMatrixClip_SaveFlag); 94 canvas.translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT)); 95 canvas.drawRect(rect, paint); 96 canvas.restore(); 97 } 98 } 99 100 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 101 canvas.clear(0x0); 102 canvas.setNotificationClient(NULL); 103 } 104 105private: 106 typedef DeferredCanvasBench INHERITED; 107 SimpleNotificationClient fNotificationClient; 108}; 109 110 111/////////////////////////////////////////////////////////////////////////////// 112 113static SkBenchmark* Fact0(void* p) { return new DeferredRecordBench(p); } 114 115static BenchRegistry gReg0(Fact0); 116