DeferredCanvasBench.cpp revision 52805485581cff7e13134aa1465a2950f7bed007
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 SkDeferredCanvas deferredCanvas(canvas->getDevice()->createCompatibleDevice( 30 SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false)); 31 32 initDeferredCanvas(deferredCanvas); 33 34 for (int i = 0; i < N; i++) { 35 drawInDeferredCanvas(deferredCanvas); 36 } 37 38 finalizeDeferredCanvas(deferredCanvas); 39 deferredCanvas.flush(); 40 } 41 42 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) = 0; 43 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) = 0; 44 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) = 0; 45 46 SkString fName; 47 48private: 49 typedef SkBenchmark INHERITED; 50}; 51 52class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient { 53public: 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;} 60private: 61 bool fDummy; 62}; 63 64// Test that records very simple draw operations. 65// This benchmark aims to capture performance fluctuations in the recording 66// overhead of SkDeferredCanvas 67class DeferredRecordBench : public DeferredCanvasBench { 68public: 69 DeferredRecordBench(void* param) 70 : INHERITED(param, "record") { 71 } 72 73 enum { 74 M = SkBENCHLOOP(700), // number of individual draws in each loop 75 }; 76protected: 77 78 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 79 canvas.setNotificationClient(&fNotificationClient); 80 } 81 82 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 83 SkRect rect; 84 rect.setXYWH(0, 0, 10, 10); 85 SkPaint paint; 86 for (int i = 0; i < M; i++) { 87 canvas.save(SkCanvas::kMatrixClip_SaveFlag); 88 canvas.translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT)); 89 canvas.drawRect(rect, paint); 90 canvas.restore(); 91 } 92 } 93 94 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE { 95 canvas.clear(0x0); 96 canvas.setNotificationClient(NULL); 97 } 98 99private: 100 typedef DeferredCanvasBench INHERITED; 101 SimpleNotificationClient fNotificationClient; 102}; 103 104 105/////////////////////////////////////////////////////////////////////////////// 106 107static SkBenchmark* Fact0(void* p) { return new DeferredRecordBench(p); } 108 109static BenchRegistry gReg0(Fact0); 110