X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprogram.cpp;h=7fff5859c1240ca724f8536f1d72e1e59e1511da;hb=ea7832c7c1ffab00cc1168bc8c41375fdd0eae86;hp=2a34feb32706c161c602a151c7217d47955aa4d2;hpb=dccad64b2ec82249d850b9745614042171499972;p=libs%2Fgl.git diff --git a/source/core/program.cpp b/source/core/program.cpp index 2a34feb3..7fff5859 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,13 +78,19 @@ 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); +#ifdef DEBUG + string diagnostics = compiler.get_diagnostics(); + if(!diagnostics.empty()) + IO::print("Program diagnostics:\n%s\n", diagnostics); +#endif vector stages = compiler.get_stages(); for(vector::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(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 +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 &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