Index: bench/benchmain.cpp |
diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp |
index 12c982037ea090bc72c62b9f9ad46ecc4691b644..6ee841a9568493bac53b2b4b079c476e813a31c7 100644 |
--- a/bench/benchmain.cpp |
+++ b/bench/benchmain.cpp |
@@ -14,6 +14,7 @@ |
#include "SkColorPriv.h" |
#include "SkCommandLineFlags.h" |
#include "SkDeferredCanvas.h" |
+#include "SkGMBench.h" |
#include "SkGraphics.h" |
#include "SkImageEncoder.h" |
#include "SkOSFile.h" |
@@ -32,6 +33,56 @@ class GrContext; |
#include <limits> |
+class AutoUnrefArray { |
reed1
2014/02/03 13:20:42
Does this need a new class from scratch? Can you u
bsalomon
2014/02/03 14:02:45
Done. Inherited in order to override the destructo
|
+public: |
+ AutoUnrefArray() {} |
+ ~AutoUnrefArray() { |
+ int count = fObjs.count(); |
+ for (int i = 0; i < count; ++i) { |
+ fObjs[i]->unref(); |
+ } |
+ } |
+ const SkRefCnt*& push_back() { return *fObjs.append(); } |
+ |
+private: |
+ SkTDArray<const SkRefCnt*> fObjs; |
+}; |
+ |
+class GMBenchFactory : public SkBenchmarkFactory { |
+public: |
+ GMBenchFactory(const skiagm::GMRegistry* gmreg) |
+ : fGMFactory(gmreg->factory()) |
+ , fSelfRegistry(this) { |
+ } |
+ |
+ virtual SkBenchmark* operator()() const SK_OVERRIDE { |
+ skiagm::GM* gm = fGMFactory(NULL); |
+ return new SkGMBench(gm); |
+ } |
+ |
+private: |
+ skiagm::GMRegistry::Factory fGMFactory; |
+ BenchRegistry fSelfRegistry; |
+}; |
+ |
+static void register_gm_benches() { |
+ static bool gOnce; |
+ static AutoUnrefArray gUnreffer; |
+ |
+ if (!gOnce) { |
+ const skiagm::GMRegistry* gmreg = skiagm::GMRegistry::Head(); |
+ while (gmreg) { |
+ skiagm::GM* gm = gmreg->factory()(NULL); |
+ if (NULL != gm && skiagm::GM::kAsBench_Flag & gm->getFlags()) { |
+ gUnreffer.push_back() = SkNEW_ARGS(GMBenchFactory, (gmreg)); |
+ } |
+ SkDELETE(gm); |
+ gmreg = gmreg->next(); |
+ } |
+ gOnce = true; |
+ } |
+} |
+ |
enum BenchMode { |
kNormal_BenchMode, |
kDeferred_BenchMode, |
@@ -63,7 +114,7 @@ public: |
if (fBench) { |
BenchRegistry::Factory f = fBench->factory(); |
fBench = fBench->next(); |
- return f(); |
+ return (*f)(); |
} |
return NULL; |
} |
@@ -295,6 +346,7 @@ static bool HasConverged(double prevPerLoop, double currPerLoop, double currRaw) |
int tool_main(int argc, char** argv); |
int tool_main(int argc, char** argv) { |
+ register_gm_benches(); |
SkCommandLineFlags::Parse(argc, argv); |
#if SK_ENABLE_INST_COUNT |
if (FLAGS_leaks) { |