From e9d0060f4d7b5a07a220182d83aae3a140784c4b Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Wed, 2 Sep 2009 21:12:42 +0000 Subject: [PATCH] add decode bench add dictionary for bench tools to see optional cmdline args git-svn-id: http://skia.googlecode.com/svn/trunk@351 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/BitmapBench.cpp | 11 ++++---- bench/DecodeBench.cpp | 53 +++++++++++++++++++++++++++++++++++++++ bench/RectBench.cpp | 36 +++++++++++++------------- bench/RepeatTileBench.cpp | 10 ++++---- bench/SkBenchmark.cpp | 13 +++++++++- bench/SkBenchmark.h | 8 ++++-- bench/TextBench.cpp | 19 +++++++------- bench/benchmain.cpp | 17 ++++++++++--- 8 files changed, 125 insertions(+), 42 deletions(-) create mode 100644 bench/DecodeBench.cpp diff --git a/bench/BitmapBench.cpp b/bench/BitmapBench.cpp index 22c0a01d24..89dfa74bc4 100644 --- a/bench/BitmapBench.cpp +++ b/bench/BitmapBench.cpp @@ -96,7 +96,8 @@ class BitmapBench : public SkBenchmark { SkString fName; enum { N = 300 }; public: - BitmapBench(SkBitmap::Config c, int tx = -1, int ty = -1) : fTileX(tx), fTileY(ty) { + BitmapBench(void* param, SkBitmap::Config c, int tx = -1, int ty = -1) + : INHERITED(param), fTileX(tx), fTileY(ty) { const int w = 128; const int h = 128; SkBitmap bm; @@ -153,10 +154,10 @@ private: typedef SkBenchmark INHERITED; }; -static SkBenchmark* Fact0(void*) { return new BitmapBench(SkBitmap::kARGB_8888_Config); } -static SkBenchmark* Fact1(void*) { return new BitmapBench(SkBitmap::kRGB_565_Config); } -static SkBenchmark* Fact2(void*) { return new BitmapBench(SkBitmap::kARGB_4444_Config); } -static SkBenchmark* Fact3(void*) { return new BitmapBench(SkBitmap::kIndex8_Config); } +static SkBenchmark* Fact0(void* p) { return new BitmapBench(p, SkBitmap::kARGB_8888_Config); } +static SkBenchmark* Fact1(void* p) { return new BitmapBench(p, SkBitmap::kRGB_565_Config); } +static SkBenchmark* Fact2(void* p) { return new BitmapBench(p, SkBitmap::kARGB_4444_Config); } +static SkBenchmark* Fact3(void* p) { return new BitmapBench(p, SkBitmap::kIndex8_Config); } static BenchRegistry gReg0(Fact0); static BenchRegistry gReg1(Fact1); diff --git a/bench/DecodeBench.cpp b/bench/DecodeBench.cpp new file mode 100644 index 0000000000..6abd05456f --- /dev/null +++ b/bench/DecodeBench.cpp @@ -0,0 +1,53 @@ +#include "SkBenchmark.h" +#include "SkBitmap.h" +#include "SkImageDecoder.h" +#include "SkString.h" + +static const char* gConfigName[] = { + "ERROR", "a1", "a8", "index8", "565", "4444", "8888" +}; + +class DecodeBench : public SkBenchmark { + const char* fFilename; + SkBitmap::Config fPrefConfig; + SkString fName; + enum { N = 10 }; +public: + DecodeBench(void* param, SkBitmap::Config c) : SkBenchmark(param) { + fFilename = this->findDefine("decode-filename"); + fPrefConfig = c; + + const char* fname = NULL; + if (fFilename) { + fname = strrchr(fFilename, '/'); + if (fname) { + fname += 1; // skip the slash + } + } + fName.printf("decode_%s_%s", gConfigName[c], fname); + } + +protected: + virtual const char* onGetName() { + return fName.c_str(); + } + + virtual void onDraw(SkCanvas* canvas) { + for (int i = 0; i < N; i++) { + SkBitmap bm; + SkImageDecoder::DecodeFile(fFilename, &bm, fPrefConfig, + SkImageDecoder::kDecodePixels_Mode); + } + } + +private: + typedef SkBenchmark INHERITED; +}; + +static SkBenchmark* Fact0(void* p) { return new DecodeBench(p, SkBitmap::kARGB_8888_Config); } +static SkBenchmark* Fact1(void* p) { return new DecodeBench(p, SkBitmap::kRGB_565_Config); } +static SkBenchmark* Fact2(void* p) { return new DecodeBench(p, SkBitmap::kARGB_4444_Config); } + +static BenchRegistry gReg0(Fact0); +static BenchRegistry gReg1(Fact1); +static BenchRegistry gReg2(Fact2); diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp index 69e0b005eb..6f34eb5638 100644 --- a/bench/RectBench.cpp +++ b/bench/RectBench.cpp @@ -15,7 +15,7 @@ public: SkRect fRects[N]; SkColor fColors[N]; - RectBench(int shift) : fShift(shift) { + RectBench(void* param, int shift) : INHERITED(param), fShift(shift) { SkRandom rand; for (int i = 0; i < N; i++) { int x = rand.nextU() % W; @@ -53,11 +53,13 @@ protected: this->drawThisRect(canvas, fRects[i], paint); } } +private: + typedef SkBenchmark INHERITED; }; class OvalBench : public RectBench { public: - OvalBench(int shift) : RectBench(shift) {} + OvalBench(void* param, int shift) : RectBench(param, shift) {} protected: virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) { c->drawOval(r, p); @@ -67,7 +69,7 @@ protected: class RRectBench : public RectBench { public: - RRectBench(int shift) : RectBench(shift) {} + RRectBench(void* param, int shift) : RectBench(param, shift) {} protected: virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) { c->drawRoundRect(r, r.width() / 4, r.height() / 4, p); @@ -80,8 +82,8 @@ public: SkCanvas::PointMode fMode; const char* fName; - PointsBench(SkCanvas::PointMode mode, const char* name) : - RectBench(2), fMode(mode) { + PointsBench(void* param, SkCanvas::PointMode mode, const char* name) : + RectBench(param, 2), fMode(mode) { fName = name; } @@ -105,20 +107,20 @@ protected: virtual const char* onGetName() { return fName; } }; -static SkBenchmark* RectFactory1(void*) { return SkNEW_ARGS(RectBench, (1)); } -static SkBenchmark* RectFactory2(void*) { return SkNEW_ARGS(RectBench, (3)); } -static SkBenchmark* OvalFactory1(void*) { return SkNEW_ARGS(OvalBench, (1)); } -static SkBenchmark* OvalFactory2(void*) { return SkNEW_ARGS(OvalBench, (3)); } -static SkBenchmark* RRectFactory1(void*) { return SkNEW_ARGS(RRectBench, (1)); } -static SkBenchmark* RRectFactory2(void*) { return SkNEW_ARGS(RRectBench, (3)); } -static SkBenchmark* PointsFactory(void*) { - return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points")); +static SkBenchmark* RectFactory1(void* p) { return SkNEW_ARGS(RectBench, (p, 1)); } +static SkBenchmark* RectFactory2(void* p) { return SkNEW_ARGS(RectBench, (p, 3)); } +static SkBenchmark* OvalFactory1(void* p) { return SkNEW_ARGS(OvalBench, (p, 1)); } +static SkBenchmark* OvalFactory2(void* p) { return SkNEW_ARGS(OvalBench, (p, 3)); } +static SkBenchmark* RRectFactory1(void* p) { return SkNEW_ARGS(RRectBench, (p, 1)); } +static SkBenchmark* RRectFactory2(void* p) { return SkNEW_ARGS(RRectBench, (p, 3)); } +static SkBenchmark* PointsFactory(void* p) { + return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPoints_PointMode, "points")); } -static SkBenchmark* LinesFactory(void*) { - return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines")); +static SkBenchmark* LinesFactory(void* p) { + return SkNEW_ARGS(PointsBench, (p, SkCanvas::kLines_PointMode, "lines")); } -static SkBenchmark* PolygonFactory(void*) { - return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon")); +static SkBenchmark* PolygonFactory(void* p) { + return SkNEW_ARGS(PointsBench, (p, SkCanvas::kPolygon_PointMode, "polygon")); } static BenchRegistry gRectReg1(RectFactory1); diff --git a/bench/RepeatTileBench.cpp b/bench/RepeatTileBench.cpp index 48c1f6f4e8..97bbeb82d7 100644 --- a/bench/RepeatTileBench.cpp +++ b/bench/RepeatTileBench.cpp @@ -81,7 +81,7 @@ class RepeatTileBench : public SkBenchmark { SkString fName; enum { N = 20 }; public: - RepeatTileBench(SkBitmap::Config c) { + RepeatTileBench(void* param, SkBitmap::Config c) : INHERITED(param) { const int w = 50; const int h = 50; SkBitmap bm; @@ -127,10 +127,10 @@ private: typedef SkBenchmark INHERITED; }; -static SkBenchmark* Fact0(void*) { return new RepeatTileBench(SkBitmap::kARGB_8888_Config); } -static SkBenchmark* Fact1(void*) { return new RepeatTileBench(SkBitmap::kRGB_565_Config); } -static SkBenchmark* Fact2(void*) { return new RepeatTileBench(SkBitmap::kARGB_4444_Config); } -static SkBenchmark* Fact3(void*) { return new RepeatTileBench(SkBitmap::kIndex8_Config); } +static SkBenchmark* Fact0(void* p) { return new RepeatTileBench(p, SkBitmap::kARGB_8888_Config); } +static SkBenchmark* Fact1(void* p) { return new RepeatTileBench(p, SkBitmap::kRGB_565_Config); } +static SkBenchmark* Fact2(void* p) { return new RepeatTileBench(p, SkBitmap::kARGB_4444_Config); } +static SkBenchmark* Fact3(void* p) { return new RepeatTileBench(p, SkBitmap::kIndex8_Config); } static BenchRegistry gReg0(Fact0); static BenchRegistry gReg1(Fact1); diff --git a/bench/SkBenchmark.cpp b/bench/SkBenchmark.cpp index 7bc87ee82b..8dd66f06b9 100644 --- a/bench/SkBenchmark.cpp +++ b/bench/SkBenchmark.cpp @@ -3,7 +3,8 @@ template BenchRegistry* BenchRegistry::gHead; -SkBenchmark::SkBenchmark() { +SkBenchmark::SkBenchmark(void* defineDict) { + fDict = reinterpret_cast*>(defineDict); fForceAlpha = 0xFF; fForceAA = true; } @@ -26,6 +27,16 @@ void SkBenchmark::setupPaint(SkPaint* paint) { paint->setFilterBitmap(fForceFilter); } +const char* SkBenchmark::findDefine(const char* key) const { + if (fDict) { + const char* value; + if (fDict->find(key, &value)) { + return value; + } + } + return NULL; +} + /////////////////////////////////////////////////////////////////////////////// SkIPoint SkBenchmark::onGetSize() { diff --git a/bench/SkBenchmark.h b/bench/SkBenchmark.h index 20582514e0..5ecff3b84c 100644 --- a/bench/SkBenchmark.h +++ b/bench/SkBenchmark.h @@ -3,6 +3,7 @@ #include "SkRefCnt.h" #include "SkPoint.h" +#include "SkTDict.h" #include "SkTRegistry.h" class SkCanvas; @@ -10,7 +11,7 @@ class SkPaint; class SkBenchmark : public SkRefCnt { public: - SkBenchmark(); + SkBenchmark(void* defineDict); const char* getName(); SkIPoint getSize(); @@ -27,7 +28,9 @@ public: void setForceFilter(bool filter) { fForceFilter = filter; } - + + const char* findDefine(const char* key) const; + protected: void setupPaint(SkPaint* paint); @@ -37,6 +40,7 @@ protected: virtual SkIPoint onGetSize(); private: + const SkTDict* fDict; int fForceAlpha; bool fForceAA; bool fForceFilter; diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp index a4ed9f23dc..93ef1c5007 100644 --- a/bench/TextBench.cpp +++ b/bench/TextBench.cpp @@ -24,7 +24,8 @@ class TextBench : public SkBenchmark { SkString fName; enum { N = 300 }; public: - TextBench(const char text[], int ps, bool linearText, bool posText) { + TextBench(void* param, const char text[], int ps, bool linearText, + bool posText) : INHERITED(param) { fText.set(text); fPaint.setAntiAlias(true); @@ -97,14 +98,14 @@ private: #define SMALL 9 #define BIG 48 -static SkBenchmark* Fact0(void*) { return new TextBench(STR, SMALL, false, false); } -static SkBenchmark* Fact1(void*) { return new TextBench(STR, SMALL, false, true); } -static SkBenchmark* Fact2(void*) { return new TextBench(STR, SMALL, true, false); } -static SkBenchmark* Fact3(void*) { return new TextBench(STR, SMALL, true, true); } -static SkBenchmark* Fact4(void*) { return new TextBench(STR, BIG, false, false); } -static SkBenchmark* Fact5(void*) { return new TextBench(STR, BIG, false, true); } -static SkBenchmark* Fact6(void*) { return new TextBench(STR, BIG, true, false); } -static SkBenchmark* Fact7(void*) { return new TextBench(STR, BIG, true, true); } +static SkBenchmark* Fact0(void* p) { return new TextBench(p, STR, SMALL, false, false); } +static SkBenchmark* Fact1(void* p) { return new TextBench(p, STR, SMALL, false, true); } +static SkBenchmark* Fact2(void* p) { return new TextBench(p, STR, SMALL, true, false); } +static SkBenchmark* Fact3(void* p) { return new TextBench(p, STR, SMALL, true, true); } +static SkBenchmark* Fact4(void* p) { return new TextBench(p, STR, BIG, false, false); } +static SkBenchmark* Fact5(void* p) { return new TextBench(p, STR, BIG, false, true); } +static SkBenchmark* Fact6(void* p) { return new TextBench(p, STR, BIG, true, false); } +static SkBenchmark* Fact7(void* p) { return new TextBench(p, STR, BIG, true, true); } static BenchRegistry gReg0(Fact0); static BenchRegistry gReg1(Fact1); diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp index 501e86aaa4..8ccb373eb9 100644 --- a/bench/benchmain.cpp +++ b/bench/benchmain.cpp @@ -49,21 +49,23 @@ static bool equal(const SkBitmap& bm1, const SkBitmap& bm2) { class Iter { public: - Iter() { + Iter(void* param) { fBench = BenchRegistry::Head(); + fParam = param; } SkBenchmark* next() { if (fBench) { BenchRegistry::Factory f = fBench->factory(); fBench = fBench->next(); - return f(0); + return f(fParam); } return NULL; } private: const BenchRegistry* fBench; + void* fParam; }; static void make_filename(const char name[], SkString* path) { @@ -186,6 +188,7 @@ static int findConfig(const char config[]) { int main (int argc, char * const argv[]) { SkAutoGraphics ag; + SkTDict defineDict(1024); int repeatDraw = 1; int forceAlpha = 0xFF; bool forceAA = true; @@ -273,6 +276,14 @@ int main (int argc, char * const argv[]) { log_error("missing arg for -config\n"); return -1; } + } else if (strncmp(*argv, "-D", 2) == 0) { + argv++; + if (strlen(*argv) > 2 && argv < stop) { + defineDict.set(argv[-1] + 2, *argv); + } else { + log_error("incomplete '-Dfoo bar' definition\n"); + return -1; + } } else { SkString str; str.printf("unrecognized arg %s\n", *argv); @@ -281,7 +292,7 @@ int main (int argc, char * const argv[]) { } } - Iter iter; + Iter iter(&defineDict); SkBenchmark* bench; while ((bench = iter.next()) != NULL) { SkIPoint dim = bench->getSize();