Add bench to test float to fixed conversion
authordjsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 18 Jul 2013 19:11:30 +0000 (19:11 +0000)
committerdjsollen@google.com <djsollen@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 18 Jul 2013 19:11:30 +0000 (19:11 +0000)
R=reed@google.com

Review URL: https://codereview.chromium.org/19773006

git-svn-id: http://skia.googlecode.com/svn/trunk@10155 2bbb7eff-a529-9590-31e7-b0007b416f81

bench/MathBench.cpp
include/core/SkFixed.h
src/core/SkCordic.cpp

index 1fc5705..32a89d6 100644 (file)
@@ -480,6 +480,48 @@ private:
 
 ///////////////////////////////////////////////////////////////////////////////
 
+class FixedMathBench : public SkBenchmark {
+    enum {
+        N = SkBENCHLOOP(1000),
+        NN = SkBENCHLOOP(1000),
+    };
+    float fData[N];
+    SkFixed fResult[N];
+public:
+
+    FixedMathBench(void* param) : INHERITED(param) {
+        SkRandom rand;
+        for (int i = 0; i < N; ++i) {
+            fData[i] = rand.nextSScalar1();
+        }
+
+        fIsRendering = false;
+    }
+
+protected:
+    virtual void onDraw(SkCanvas*) {
+        for (int j = 0; j < NN; ++j) {
+            for (int i = 0; i < N - 4; ++i) {
+                fResult[i] = SkFloatToFixed(fData[i]);
+            }
+        }
+
+        SkPaint paint;
+        if (paint.getAlpha() == 0) {
+            SkDebugf("%d\n", fResult[0]);
+        }
+    }
+
+    virtual const char* onGetName() {
+        return "float_to_fixed";
+    }
+
+private:
+    typedef SkBenchmark INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
 DEF_BENCH( return new NoOpMathBench(p); )
 DEF_BENCH( return new SlowISqrtMathBench(p); )
 DEF_BENCH( return new FastISqrtMathBench(p); )
@@ -501,3 +543,5 @@ DEF_BENCH( return new CLZBench(p, false); )
 DEF_BENCH( return new CLZBench(p, true); )
 
 DEF_BENCH( return new NormalizeBench(p); )
+
+DEF_BENCH( return new FixedMathBench(p); )
index ba2479a..abeeccc 100644 (file)
@@ -192,7 +192,7 @@ inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero)
 
 #if defined(SK_CPU_ARM) && !defined(__thumb__)
     /* This guy does not handle NaN or other obscurities, but is faster than
-       than (int)(x*65536) when we only have software floats
+       than (int)(x*65536)
     */
     inline SkFixed SkFloatToFixed_arm(float x)
     {
index 00dd76e..3adc92f 100644 (file)
@@ -203,7 +203,7 @@ void SkCordic_UnitTest()
     float val;
     for (float angle = -720; angle < 720; angle += 30) {
         float radian = angle * 3.1415925358f / 180.0f;
-        SkFixed f_angle = (int) (radian * 65536.0f);
+        SkFixed f_angle = SkFloatToFixed(radian);
     // sincos
         float sine = sinf(radian);
         float cosine = cosf(radian);
@@ -226,7 +226,7 @@ void SkCordic_UnitTest()
             SkDebugf("tan error : angle = %g ; tan = %g ; cordic = %g\n", angle, _tan, tan2);
     }
     for (val = -1; val <= 1; val += .1f) {
-        SkFixed f_val = (int) (val * 65536.0f);
+        SkFixed f_val = SkFloatToFixed(val);
     // asin
         float arcsine = asinf(val);
         SkFixed f_arcsine = SkCordicASin(f_val);
@@ -240,7 +240,7 @@ void SkCordic_UnitTest()
 #else
     val = .5; {
 #endif
-        SkFixed f_val = (int) (val * 65536.0f);
+        SkFixed f_val = SkFloatToFixed(val);
     // acos
         float arccos = acosf(val);
         SkFixed f_arccos = SkCordicACos(f_val);
@@ -257,8 +257,8 @@ void SkCordic_UnitTest()
             val = 0; {
             float val2 = -1000; {
 #endif
-            SkFixed f_val = (int) (val * 65536.0f);
-            SkFixed f_val2 = (int) (val2 * 65536.0f);
+            SkFixed f_val = SkFloatToFixed(val);
+            SkFixed f_val2 = SkFloatToFixed(val2);
             float arctan = atan2f(val, val2);
             SkFixed f_arctan = SkCordicATan2(f_val, f_val2);
             float arctan2 = (float) f_arctan / 65536.0f;
@@ -273,7 +273,7 @@ void SkCordic_UnitTest()
 #else
     val = .5; {
 #endif
-        SkFixed f_val = (int) (val * 65536.0f);
+        SkFixed f_val = SkFloatToFixed(val);
     // acos
         float log = logf(val);
         SkFixed f_log = SkCordicLog(f_val);