aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/XfermodeBench.cpp
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-01 12:51:34 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-01 12:51:34 +0000
commitd7aaf6034e519ea9b70649c1d344f2f24de90ccb (patch)
treed3ee4c9a59476d4fc95861b107de61369a591101 /bench/XfermodeBench.cpp
parentbb5c46591c50d05418467cd1c4e927ceb85c2ba9 (diff)
Add Xfermode bench. Also clear before rendering in bench (rather than after).
Author: bsalomon@google.com Reviewed By: robertphillips@google.com Review URL: https://chromiumcodereview.appspot.com/13334011 git-svn-id: http://skia.googlecode.com/svn/trunk@8454 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'bench/XfermodeBench.cpp')
-rw-r--r--bench/XfermodeBench.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp
new file mode 100644
index 0000000000..8045a26ed9
--- /dev/null
+++ b/bench/XfermodeBench.cpp
@@ -0,0 +1,70 @@
+
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkBenchmark.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+#include "SkString.h"
+#include "SkXfermode.h"
+
+// Benchmark that draws non-AA rects with an SkXfermode::Mode
+class XfermodeBench : public SkBenchmark {
+public:
+ XfermodeBench(void* param, SkXfermode::Mode mode) : SkBenchmark(param) {
+ fXfermode.reset(SkXfermode::Create(mode));
+ SkASSERT(NULL != fXfermode.get() || SkXfermode::kSrcOver_Mode == mode);
+ fName.printf("Xfermode_%s", SkXfermode::ModeName(mode));
+ }
+
+protected:
+ virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ SkISize size = canvas->getDeviceSize();
+ SkMWCRandom random;
+ for (int i = 0; i < kNumRects; ++i) {
+ SkPaint paint;
+ paint.setXfermode(fXfermode.get());
+ paint.setColor(random.nextU());
+ SkScalar w = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize));
+ SkScalar h = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize));
+ SkRect rect = SkRect::MakeXYWH(
+ random.nextUScalar1() * (size.fWidth - w),
+ random.nextUScalar1() * (size.fHeight - h),
+ w,
+ h
+ );
+ canvas->drawRect(rect, paint);
+ }
+ }
+
+private:
+ enum {
+ kNumRects = SkBENCHLOOP(1000),
+ kMinSize = 10,
+ kMaxSize = 400,
+ };
+ SkAutoTUnref<SkXfermode> fXfermode;
+ SkString fName;
+
+ typedef SkBenchmark INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+
+// These modes were chosen because they are expected to be successively harder for the GPU.
+// kSrc can disable blending, kSrcOver cannot, kDarken requires reading the dst pixel in the shader.
+static SkBenchmark* Fact0(void* p) { return new XfermodeBench(p, SkXfermode::kSrc_Mode); }
+static SkBenchmark* Fact1(void* p) { return new XfermodeBench(p, SkXfermode::kSrcOver_Mode); }
+static SkBenchmark* Fact2(void* p) { return new XfermodeBench(p, SkXfermode::kDarken_Mode); }
+
+static BenchRegistry gReg0(Fact0);
+static BenchRegistry gReg1(Fact1);
+static BenchRegistry gReg2(Fact2);