| Index: bench/MatrixBench.cpp
|
| diff --git a/bench/MatrixBench.cpp b/bench/MatrixBench.cpp
|
| index 1a35c2ed92a9de0fec800e1c1890e737eccd9215..1d8e81115badb90c597ced0d332cdbd44e9cb4eb 100644
|
| --- a/bench/MatrixBench.cpp
|
| +++ b/bench/MatrixBench.cpp
|
| @@ -94,125 +94,6 @@ template <typename T> void init9(T array[9]) {
|
| }
|
| }
|
|
|
| -// Test the performance of setConcat() non-perspective case:
|
| -// using floating point precision only.
|
| -class FloatConcatMatrixBench : public MatrixBench {
|
| -public:
|
| - FloatConcatMatrixBench() : INHERITED("concat_floatfloat") {
|
| - init9(mya);
|
| - init9(myb);
|
| - init9(myr);
|
| - }
|
| -protected:
|
| - virtual int mulLoopCount() const { return 4; }
|
| -
|
| - static inline void muladdmul(float a, float b, float c, float d,
|
| - float* result) {
|
| - *result = a * b + c * d;
|
| - }
|
| - virtual void performTest() {
|
| - const float* a = mya;
|
| - const float* b = myb;
|
| - float* r = myr;
|
| - muladdmul(a[0], b[0], a[1], b[3], &r[0]);
|
| - muladdmul(a[0], b[1], a[1], b[4], &r[1]);
|
| - muladdmul(a[0], b[2], a[1], b[5], &r[2]);
|
| - r[2] += a[2];
|
| - muladdmul(a[3], b[0], a[4], b[3], &r[3]);
|
| - muladdmul(a[3], b[1], a[4], b[4], &r[4]);
|
| - muladdmul(a[3], b[2], a[4], b[5], &r[5]);
|
| - r[5] += a[5];
|
| - r[6] = r[7] = 0.0f;
|
| - r[8] = 1.0f;
|
| - }
|
| -private:
|
| - float mya [9];
|
| - float myb [9];
|
| - float myr [9];
|
| - typedef MatrixBench INHERITED;
|
| -};
|
| -
|
| -static inline float SkDoubleToFloat(double x) {
|
| - return static_cast<float>(x);
|
| -}
|
| -
|
| -// Test the performance of setConcat() non-perspective case:
|
| -// using floating point precision but casting up to float for
|
| -// intermediate results during computations.
|
| -class FloatDoubleConcatMatrixBench : public MatrixBench {
|
| -public:
|
| - FloatDoubleConcatMatrixBench() : INHERITED("concat_floatdouble") {
|
| - init9(mya);
|
| - init9(myb);
|
| - init9(myr);
|
| - }
|
| -protected:
|
| - virtual int mulLoopCount() const { return 4; }
|
| -
|
| - static inline void muladdmul(float a, float b, float c, float d,
|
| - float* result) {
|
| - *result = SkDoubleToFloat((double)a * b + (double)c * d);
|
| - }
|
| - virtual void performTest() {
|
| - const float* a = mya;
|
| - const float* b = myb;
|
| - float* r = myr;
|
| - muladdmul(a[0], b[0], a[1], b[3], &r[0]);
|
| - muladdmul(a[0], b[1], a[1], b[4], &r[1]);
|
| - muladdmul(a[0], b[2], a[1], b[5], &r[2]);
|
| - r[2] += a[2];
|
| - muladdmul(a[3], b[0], a[4], b[3], &r[3]);
|
| - muladdmul(a[3], b[1], a[4], b[4], &r[4]);
|
| - muladdmul(a[3], b[2], a[4], b[5], &r[5]);
|
| - r[5] += a[5];
|
| - r[6] = r[7] = 0.0f;
|
| - r[8] = 1.0f;
|
| - }
|
| -private:
|
| - float mya [9];
|
| - float myb [9];
|
| - float myr [9];
|
| - typedef MatrixBench INHERITED;
|
| -};
|
| -
|
| -// Test the performance of setConcat() non-perspective case:
|
| -// using double precision only.
|
| -class DoubleConcatMatrixBench : public MatrixBench {
|
| -public:
|
| - DoubleConcatMatrixBench() : INHERITED("concat_double") {
|
| - init9(mya);
|
| - init9(myb);
|
| - init9(myr);
|
| - }
|
| -protected:
|
| - virtual int mulLoopCount() const { return 4; }
|
| -
|
| - static inline void muladdmul(double a, double b, double c, double d,
|
| - double* result) {
|
| - *result = a * b + c * d;
|
| - }
|
| - virtual void performTest() {
|
| - const double* a = mya;
|
| - const double* b = myb;
|
| - double* r = myr;
|
| - muladdmul(a[0], b[0], a[1], b[3], &r[0]);
|
| - muladdmul(a[0], b[1], a[1], b[4], &r[1]);
|
| - muladdmul(a[0], b[2], a[1], b[5], &r[2]);
|
| - r[2] += a[2];
|
| - muladdmul(a[3], b[0], a[4], b[3], &r[3]);
|
| - muladdmul(a[3], b[1], a[4], b[4], &r[4]);
|
| - muladdmul(a[3], b[2], a[4], b[5], &r[5]);
|
| - r[5] += a[5];
|
| - r[6] = r[7] = 0.0;
|
| - r[8] = 1.0;
|
| - }
|
| -private:
|
| - double mya [9];
|
| - double myb [9];
|
| - double myr [9];
|
| - typedef MatrixBench INHERITED;
|
| -};
|
| -
|
| class GetTypeMatrixBench : public MatrixBench {
|
| public:
|
| GetTypeMatrixBench()
|
| @@ -260,87 +141,6 @@ private:
|
| typedef MatrixBench INHERITED;
|
| };
|
|
|
| -class ScaleTransMixedMatrixBench : public MatrixBench {
|
| - public:
|
| - ScaleTransMixedMatrixBench() : INHERITED("scaletrans_mixed") {
|
| - fMatrix.setAll(fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
|
| - fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1(),
|
| - fRandom.nextSScalar1(), fRandom.nextSScalar1(), fRandom.nextSScalar1());
|
| - int i;
|
| - for (i = 0; i < kCount; i++) {
|
| - fSrc[i].fX = fRandom.nextSScalar1();
|
| - fSrc[i].fY = fRandom.nextSScalar1();
|
| - fDst[i].fX = fRandom.nextSScalar1();
|
| - fDst[i].fY = fRandom.nextSScalar1();
|
| - }
|
| - }
|
| - protected:
|
| - virtual void performTest() {
|
| - SkPoint* dst = fDst;
|
| - const SkPoint* src = fSrc;
|
| - int count = kCount;
|
| - float mx = fMatrix[SkMatrix::kMScaleX];
|
| - float my = fMatrix[SkMatrix::kMScaleY];
|
| - float tx = fMatrix[SkMatrix::kMTransX];
|
| - float ty = fMatrix[SkMatrix::kMTransY];
|
| - do {
|
| - dst->fY = SkScalarMulAdd(src->fY, my, ty);
|
| - dst->fX = SkScalarMulAdd(src->fX, mx, tx);
|
| - src += 1;
|
| - dst += 1;
|
| - } while (--count);
|
| - }
|
| - private:
|
| - enum {
|
| - kCount = 16
|
| - };
|
| - SkMatrix fMatrix;
|
| - SkPoint fSrc [kCount];
|
| - SkPoint fDst [kCount];
|
| - SkRandom fRandom;
|
| - typedef MatrixBench INHERITED;
|
| -};
|
| -
|
| -class ScaleTransDoubleMatrixBench : public MatrixBench {
|
| - public:
|
| - ScaleTransDoubleMatrixBench() : INHERITED("scaletrans_double") {
|
| - init9(fMatrix);
|
| - int i;
|
| - for (i = 0; i < kCount; i++) {
|
| - fSrc[i].fX = fRandom.nextSScalar1();
|
| - fSrc[i].fY = fRandom.nextSScalar1();
|
| - fDst[i].fX = fRandom.nextSScalar1();
|
| - fDst[i].fY = fRandom.nextSScalar1();
|
| - }
|
| - }
|
| - protected:
|
| - virtual void performTest() {
|
| - SkPoint* dst = fDst;
|
| - const SkPoint* src = fSrc;
|
| - int count = kCount;
|
| - // As doubles, on Z600 Linux systems this is 2.5x as expensive as mixed mode
|
| - float mx = (float) fMatrix[SkMatrix::kMScaleX];
|
| - float my = (float) fMatrix[SkMatrix::kMScaleY];
|
| - float tx = (float) fMatrix[SkMatrix::kMTransX];
|
| - float ty = (float) fMatrix[SkMatrix::kMTransY];
|
| - do {
|
| - dst->fY = src->fY * my + ty;
|
| - dst->fX = src->fX * mx + tx;
|
| - src += 1;
|
| - dst += 1;
|
| - } while (--count);
|
| - }
|
| - private:
|
| - enum {
|
| - kCount = 16
|
| - };
|
| - double fMatrix [9];
|
| - SkPoint fSrc [kCount];
|
| - SkPoint fDst [kCount];
|
| - SkRandom fRandom;
|
| - typedef MatrixBench INHERITED;
|
| -};
|
| -
|
| class DecomposeMatrixBench : public MatrixBench {
|
| public:
|
| DecomposeMatrixBench() : INHERITED("decompose") {}
|
| @@ -428,9 +228,6 @@ private:
|
|
|
| DEF_BENCH( return new EqualsMatrixBench(); )
|
| DEF_BENCH( return new ScaleMatrixBench(); )
|
| -DEF_BENCH( return new FloatConcatMatrixBench(); )
|
| -DEF_BENCH( return new FloatDoubleConcatMatrixBench(); )
|
| -DEF_BENCH( return new DoubleConcatMatrixBench(); )
|
| DEF_BENCH( return new GetTypeMatrixBench(); )
|
| DEF_BENCH( return new DecomposeMatrixBench(); )
|
|
|
| @@ -468,5 +265,49 @@ DEF_BENCH( return new InvertMapRectMatrixBench(
|
| InvertMapRectMatrixBench::kRotate_Flag |
|
| InvertMapRectMatrixBench::kTranslate_Flag); )
|
|
|
| -DEF_BENCH( return new ScaleTransMixedMatrixBench(); )
|
| -DEF_BENCH( return new ScaleTransDoubleMatrixBench(); )
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +static SkMatrix make_ident() { SkMatrix m; m.reset(); return m; }
|
| +static SkMatrix make_trans() { SkMatrix m; m.setTranslate(2, 3); return m; }
|
| +static SkMatrix make_scale() { SkMatrix m(make_trans()); m.postScale(1.5f, 0.5f); return m; }
|
| +static SkMatrix make_afine() { SkMatrix m(make_trans()); m.postRotate(15); return m; }
|
| +
|
| +class MapPointsMatrixBench : public MatrixBench {
|
| +protected:
|
| + SkMatrix fM;
|
| + enum {
|
| + N = 32
|
| + };
|
| + SkPoint fSrc[N], fDst[N];
|
| + const bool fNewWay;
|
| +public:
|
| + MapPointsMatrixBench(const char name[], const SkMatrix& m, bool newWay)
|
| + : MatrixBench(name), fM(m), fNewWay(newWay)
|
| + {
|
| + SkRandom rand;
|
| + for (int i = 0; i < N; ++i) {
|
| + fSrc[i].set(rand.nextSScalar1(), rand.nextSScalar1());
|
| + }
|
| + }
|
| +
|
| + void performTest() SK_OVERRIDE {
|
| + if (fNewWay) {
|
| + for (int i = 0; i < 1000000; ++i) {
|
| + fM.mapPts(fDst, fSrc, N);
|
| + }
|
| + } else {
|
| + for (int i = 0; i < 1000000; ++i) {
|
| + fM.mapPoints(fDst, fSrc, N);
|
| + }
|
| + }
|
| + }
|
| +};
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_ident0", make_ident(), false); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_ident1", make_ident(), true); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_trans0", make_trans(), false); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_trans1", make_trans(), true); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_scale0", make_scale(), false); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_scale1", make_scale(), true); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_afine0", make_afine(), false); )
|
| +DEF_BENCH( return new MapPointsMatrixBench("mappts_afine1", make_afine(), true); )
|
| +
|
|
|