summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/bench/DeferredCanvasBench.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/bench/DeferredCanvasBench.cpp')
-rw-r--r--chromium/third_party/skia/bench/DeferredCanvasBench.cpp106
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(); )