Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Unified Diff: bench/benchmain.cpp

Issue 151843002: Allow GMs ato be used as benchmarks. Make convex_poly_clip opt in. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Make inheritance private, use SkNEW_ARGS() Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: bench/benchmain.cpp
diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp
index 12c982037ea090bc72c62b9f9ad46ecc4691b644..8ec1359117c9dfd5036d61897d7b028e8dde0221 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,53 @@ class GrContext;
#include <limits>
+// Note that ~SkTDArray is not virtual. This inherits privately to bar using this as a SkTDArray*.
+class RefCntArray : private SkTDArray<SkRefCnt*> {
+public:
+ RefCntArray() {}
reed1 2014/02/03 14:09:57 nit: do you even need this empty constructor?
bsalomon 2014/02/03 14:34:29 Done.
+ SkRefCnt** append() { return this->INHERITED::append(); }
+ ~RefCntArray() { this->unrefAll(); }
+private:
+ typedef SkTDArray<SkRefCnt*> INHERITED;
+};
+
+class GMBenchFactory : public SkBenchmarkFactory {
+public:
+ GMBenchFactory(const skiagm::GMRegistry* gmreg)
+ : fGMFactory(gmreg->factory()) {
+ fSelfRegistry = SkNEW_ARGS(BenchRegistry, (this));
+ }
+
+ virtual ~GMBenchFactory() { SkDELETE(fSelfRegistry); }
+
+ virtual SkBenchmark* operator()() const SK_OVERRIDE {
+ skiagm::GM* gm = fGMFactory(NULL);
+ return SkNEW_ARGS(SkGMBench, (gm));
+ }
+
+private:
+ skiagm::GMRegistry::Factory fGMFactory;
+ BenchRegistry* fSelfRegistry;
+};
+
+static void register_gm_benches() {
+ static bool gOnce;
+ static RefCntArray gGMBenchFactories;
+
+ 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()) {
+ *gGMBenchFactories.append() = SkNEW_ARGS(GMBenchFactory, (gmreg));
+ }
+ SkDELETE(gm);
+ gmreg = gmreg->next();
+ }
+ gOnce = true;
+ }
+}
+
enum BenchMode {
kNormal_BenchMode,
kDeferred_BenchMode,
@@ -63,7 +111,7 @@ public:
if (fBench) {
BenchRegistry::Factory f = fBench->factory();
fBench = fBench->next();
- return f();
+ return (*f)();
}
return NULL;
}
@@ -295,6 +343,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) {
« bench/SkGMBench.cpp ('K') | « bench/SkGMBench.cpp ('k') | gm/convexpolyclip.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698