1f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 2b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkColorPriv.h" 3b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkMatrix.h" 4f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h" 5b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkRandom.h" 6b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#include "SkString.h" 7b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 8b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com#define TILE(x, width) (((x) & 0xFFFF) * width >> 16) 9b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 10f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass InterpBench : public Benchmark { 11b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com enum { 12b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com kBuffer = 128, 13b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com kLoop = 20000 14b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com }; 15b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkString fName; 16b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com int16_t fDst[kBuffer]; 17b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com float fFx, fDx; 18b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 19410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com InterpBench(const char name[]) { 20b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com fName.printf("interp_%s", name); 2109042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com fFx = 3.3f; 2209042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com fDx = 0.1257f; 23644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 24644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 25644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 26644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 27b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 28b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 29b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float x, float dx, int count) = 0; 30b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 31b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 32b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual int mulLoopCount() const { return 1; } 33b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 34b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual const char* onGetName() { 35b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com return fName.c_str(); 36b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 37b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 383361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) { 393361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org int n = loops * this->mulLoopCount(); 40b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < n; i++) { 41b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com this->performTest(fDst, fFx, fDx, kBuffer); 42b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 43b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 44b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 45b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 46f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 47b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 48b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 49b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed16D16Interp : public InterpBench { 50b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 51410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com Fixed16D16Interp() : INHERITED("16.16") {} 52fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 53b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 54b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 55b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed curr = SkFloatToFixed(fx); 56b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed step = SkFloatToFixed(dx); 57b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < count; i += 4) { 58b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com dst[i + 0] = TILE(curr, count); curr += step; 59b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com dst[i + 1] = TILE(curr, count); curr += step; 60b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com dst[i + 2] = TILE(curr, count); curr += step; 61b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com dst[i + 3] = TILE(curr, count); curr += step; 62b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 63b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 64b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 65b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com typedef InterpBench INHERITED; 66b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 67b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 68b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed32D32Interp : public InterpBench { 69b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 70410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com Fixed32D32Interp() : INHERITED("32.32") {} 71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 72b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 73b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 74b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com int64_t curr = (int64_t)(fx * 65536 * 655536); 75b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com int64_t step = (int64_t)(dx * 65536 * 655536); 76b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed tmp; 77b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < count; i += 4) { 78fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com tmp = (SkFixed)(curr >> 16); 79fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com dst[i + 0] = TILE(tmp, count); 804debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com curr += step; 814debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com 82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com tmp = (SkFixed)(curr >> 16); 83fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com dst[i + 1] = TILE(tmp, count); 844debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com curr += step; 854debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com 86fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com tmp = (SkFixed)(curr >> 16); 87fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com dst[i + 2] = TILE(tmp, count); 884debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com curr += step; 894debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com 90fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com tmp = (SkFixed)(curr >> 16); 91fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com dst[i + 3] = TILE(tmp, count); 924debcac8c38cae17a01e697578719c60a068052frobertphillips@google.com curr += step; 93b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 94b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 95b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 96b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com typedef InterpBench INHERITED; 97b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 98b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 99b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass Fixed16D48Interp : public InterpBench { 100b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com Fixed16D48Interp() : INHERITED("16.48") {} 102fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 103b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 104b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 105b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com int64_t curr = (int64_t)(fx * 65536 * 655536 * 65536); 106b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com int64_t step = (int64_t)(dx * 65536 * 655536 * 65536); 107b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed tmp; 108b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < count; i += 4) { 10919069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com tmp = (SkFixed) (curr >> 32); dst[i + 0] = TILE(tmp, count); curr += step; 11019069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com tmp = (SkFixed) (curr >> 32); dst[i + 1] = TILE(tmp, count); curr += step; 11119069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com tmp = (SkFixed) (curr >> 32); dst[i + 2] = TILE(tmp, count); curr += step; 11219069a28225356bc24a5df7ad03c4d4ac5c532cbcaryclark@google.com tmp = (SkFixed) (curr >> 32); dst[i + 3] = TILE(tmp, count); curr += step; 113b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 114b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 115b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 116b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com typedef InterpBench INHERITED; 117b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 118b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 119b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass FloatInterp : public InterpBench { 120b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com FloatInterp() : INHERITED("float") {} 122fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 123b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 124b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 125b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed tmp; 126b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < count; i += 4) { 127b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkFloatToFixed(fx); dst[i + 0] = TILE(tmp, count); fx += dx; 128b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkFloatToFixed(fx); dst[i + 1] = TILE(tmp, count); fx += dx; 129b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkFloatToFixed(fx); dst[i + 2] = TILE(tmp, count); fx += dx; 130b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkFloatToFixed(fx); dst[i + 3] = TILE(tmp, count); fx += dx; 131b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 132b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 133b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 134b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com typedef InterpBench INHERITED; 135b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 136b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 137b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comclass DoubleInterp : public InterpBench { 138b8c39178ffd1afbf58273f739e513f308c97c35areed@google.compublic: 139410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com DoubleInterp() : INHERITED("double") {} 140fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 141b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprotected: 142b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com virtual void performTest(int16_t dst[], float fx, float dx, int count) SK_OVERRIDE { 143b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com double ffx = fx; 144b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com double ddx = dx; 145b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com SkFixed tmp; 146b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com for (int i = 0; i < count; i += 4) { 147b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkDoubleToFixed(ffx); dst[i + 0] = TILE(tmp, count); ffx += ddx; 148b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkDoubleToFixed(ffx); dst[i + 1] = TILE(tmp, count); ffx += ddx; 149b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkDoubleToFixed(ffx); dst[i + 2] = TILE(tmp, count); ffx += ddx; 150b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com tmp = SkDoubleToFixed(ffx); dst[i + 3] = TILE(tmp, count); ffx += ddx; 151b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 152b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com } 153b8c39178ffd1afbf58273f739e513f308c97c35areed@google.comprivate: 154b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com typedef InterpBench INHERITED; 155b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com}; 156b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 157b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com/////////////////////////////////////////////////////////////////////////////// 158b8c39178ffd1afbf58273f739e513f308c97c35areed@google.com 159410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed16D16Interp(); ) 160410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed32D32Interp(); ) 161410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Fixed16D48Interp(); ) 162410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new FloatInterp(); ) 163410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DoubleInterp(); ) 164