Index: bench/PatchBench.cpp |
diff --git a/bench/PatchBench.cpp b/bench/PatchBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2e99e4efbf4fb1ea54b26a3ab21fb822629d1dd3 |
--- /dev/null |
+++ b/bench/PatchBench.cpp |
@@ -0,0 +1,325 @@ |
+/* |
+ * Copyright 2014 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 "SkBitmap.h" |
+#include "SkCanvas.h" |
+#include "SkColorPriv.h" |
+#include "SkGradientShader.h" |
+#include "SkPaint.h" |
+#include "SkPatchUtils.h" |
+#include "SkRandom.h" |
+#include "SkShader.h" |
+#include "SkString.h" |
+#include "SkTArray.h" |
+ |
+class PatchBench : public Benchmark { |
+ |
+public: |
+ |
+ enum VertexMode { |
+ kNone_VertexMode, |
+ kColors_VertexMode, |
+ kTexCoords_VertexMode, |
+ kBoth_VertexMode |
+ }; |
+ |
+ PatchBench(SkPoint scale, VertexMode vertexMode) |
+ : fScale(scale) |
+ , fVertexMode(vertexMode) { } |
+ |
+ // to add name of specific class override this method |
+ virtual void appendName(SkString* name) { |
+ name->append("normal"); |
+ } |
+ |
+ // to make other type of patches override this method |
+ virtual void setCubics() { |
+ const SkPoint points[SkPatchUtils::kNumCtrlPts] = { |
+ //top points |
+ {100,100},{150,50},{250,150}, {300,100}, |
+ //right points |
+ {350, 150},{250,200}, |
+ //bottom points |
+ {300,300},{250,250},{150,350},{100,300}, |
+ //left points |
+ {50,250},{150,50} |
+ }; |
+ memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); |
+ } |
+ |
+ virtual void setColors() { |
+ const SkColor colors[SkPatchUtils::kNumCorners] = { |
+ SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorCYAN |
+ }; |
+ memcpy(fColors, colors, SkPatchUtils::kNumCorners * sizeof(SkColor)); |
+ } |
+ |
+ virtual void setTexCoords() { |
+ const SkPoint texCoords[SkPatchUtils::kNumCorners] = { |
+ {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f,1.0f}, {0.0f, 1.0f} |
+ }; |
+ memcpy(fTexCoords, texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint)); |
+ } |
+ |
+ // override this method to change the shader |
+ virtual SkShader* getShader() { |
+ const SkColor colors[] = { |
+ SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, |
+ SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW, |
+ }; |
+ const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } }; |
+ |
+ return SkGradientShader::CreateLinear(pts, colors, NULL, |
+ SK_ARRAY_COUNT(colors), |
+ SkShader::kMirror_TileMode); |
+ } |
+ |
+protected: |
+ virtual const char* onGetName() SK_OVERRIDE { |
+ SkString vertexMode; |
+ switch (fVertexMode) { |
+ case kNone_VertexMode: |
+ vertexMode.set("meshlines"); |
+ break; |
+ case kColors_VertexMode: |
+ vertexMode.set("colors"); |
+ break; |
+ case kTexCoords_VertexMode: |
+ vertexMode.set("texs"); |
+ break; |
+ case kBoth_VertexMode: |
+ vertexMode.set("colors&texs"); |
+ break; |
+ default: |
+ break; |
+ } |
+ SkString type; |
+ this->appendName(&type); |
+ fName.printf("patch_%s_%s_[%f,%f]", type.c_str(), vertexMode.c_str(), |
+ fScale.x(), fScale.y()); |
+ return fName.c_str(); |
+ } |
+ |
+ virtual void preDraw() { |
+ |
+ } |
+ |
+ virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
+ |
+ this->setCubics(); |
+ this->setColors(); |
+ this->setTexCoords(); |
+ this->setupPaint(&fPaint); |
+ switch (fVertexMode) { |
+ case kTexCoords_VertexMode: |
+ case kBoth_VertexMode: |
+ fPaint.setShader(getShader()); |
+ break; |
+ default: |
+ fPaint.setShader(NULL); |
+ break; |
+ } |
+ |
+ canvas->scale(fScale.x(), fScale.y()); |
+ for (int i = 0; i < loops; i++) { |
+ switch (fVertexMode) { |
+ case kNone_VertexMode: |
+ canvas->drawPatch(fCubics, NULL, NULL, NULL, fPaint); |
+ break; |
+ case kColors_VertexMode: |
+ canvas->drawPatch(fCubics, fColors, NULL, NULL, fPaint); |
+ break; |
+ case kTexCoords_VertexMode: |
+ canvas->drawPatch(fCubics, NULL, fTexCoords, NULL, fPaint); |
+ break; |
+ case kBoth_VertexMode: |
+ canvas->drawPatch(fCubics, fColors, fTexCoords, NULL, fPaint); |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ } |
+ |
+ SkPaint fPaint; |
+ SkString fName; |
+ SkVector fScale; |
+ SkPoint fCubics[12]; |
+ SkPoint fTexCoords[4]; |
+ SkColor fColors[4]; |
+ VertexMode fVertexMode; |
+ |
+ typedef Benchmark INHERITED; |
+}; |
+ |
+class SquarePatchBench : public PatchBench { |
+public: |
+ SquarePatchBench(SkPoint scale, VertexMode vertexMode) |
+ : INHERITED(scale, vertexMode) { } |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("square"); |
+ } |
+ |
+ virtual void setCubics() { |
+ const SkPoint points[SkPatchUtils::kNumCtrlPts] = { |
+ //top points |
+ {100,100},{150,100},{250,100}, {300,100}, |
+ //right points |
+ {300, 150},{300,250}, |
+ //bottom points |
+ {300,300},{250,300},{150,300},{100,300}, |
+ //left points |
+ {100,250},{100,150} |
+ }; |
+ memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); |
+ } |
+private: |
+ typedef PatchBench INHERITED; |
+}; |
+ |
+class LODDiffPatchBench : public PatchBench { |
+public: |
+ LODDiffPatchBench(SkPoint scale, VertexMode vertexMode) |
+ : INHERITED(scale, vertexMode) { } |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("LOD_Diff"); |
+ } |
+ |
+ virtual void setCubics() { |
+ const SkPoint points[SkPatchUtils::kNumCtrlPts] = { |
+ //top points |
+ {100,175},{150,100},{250,100}, {300,0}, |
+ //right points |
+ {300, 150},{300,250}, |
+ //bottom points |
+ {300,400},{250,300},{150,300},{100,225}, |
+ //left points |
+ {100,215},{100,185} |
+ }; |
+ memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); |
+ } |
+private: |
+ typedef PatchBench INHERITED; |
+}; |
+ |
+class LoopPatchBench : public PatchBench { |
+public: |
+ LoopPatchBench(SkPoint scale, VertexMode vertexMode) |
+ : INHERITED(scale, vertexMode) { } |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("loop"); |
+ } |
+ |
+ virtual void setCubics() { |
+ const SkPoint points[SkPatchUtils::kNumCtrlPts] = { |
+ //top points |
+ {100,100},{300,200},{100,200}, {300,100}, |
+ //right points |
+ {380, 400},{380,0}, |
+ //bottom points |
+ {300,300},{250,250},{30,200},{100,300}, |
+ //left points |
+ {140,325},{150,150} |
+ }; |
+ memcpy(fCubics, points, SkPatchUtils::kNumCtrlPts * sizeof(SkPoint)); |
+ } |
+private: |
+ typedef PatchBench INHERITED; |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(0.1f, 0.1f), PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(1.f, 1.0f), PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(1.0f, 1.0f), PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new PatchBench(SkVector::Make(3.0f, 3.0f), PatchBench::kBoth_VertexMode); ) |
+ |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.f, 1.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new SquarePatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kBoth_VertexMode); ) |
+ |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.f, 1.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LODDiffPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kBoth_VertexMode); ) |
+ |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(0.1f, 0.1f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.f, 1.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(1.0f, 1.0f), |
+ PatchBench::kBoth_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kNone_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kColors_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kTexCoords_VertexMode); ) |
+DEF_BENCH( return new LoopPatchBench(SkVector::Make(3.0f, 3.0f), |
+ PatchBench::kBoth_VertexMode); ) |