Add microbench for shadows
authorJim Van Verth <jvanverth@google.com>
Thu, 18 May 2017 18:31:19 +0000 (14:31 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 18 May 2017 18:57:24 +0000 (18:57 +0000)
Based on Android's shadowgrid2.

Change-Id: I33209b6b84fc63a762405c4988afbdbffcc170d6
Reviewed-on: https://skia-review.googlesource.com/17360
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
bench/ShadowBench.cpp [new file with mode: 0755]
gn/bench.gni

diff --git a/bench/ShadowBench.cpp b/bench/ShadowBench.cpp
new file mode 100755 (executable)
index 0000000..82c4f95
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2017 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 "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkDrawShadowRec.h"
+#include "SkShadowUtils.h"
+
+class ShadowBench : public Benchmark {
+// Draws a set of shadowed rrects filling the canvas, in various modes:
+// * opaque or transparent
+// * use analytic fast path or geometric tessellation
+public:
+    ShadowBench(bool transparent, bool forceGeometric)
+        : fTransparent(transparent)
+        , fForceGeometric(forceGeometric) {
+        computeName("shadows");
+    }
+
+    bool isVisual() override { return true; }
+
+protected:
+    enum {
+        kWidth = 640,
+        kHeight = 480,
+        kRRSize = 50,
+        kRRRadius = 6,
+        kRRSpace = 8,
+        kRRStep = kRRSize + kRRSpace,
+        kElevation = 16,
+        kNumRRects = ((kWidth - kRRSpace) / kRRStep)*((kHeight - kRRSpace) / kRRStep)
+    };
+
+    void computeName(const char root[]) {
+        static const char kTransChars[2] = {
+            'o', 't'
+        };
+        static const char kGeomChars[2] = {
+            'a', 'g'
+        };
+
+        fBaseName.printf("%s_%c_%c", root, kTransChars[fTransparent], kGeomChars[fForceGeometric]);
+    }
+
+    void genRRects() {
+        int i = 0;
+        for (int x = kRRSpace; x < kWidth - kRRStep; x += kRRStep) {
+            for (int y = kRRSpace; y < kHeight - kRRStep; y += kRRStep) {
+                SkRect rect = SkRect::MakeXYWH(x, y, kRRSize, kRRSize);
+                fRRects[i].addRRect(SkRRect::MakeRectXY(rect, kRRRadius, kRRRadius));
+                ++i;
+            }
+        }
+        SkASSERT(i == kNumRRects);
+    }
+
+    const char* onGetName() override { return fBaseName.c_str(); }
+
+    void onDelayedSetup() override {
+        fRec.fZPlaneParams = SkPoint3::Make(0, 0, kElevation);
+        fRec.fLightPos = SkPoint3::Make(270, 0, 600);
+        fRec.fLightRadius = 800;
+        fRec.fAmbientAlpha = 0.1f;
+        fRec.fSpotAlpha = 0.25f;
+        fRec.fColor = SK_ColorBLACK;
+        fRec.fFlags = 0;
+        if (fTransparent) {
+            fRec.fFlags |= SkShadowFlags::kTransparentOccluder_ShadowFlag;
+        }
+        if (fForceGeometric) {
+            fRec.fFlags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
+        }
+
+        this->genRRects();
+    }
+
+    void onDraw(int loops, SkCanvas* canvas) override {
+        SkPaint paint;
+        paint.setColor(SK_ColorWHITE);
+        this->setupPaint(&paint);
+
+        for (int i = 0; i < loops; ++i) {
+            // use the private canvas call so we don't include the time to stuff data in the Rec
+            canvas->private_draw_shadow_rec(fRRects[i % kNumRRects], fRec);
+        }
+    }
+
+private:
+    SkString fBaseName;
+
+    SkPath  fRRects[kNumRRects];
+    SkDrawShadowRec fRec;
+    int    fTransparent;
+    int    fForceGeometric;
+
+    typedef Benchmark INHERITED;
+};
+
+DEF_BENCH(return new ShadowBench(false, false);)
+DEF_BENCH(return new ShadowBench(false, true);)
+DEF_BENCH(return new ShadowBench(true, false);)
+DEF_BENCH(return new ShadowBench(true, true);)
+
index 4364f6575d1118f72032957ca517058a9f991128..3276f8c5dc8bdf892373fb2c2ed22b24268bf272 100644 (file)
@@ -103,6 +103,7 @@ bench_sources = [
   "$_bench/RTreeBench.cpp",
   "$_bench/ScalarBench.cpp",
   "$_bench/ShaderMaskBench.cpp",
+  "$_bench/ShadowBench.cpp",
   "$_bench/ShapesBench.cpp",
   "$_bench/Sk4fBench.cpp",
   "$_bench/SkBlend_optsBench.cpp",