]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/program.cpp
Add interfaces for using specialization constants with Programs
[libs/gl.git] / source / core / program.cpp
index 2a34feb32706c161c602a151c7217d47955aa4d2..9ef5d6d7eebbf4eef2173b0b33abaec28379c37e 100644 (file)
@@ -55,6 +55,13 @@ Program::Program(const string &vert, const string &frag)
        link();
 }
 
+Program::Program(const Module &mod, const map<string, int> &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<string, int> &spec_values)
 {
        module = &mod;
 
        SL::Compiler compiler;
        compiler.set_source(module->get_prepared_source(), "<module>");
+       compiler.specialize(spec_values);
        compiler.compile(SL::Compiler::PROGRAM);
 
        vector<SL::Stage::Type> 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<Module>(n));
+       map<string, int> spec_values;
+       SpecializationLoader ldr(spec_values);
+       load_sub_with(ldr);
+       obj.add_stages(get_collection().get<Module>(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<string, int> &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