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