]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/program.cpp
Rename VertexComponent to VertexAttribute
[libs/gl.git] / source / core / program.cpp
index 2a34feb32706c161c602a151c7217d47955aa4d2..7fff5859c1240ca724f8536f1d72e1e59e1511da 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,13 +78,19 @@ 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);
+#ifdef DEBUG
+       string diagnostics = compiler.get_diagnostics();
+       if(!diagnostics.empty())
+               IO::print("Program diagnostics:\n%s\n", diagnostics);
+#endif
 
        vector<SL::Stage::Type> stages = compiler.get_stages();
        for(vector<SL::Stage::Type>::const_iterator i=stages.begin(); i!=stages.end(); ++i)
@@ -158,9 +171,9 @@ void Program::bind_attribute(unsigned index, const string &name)
        glBindAttribLocation(id, index, name.c_str());
 }
 
-void Program::bind_attribute(VertexComponent comp, const string &name)
+void Program::bind_attribute(VertexAttribute attr, const string &name)
 {
-       bind_attribute(get_component_type(comp), name);
+       bind_attribute(get_attribute_semantic(attr), name);
 }
 
 void Program::bind_fragment_data(unsigned index, const string &name)
@@ -479,7 +492,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 +521,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