aboutsummaryrefslogtreecommitdiff
path: root/src/benchmark.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/benchmark.cpp')
-rw-r--r--src/benchmark.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/benchmark.cpp b/src/benchmark.cpp
new file mode 100644
index 0000000..1f39c39
--- /dev/null
+++ b/src/benchmark.cpp
@@ -0,0 +1,161 @@
+/*
+ * Copyright © 2011 Linaro Limited
+ *
+ * This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
+ *
+ * glmark2 is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * glmark2. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ * Alexandros Frantzis (glmark2)
+ */
+
+#include "benchmark.h"
+#include "log.h"
+#include "util.h"
+
+using std::string;
+using std::vector;
+using std::map;
+
+std::map<string, Scene *> Benchmark::sceneMap_;
+
+static Scene &
+get_scene_from_description(const string &s)
+{
+ vector<string> elems;
+
+ Util::split(s, ':', elems, Util::SplitModeNormal);
+
+ const string &name = !elems.empty() ? elems[0] : "";
+
+ return Benchmark::get_scene_by_name(name);
+}
+
+static vector<Benchmark::OptionPair>
+get_options_from_description(const string &s)
+{
+ vector<Benchmark::OptionPair> options;
+ vector<string> elems;
+
+ Util::split(s, ':', elems, Util::SplitModeNormal);
+
+ for (vector<string>::const_iterator iter = elems.begin() + 1;
+ iter != elems.end();
+ iter++)
+ {
+ vector<string> opt;
+
+ Util::split(*iter, '=', opt, Util::SplitModeNormal);
+ if (opt.size() == 2)
+ options.push_back(Benchmark::OptionPair(opt[0], opt[1]));
+ else
+ Log::info("Warning: ignoring invalid option string '%s' "
+ "in benchmark description\n",
+ iter->c_str());
+ }
+
+ return options;
+}
+
+void
+Benchmark::register_scene(Scene &scene)
+{
+ sceneMap_[scene.name()] = &scene;
+}
+
+Scene &
+Benchmark::get_scene_by_name(const string &name)
+{
+ map<string, Scene *>::const_iterator iter;
+
+ if ((iter = sceneMap_.find(name)) != sceneMap_.end())
+ return *(iter->second);
+ else
+ return Scene::dummy();
+}
+
+Benchmark::Benchmark(Scene &scene, const vector<OptionPair> &options) :
+ scene_(scene), options_(options)
+{
+}
+
+Benchmark::Benchmark(const string &name, const vector<OptionPair> &options) :
+ scene_(Benchmark::get_scene_by_name(name)), options_(options)
+{
+}
+
+Benchmark::Benchmark(const string &s) :
+ scene_(get_scene_from_description(s)),
+ options_(get_options_from_description(s))
+{
+}
+
+Scene &
+Benchmark::setup_scene()
+{
+ scene_.reset_options();
+ load_options();
+
+ scene_.load();
+ scene_.setup();
+
+ return scene_;
+}
+
+void
+Benchmark::teardown_scene()
+{
+ scene_.teardown();
+ scene_.unload();
+}
+
+bool
+Benchmark::needs_decoration() const
+{
+ for (vector<OptionPair>::const_iterator iter = options_.begin();
+ iter != options_.end();
+ iter++)
+ {
+ if ((iter->first == "show-fps" && iter->second == "true") ||
+ (iter->first == "title" && !iter->second.empty()))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void
+Benchmark::load_options()
+{
+ for (vector<OptionPair>::iterator iter = options_.begin();
+ iter != options_.end();
+ iter++)
+ {
+ if (!scene_.set_option(iter->first, iter->second)) {
+ map<string, Scene::Option>::const_iterator opt_iter = scene_.options().find(iter->first);
+
+ if (opt_iter == scene_.options().end()) {
+ Log::info("Warning: Scene '%s' doesn't accept option '%s'\n",
+ scene_.name().c_str(), iter->first.c_str());
+ }
+ else {
+ Log::info("Warning: Scene '%s' doesn't accept value '%s' for option '%s'\n",
+ scene_.name().c_str(), iter->second.c_str(), iter->first.c_str());
+ }
+ }
+ }
+}
+