diff options
Diffstat (limited to 'src/benchmark.cpp')
-rw-r--r-- | src/benchmark.cpp | 161 |
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()); + } + } + } +} + |