1 #include "SkBenchmark.h" 2 #include "SkColorPriv.h" 3 #include "SkMatrix.h" 4 #include "SkRandom.h" 5 #include "SkString.h" 6 #include "SkPaint.h" 7 8 #define TILE(x, width) (((x) & 0xFFFF) * width >> 16) 9 10 class InterpBench : public SkBenchmark { 11 enum { 12 kBuffer = 128, 13 kLoop = 20000 14 }; 15 SkString fName; 16 int16_t fDst[kBuffer]; 17 float fFx, fDx; 18 public: InterpBench(const char name[])19 InterpBench(const char name[]) { 20 fName.printf("interp_%s", name); 21 fFx = 3.3f; 22 fDx = 0.1257f; 23 } 24 isSuitableFor(Backend backend)25 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 26 return backend == kNonRendering_Backend; 27 } 28 29 virtual void performTest(int16_t dst[], float x, float dx, int count) = 0; 30 31 protected: mulLoopCount() const32 virtual int mulLoopCount() const { return 1; } 33 onGetName()34 virtual const char* onGetName() { 35 return fName.c_str(); 36 } 37 onDraw(const int loops,SkCanvas *)38 virtual void onDraw(const int loops, SkCanvas*) { 39 int n = loops * this->mulLoopCount(); 40 for (int i = 0; i < n; i++) { 41 this->performTest(fDst, fFx, fDx, kBuffer); 42 } 43 } 44 45 private: 46 typedef SkBenchmark INHERITED; 47 }; 48 49 class Fixed16D16Interp : public InterpBench { 50 public: Fixed16D16Interp()51 Fixed16D16Interp() : INHERITED("16.16") {} 52 53 protected: performTest(int16_t dst[],float fx,float dx,int count)54 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 55 SkFixed curr = SkFloatToFixed(fx); 56 SkFixed step = SkFloatToFixed(dx); 57 for (int i = 0; i < count; i += 4) { 58 dst[i + 0] = TILE(curr, count); curr += step; 59 dst[i + 1] = TILE(curr, count); curr += step; 60 dst[i + 2] = TILE(curr, count); curr += step; 61 dst[i + 3] = TILE(curr, count); curr += step; 62 } 63 } 64 private: 65 typedef InterpBench INHERITED; 66 }; 67 68 class Fixed32D32Interp : public InterpBench { 69 public: Fixed32D32Interp()70 Fixed32D32Interp() : INHERITED("32.32") {} 71 72 protected: performTest(int16_t dst[],float fx,float dx,int count)73 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 74 int64_t curr = (int64_t)(fx * 65536 * 655536); 75 int64_t step = (int64_t)(dx * 65536 * 655536); 76 SkFixed tmp; 77 for (int i = 0; i < count; i += 4) { 78 tmp = (SkFixed)(curr >> 16); 79 dst[i + 0] = TILE(tmp, count); 80 curr += step; 81 82 tmp = (SkFixed)(curr >> 16); 83 dst[i + 1] = TILE(tmp, count); 84 curr += step; 85 86 tmp = (SkFixed)(curr >> 16); 87 dst[i + 2] = TILE(tmp, count); 88 curr += step; 89 90 tmp = (SkFixed)(curr >> 16); 91 dst[i + 3] = TILE(tmp, count); 92 curr += step; 93 } 94 } 95 private: 96 typedef InterpBench INHERITED; 97 }; 98 99 class Fixed16D48Interp : public InterpBench { 100 public: Fixed16D48Interp()101 Fixed16D48Interp() : INHERITED("16.48") {} 102 103 protected: performTest(int16_t dst[],float fx,float dx,int count)104 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 105 int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536); 106 int64_t step = (int64_t)(dx * 65536 * 655536 * 65536); 107 SkFixed tmp; 108 for (int i = 0; i < count; i += 4) { 109 tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr += step; 110 tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr += step; 111 tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr += step; 112 tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr += step; 113 } 114 } 115 private: 116 typedef InterpBench INHERITED; 117 }; 118 119 class FloatInterp : public InterpBench { 120 public: FloatInterp()121 FloatInterp() : INHERITED("float") {} 122 123 protected: performTest(int16_t dst[],float fx,float dx,int count)124 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 125 SkFixed tmp; 126 for (int i = 0; i < count; i += 4) { 127 tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx; 128 tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx; 129 tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx; 130 tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx; 131 } 132 } 133 private: 134 typedef InterpBench INHERITED; 135 }; 136 137 class DoubleInterp : public InterpBench { 138 public: DoubleInterp()139 DoubleInterp() : INHERITED("double") {} 140 141 protected: performTest(int16_t dst[],float fx,float dx,int count)142 virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 143 double ffx = fx; 144 double ddx = dx; 145 SkFixed tmp; 146 for (int i = 0; i < count; i += 4) { 147 tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += ddx; 148 tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += ddx; 149 tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += ddx; 150 tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += ddx; 151 } 152 } 153 private: 154 typedef InterpBench INHERITED; 155 }; 156 157 /////////////////////////////////////////////////////////////////////////////// 158 159 DEF_BENCH( return new Fixed16D16Interp(); ) 160 DEF_BENCH( return new Fixed32D32Interp(); ) 161 DEF_BENCH( return new Fixed16D48Interp(); ) 162 DEF_BENCH( return new FloatInterp(); ) 163 DEF_BENCH( return new DoubleInterp(); ) 164