123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- /*
- * 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 "bench/Benchmark.h"
- #include "include/core/SkRect.h"
- #include "include/utils/SkRandom.h"
- #include "src/core/SkGeometry.h"
- class GeometryBench : public Benchmark {
- public:
- GeometryBench(const char suffix[]) : fVolatileInt(0) {
- fName.printf("geo_%s", suffix);
- }
- const char* onGetName() override {
- return fName.c_str();
- }
- bool isSuitableFor(Backend backend) override {
- return kNonRendering_Backend == backend;
- }
- protected:
- volatile int fVolatileInt;
- /**
- * Subclasses can call this to try to defeat the optimizer (with some result of their
- * inner loop), since it will fool the compiler into assuming that "n" is actually
- * needed somewhere, and since this method is not const, the member fields cannot
- * be assumed to be const before and after the call.
- */
- virtual void virtualCallToFoilOptimizers(int n) { fVolatileInt += n; }
- private:
- SkString fName;
- };
- class GeoRectBench : public GeometryBench {
- public:
- GeoRectBench(const char suffix[]) : GeometryBench(suffix) {}
- protected:
- SkRect fRects[2048];
- virtual void onDelayedSetup() {
- const SkScalar min = -100;
- const SkScalar max = 100;
- SkRandom rand;
- for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
- SkScalar x = rand.nextRangeScalar(min, max);
- SkScalar y = rand.nextRangeScalar(min, max);
- SkScalar w = rand.nextRangeScalar(min, max);
- SkScalar h = rand.nextRangeScalar(min, max);
- fRects[i].setXYWH(x, y, w, h);
- }
- }
- };
- class GeoRectBench_intersect : public GeoRectBench {
- public:
- GeoRectBench_intersect() : GeoRectBench("rect_intersect") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- for (int outer = 0; outer < loops; ++outer) {
- int count = 0;
- for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
- SkRect r = fRects[0];
- count += r.intersect(fRects[i]);
- }
- this->virtualCallToFoilOptimizers(count);
- }
- }
- };
- class GeoRectBench_intersect_rect : public GeoRectBench {
- public:
- GeoRectBench_intersect_rect() : GeoRectBench("rect_intersect_rect") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- for (int outer = 0; outer < loops; ++outer) {
- int count = 0;
- SkRect r;
- for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
- count += r.intersect(fRects[0], fRects[i]);
- }
- this->virtualCallToFoilOptimizers(count);
- }
- }
- };
- class GeoRectBench_Intersects : public GeoRectBench {
- public:
- GeoRectBench_Intersects() : GeoRectBench("rect_Intersects") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- for (int outer = 0; outer < loops; ++outer) {
- int count = 0;
- for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
- count += SkRect::Intersects(fRects[0], fRects[i]);
- }
- this->virtualCallToFoilOptimizers(count);
- }
- }
- };
- class GeoRectBench_sort : public GeoRectBench {
- public:
- GeoRectBench_sort() : GeoRectBench("rect_sort") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- for (int outer = 0; outer < loops; ++outer) {
- for (size_t i = 0; i < SK_ARRAY_COUNT(fRects); ++i) {
- fRects[i].sort();
- }
- }
- }
- };
- DEF_BENCH( return new GeoRectBench_intersect; )
- DEF_BENCH( return new GeoRectBench_intersect_rect; )
- DEF_BENCH( return new GeoRectBench_Intersects; )
- DEF_BENCH( return new GeoRectBench_sort; )
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- class QuadBenchBase : public GeometryBench {
- protected:
- SkPoint fPts[4];
- public:
- QuadBenchBase(const char name[]) : GeometryBench(name) {
- SkRandom rand;
- for (int i = 0; i < 4; ++i) {
- fPts[i].set(rand.nextUScalar1(), rand.nextUScalar1());
- }
- }
- };
- class EvalQuadAt0 : public QuadBenchBase {
- public:
- EvalQuadAt0() : QuadBenchBase("evalquadat0") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint result;
- for (int outer = 0; outer < loops; ++outer) {
- SkEvalQuadAt(fPts, 0.5f, &result);
- SkEvalQuadAt(fPts, 0.5f, &result);
- SkEvalQuadAt(fPts, 0.5f, &result);
- SkEvalQuadAt(fPts, 0.5f, &result);
- }
- }
- };
- DEF_BENCH( return new EvalQuadAt0; )
- class EvalQuadAt1 : public QuadBenchBase {
- public:
- EvalQuadAt1() : QuadBenchBase("evalquadat1") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint result;
- for (int outer = 0; outer < loops; ++outer) {
- result = SkEvalQuadAt(fPts, 0.5f);
- result = SkEvalQuadAt(fPts, 0.5f);
- result = SkEvalQuadAt(fPts, 0.5f);
- result = SkEvalQuadAt(fPts, 0.5f);
- }
- }
- };
- DEF_BENCH( return new EvalQuadAt1; )
- ////////
- class EvalQuadTangentAt0 : public QuadBenchBase {
- public:
- EvalQuadTangentAt0() : QuadBenchBase("evalquadtangentat0") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint result;
- for (int outer = 0; outer < loops; ++outer) {
- SkEvalQuadAt(fPts, 0.5f, nullptr, &result);
- SkEvalQuadAt(fPts, 0.5f, nullptr, &result);
- SkEvalQuadAt(fPts, 0.5f, nullptr, &result);
- SkEvalQuadAt(fPts, 0.5f, nullptr, &result);
- }
- }
- };
- DEF_BENCH( return new EvalQuadTangentAt0; )
- class EvalQuadTangentAt1 : public QuadBenchBase {
- public:
- EvalQuadTangentAt1() : QuadBenchBase("evalquadtangentat1") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint result;
- for (int outer = 0; outer < loops; ++outer) {
- result = SkEvalQuadTangentAt(fPts, 0.5f);
- result = SkEvalQuadTangentAt(fPts, 0.5f);
- result = SkEvalQuadTangentAt(fPts, 0.5f);
- result = SkEvalQuadTangentAt(fPts, 0.5f);
- }
- }
- };
- DEF_BENCH( return new EvalQuadTangentAt1; )
- ////////
- class ChopQuadAt : public QuadBenchBase {
- public:
- ChopQuadAt() : QuadBenchBase("chopquadat") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint dst[5];
- for (int outer = 0; outer < loops; ++outer) {
- SkChopQuadAt(fPts, dst, 0.5f);
- SkChopQuadAt(fPts, dst, 0.5f);
- SkChopQuadAt(fPts, dst, 0.5f);
- SkChopQuadAt(fPts, dst, 0.5f);
- }
- }
- };
- DEF_BENCH( return new ChopQuadAt; )
- class ChopCubicAt : public QuadBenchBase {
- public:
- ChopCubicAt() : QuadBenchBase("chopcubicat0") {}
- protected:
- void onDraw(int loops, SkCanvas* canvas) override {
- SkPoint dst[7];
- for (int outer = 0; outer < loops; ++outer) {
- SkChopCubicAt(fPts, dst, 0.5f);
- SkChopCubicAt(fPts, dst, 0.5f);
- SkChopCubicAt(fPts, dst, 0.5f);
- SkChopCubicAt(fPts, dst, 0.5f);
- }
- }
- };
- DEF_BENCH( return new ChopCubicAt; )
- #include "include/core/SkPath.h"
- class ConvexityBench : public Benchmark {
- SkPath fPath;
- public:
- ConvexityBench(const char suffix[]) {
- fName.printf("convexity_%s", suffix);
- }
- const char* onGetName() override {
- return fName.c_str();
- }
- bool isSuitableFor(Backend backend) override {
- return kNonRendering_Backend == backend;
- }
- virtual void preparePath(SkPath*) = 0;
- protected:
- void onPreDraw(SkCanvas*) override {
- this->preparePath(&fPath);
- }
- void onDraw(int loops, SkCanvas* canvas) override {
- for (int i = 0; i < loops; ++i) {
- fPath.setConvexity(SkPath::kUnknown_Convexity);
- (void)fPath.isConvex();
- }
- }
- private:
- SkString fName;
- };
- class RRectConvexityBench : public ConvexityBench {
- public:
- RRectConvexityBench() : ConvexityBench("rrect") {}
- void preparePath(SkPath* path) override {
- SkRRect rr;
- rr.setRectXY({0, 0, 100, 100}, 20, 30);
- path->addRRect(rr);
- }
- };
- DEF_BENCH( return new RRectConvexityBench; )
|