blob: 1f39c396c26146458ff082ff8fedaf67565ef254 [file] [log] [blame]
/*
* 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());
}
}
}
}