X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprogram.cpp;h=9ef5d6d7eebbf4eef2173b0b33abaec28379c37e;hb=0912a8d73043961ab7a4d66cd2fbb13187483ffd;hp=2a34feb32706c161c602a151c7217d47955aa4d2;hpb=6288c42adde9ee7d39a47de51fa2856cf965dccc;p=libs%2Fgl.git diff --git a/source/core/program.cpp b/source/core/program.cpp index 2a34feb3..9ef5d6d7 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -55,6 +55,13 @@ Program::Program(const string &vert, const string &frag) link(); } +Program::Program(const Module &mod, const map &spec_values) +{ + init(); + add_stages(mod, spec_values); + link(); +} + void Program::init() { static Require _req(ARB_shader_objects); @@ -71,12 +78,13 @@ Program::~Program() glDeleteProgram(id); } -void Program::add_stages(const Module &mod) +void Program::add_stages(const Module &mod, const map &spec_values) { module = &mod; SL::Compiler compiler; compiler.set_source(module->get_prepared_source(), ""); + compiler.specialize(spec_values); compiler.compile(SL::Compiler::PROGRAM); vector stages = compiler.get_stages(); @@ -479,7 +487,10 @@ void Program::Loader::finish() void Program::Loader::module(const string &n) { - obj.add_stages(get_collection().get(n)); + map spec_values; + SpecializationLoader ldr(spec_values); + load_sub_with(ldr); + obj.add_stages(get_collection().get(n), spec_values); } #pragma GCC diagnostic push @@ -505,5 +516,30 @@ void Program::Loader::vertex_shader(const string &src) } #pragma GCC diagnostic pop + +DataFile::Loader::ActionMap Program::SpecializationLoader::shared_actions; + +Program::SpecializationLoader::SpecializationLoader(map &sv): + spec_values(sv) +{ + set_actions(shared_actions); +} + +void Program::SpecializationLoader::init_actions() +{ + add("specialize", &SpecializationLoader::specialize_bool); + add("specialize", &SpecializationLoader::specialize_int); +} + +void Program::SpecializationLoader::specialize_bool(const string &name, bool value) +{ + spec_values[name] = value; +} + +void Program::SpecializationLoader::specialize_int(const string &name, int value) +{ + spec_values[name] = value; +} + } // namespace GL } // namespace Msp