diff options
Diffstat (limited to 'chromium/third_party/skia/bench/DeferredCanvasBench.cpp')
-rw-r--r-- | chromium/third_party/skia/bench/DeferredCanvasBench.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/chromium/third_party/skia/bench/DeferredCanvasBench.cpp b/chromium/third_party/skia/bench/DeferredCanvasBench.cpp new file mode 100644 index 00000000000..667895c22f7 --- /dev/null +++ b/chromium/third_party/skia/bench/DeferredCanvasBench.cpp @@ -0,0 +1,106 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "Benchmark.h" +#include "SkDeferredCanvas.h" +#include "SkDevice.h" +#include "SkString.h" + +class DeferredCanvasBench : public Benchmark { +public: + DeferredCanvasBench(const char name[]) { + fName.printf("deferred_canvas_%s", name); + } + + enum { + CANVAS_WIDTH = 200, + CANVAS_HEIGHT = 200, + }; +protected: + virtual const char* onGetName() { + return fName.c_str(); + } + + virtual void onDraw(const int loops, SkCanvas* canvas) { +#if 0 // what specifically are we interested in timing here? + SkBaseDevice *device = canvas->getDevice()->createCompatibleDevice( + SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false); + + SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(device)); + device->unref(); + + initDeferredCanvas(deferredCanvas); + drawInDeferredCanvas(loops, deferredCanvas); + finalizeDeferredCanvas(deferredCanvas); + deferredCanvas->flush(); +#endif + } + + virtual void initDeferredCanvas(SkDeferredCanvas* canvas) = 0; + virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) = 0; + virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) = 0; + + SkString fName; + +private: + typedef Benchmark INHERITED; +}; + +class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient { +public: + SimpleNotificationClient() : fDummy(false) {} + + //bogus virtual implementations that just do something small + virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;} + virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;} + virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;} +private: + bool fDummy; + + typedef SkDeferredCanvas::NotificationClient INHERITED; +}; + +// Test that records very simple draw operations. +// This benchmark aims to capture performance fluctuations in the recording +// overhead of SkDeferredCanvas +class DeferredRecordBench : public DeferredCanvasBench { +public: + DeferredRecordBench() + : INHERITED("record") { + } + +protected: + + virtual void initDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE { + canvas->setNotificationClient(&fNotificationClient); + } + + virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) SK_OVERRIDE { + SkRect rect; + rect.setXYWH(0, 0, 10, 10); + SkPaint paint; + for (int i = 0; i < loops; i++) { + canvas->save(); + canvas->translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT)); + canvas->drawRect(rect, paint); + canvas->restore(); + } + } + + virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE { + canvas->clear(0x0); + canvas->setNotificationClient(NULL); + } + +private: + typedef DeferredCanvasBench INHERITED; + SimpleNotificationClient fNotificationClient; +}; + + +/////////////////////////////////////////////////////////////////////////////// + +DEF_BENCH( return new DeferredRecordBench(); ) |