Add Xfermode bench. Also clear before rendering in bench (rather than after).
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 1 Apr 2013 12:51:34 +0000 (12:51 +0000)
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 1 Apr 2013 12:51:34 +0000 (12:51 +0000)
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

bench/XfermodeBench.cpp [new file with mode: 0644]
bench/benchmain.cpp
gyp/bench.gypi
include/core/SkXfermode.h
src/core/SkXfermode.cpp

diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp
new file mode 100644 (file)
index 0000000..8045a26
--- /dev/null
@@ -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);
index 4bc56c4..9f357c6 100644 (file)
@@ -822,6 +822,7 @@ int tool_main(int argc, char** argv) {
                         SkASSERT(0);
                 }
                 device->unref();
+                canvas->clear(SK_ColorWHITE);
             }
             SkAutoUnref canvasUnref(canvas);
 
@@ -928,7 +929,6 @@ int tool_main(int argc, char** argv) {
             if (outDir.size() > 0 && kNonRendering_Backend != backend) {
                 saveFile(bench->getName(), configName, outDir.c_str(),
                          device->accessBitmap(false));
-                canvas->clear(SK_ColorWHITE);
             }
         }
         if (loggedBenchStart) {
index a18ace8..f5aa1e3 100644 (file)
@@ -50,6 +50,7 @@
     '../bench/TileBench.cpp',
     '../bench/VertBench.cpp',
     '../bench/WriterBench.cpp',
+    '../bench/XfermodeBench.cpp',
 
     '../bench/SkBenchLogger.h',
     '../bench/SkBenchLogger.cpp',
index 92e240b..38273ac 100644 (file)
@@ -128,6 +128,11 @@ public:
 
         kLastMode = kLuminosity_Mode
     };
+    
+    /**
+     * Gets the name of the Mode as a string.
+     */
+    static const char* ModeName(Mode);
 
     /**
      *  If the xfermode is one of the modes in the Mode enum, then asMode()
index 6f22aa4..d1a0f7a 100644 (file)
@@ -1107,19 +1107,25 @@ private:
     typedef SkProcXfermode INHERITED;
 };
 
-#ifdef SK_DEVELOPER
-void SkProcCoeffXfermode::toString(SkString* str) const {
-    str->append("SkProcCoeffXfermode: ");
-
-    const char *gModeStrings[kLastMode+1] = {
+const char* SkXfermode::ModeName(Mode mode) {
+    SkASSERT((unsigned) mode <= (unsigned)kLastMode);
+    const char* gModeStrings[] = {
         "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn",
         "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus",
         "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge",
-        "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion"
+        "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion",
+        "Multiply", "Hue", "Saturation", "Color",  "Luminosity"
     };
+    return gModeStrings[mode];
+    SK_COMPILE_ASSERT(SK_ARRAY_COUNT(gModeStrings) == kLastMode + 1, mode_count);
+}
+
+#ifdef SK_DEVELOPER
+void SkProcCoeffXfermode::toString(SkString* str) const {
+    str->append("SkProcCoeffXfermode: ");
 
     str->append("mode: ");
-    str->append(gModeStrings[fMode]);
+    str->append(ModeName(fMode));
 
     static const char* gCoeffStrings[kCoeffCount] = {
         "Zero", "One", "SC", "ISC", "DC", "IDC", "SA", "ISA", "DA", "IDA"