Index: bench/GeometryBench.cpp |
diff --git a/bench/GeometryBench.cpp b/bench/GeometryBench.cpp |
index a5c4643f9e32b384a30eab0471e6eb92fb06de6c..65398fa34a0faaa974fae2f6069ce9a1f4629c62 100644 |
--- a/bench/GeometryBench.cpp |
+++ b/bench/GeometryBench.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "Benchmark.h" |
+#include "Sk4x.h" |
#include "SkGeometry.h" |
#include "SkRandom.h" |
#include "SkRect.h" |
@@ -44,6 +45,9 @@ public: |
GeoRectBench(const char suffix[]) : GeometryBench(suffix) {} |
protected: |
+ // void* vptr; |
+ size_t align_fRects_to_16Bytes[sizeof(void*) == 8 ? 1 : 3]; |
+ |
SkRect fRects[2048]; |
virtual void onPreDraw() { |
@@ -97,7 +101,7 @@ protected: |
class GeoRectBench_Intersects : public GeoRectBench { |
public: |
GeoRectBench_Intersects() : GeoRectBench("rect_Intersects") {} |
- |
+ |
protected: |
virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
for (int outer = 0; outer < loops; ++outer) { |
@@ -113,7 +117,7 @@ protected: |
class GeoRectBench_sort : public GeoRectBench { |
public: |
GeoRectBench_sort() : GeoRectBench("rect_sort") {} |
- |
+ |
protected: |
virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
for (int outer = 0; outer < loops; ++outer) { |
@@ -129,3 +133,59 @@ DEF_BENCH( return new GeoRectBench_intersect_rect; ) |
DEF_BENCH( return new GeoRectBench_Intersects; ) |
DEF_BENCH( return new GeoRectBench_sort; ) |
+ |
+class GeoRectBench_sort_4f : public GeoRectBench { |
+public: |
+ GeoRectBench_sort_4f() : GeoRectBench("rect_sort_4f") { } |
+ |
+protected: |
+ static SkRect Sort(const SkRect& rect) { |
+ // To sort: |
+ // left, right = minmax(left, right) |
+ // top, bottom = minmax(top, bottom) |
+ Sk4f ltrb(&rect.fLeft), |
+ rblt = ltrb.zwxy(), |
+ ltlt = Sk4f::Min(ltrb, rblt), // Holds (2 copies of) new left and top. |
+ rbrb = Sk4f::Max(ltrb, rblt), // Holds (2 copies of) new right and bottom. |
+ sort = Sk4f::XYAB(ltlt, rbrb); |
+ |
+ SkRect sorted; |
+ sort.store(&sorted.fLeft); |
+ return sorted; |
+ } |
+ |
+ virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
+ for (int outer = 0; outer < loops; ++outer) { |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) { |
+ fRects[i] = Sort(fRects[i]); |
+ } |
+ } |
+ } |
+}; |
+DEF_BENCH( return new GeoRectBench_sort_4f; ) |
+ |
+class GeoRectBench_Intersects_4f : public GeoRectBench { |
+public: |
+ GeoRectBench_Intersects_4f() : GeoRectBench("rect_Intersects_4f") {} |
+ |
+protected: |
+ static bool Intersects(const SkRect& a, const SkRect& b) { |
+ Sk4f r1(&a.fLeft), |
+ r2(&b.fLeft), |
+ lt = Sk4f::XYAB(r1, r2), // a.L a.T b.L b.T < |
+ rb = Sk4f::ZWCD(r2, r1); // b.R b.B a.R a.B ? |
+ return lt.lessThan(rb).allTrue(); |
+ } |
+ |
+ virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
+ for (int outer = 0; outer < loops; ++outer) { |
+ int count = 0; |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) { |
+ count += Intersects(fRects[0], fRects[i]); |
+ } |
+ this->virtualCallToFoilOptimizers(count); |
+ } |
+ } |
+}; |
+DEF_BENCH( return new GeoRectBench_Intersects_4f; ) |
+ |