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