From b42b785d1cbc98bd34aceae338060831b974f9c5 Mon Sep 17 00:00:00 2001 From: reed Date: Mon, 11 Jul 2016 13:17:35 -0700 Subject: try to speed-up maprect + round2i + contains We call roundOut in a few places. If we can get SkNx::Ceil we could efficiently implement that as well. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2133413002 CQ_INCLUDE_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot Review-Url: https://codereview.chromium.org/2133413002 --- bench/RectBench.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'bench/RectBench.cpp') diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp index 46a515de29..0f757a2b5f 100644 --- a/bench/RectBench.cpp +++ b/bench/RectBench.cpp @@ -302,3 +302,93 @@ DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode, DEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode, BlitMaskBench::KMaskShader, "maskshader");) + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +typedef int (*RectMathProc)(const SkMatrix&, const SkRect[], const SkIRect[], int count); + +class RectMathBench : public Benchmark { + SkString fName; + SkRandom fRand; + SkString fSuffix; + RectMathProc fProc; + +public: + enum { + N = 300, + OUTER = 10000, + }; + SkRect fRects[N]; + SkIRect fIRects[N]; + volatile int fCounter; + + RectMathBench(RectMathProc proc, const char* suffix) { + fProc = proc; + fSuffix.set(suffix); + SkRandom rand; + for (int i = 0; i < N; ++i) { + fRects[i].setXYWH(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100, + rand.nextUScalar1() * 100, rand.nextUScalar1() * 100); + fIRects[i].setXYWH(i, i, 10, 10); + } + } + + bool isVisual() override { return false; } + +protected: + const char* onGetName() override { + fName.printf("rect_math_%s", fSuffix.c_str()); + return fName.c_str(); + } + + void onDraw(int loops, SkCanvas* canvas) override { + SkMatrix mat; + for (int j = 0; j < OUTER; ++j) { + mat.setScaleTranslate(fRand.nextUScalar1(), fRand.nextUScalar1(), + fRand.nextUScalar1(), fRand.nextUScalar1()); + fCounter += fProc(mat, fRects, fIRects, N); + } + } + +private: + typedef Benchmark INHERITED; +}; + +static int rectmath0(const SkMatrix& mat, const SkRect rr[], const SkIRect ir[], int count) { + int counter = 0; + for (int i = 0; i < count; ++i) { + SkRect dst; + mat.mapRectScaleTranslate(&dst, rr[i]); + counter += dst.round().contains(ir[i]); + } + return counter; +} + +static int rectmath1(const SkMatrix& mat, const SkRect rr[], const SkIRect ir[], int count) { + int counter = 0; + for (int i = 0; i < count; ++i) { + SkRect dst; + mat.mapRectScaleTranslate(&dst, rr[i]); + counter += dst.round2i().contains(ir[i]); + } + return counter; +} + +#if 0 +static bool contains(SkIRect outer, SkIRect inner) { + Sk4i le(outer.fLeft, outer.fTop, inner.fRight, inner.fBottom); + Sk4i ge(inner.fLeft, inner.fTop, outer.fRight, outer.fBottom); + return (le <= ge).allTrue(); +} + +static int rectmath3(const SkMatrix& mat, const SkRect rr[], const SkIRect ir[], int count) { + int counter = 0; + for (int i = 0; i < count; ++i) { + counter += contains(mat.mapRectScaleTranslate(rr[i]).round2i(), ir[i]); + } + return counter; +} +#endif + +DEF_BENCH(return new RectMathBench(rectmath0, "0");) +DEF_BENCH(return new RectMathBench(rectmath1, "1");) -- cgit v1.2.3