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