X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprogram.cpp;h=e4250b6c05739b52d8f1e339db7c188ffac35aad;hb=3efe3bab1c8290bd49a957ebec0ad97e58a35fcf;hp=471803c5b4ab0edfefcfe9253dafd42cca95f0a5;hpb=d8d4c2aeaf109ab7ba55888bef5364fe11b5b02d;p=libs%2Fgl.git diff --git a/source/core/program.cpp b/source/core/program.cpp index 471803c5..e4250b6c 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -33,14 +33,13 @@ void Program::add_stages(const Module &mod, const map &spec_values) reflect_data = ReflectData(); const Module *final_module = &mod; - TransientData transient; switch(mod.get_format()) { case Module::GLSL: - add_glsl_stages(static_cast(mod), spec_values, transient); + add_glsl_stages(static_cast(mod), spec_values); break; case Module::SPIR_V: - if(!spec_values.empty()) + if(static_cast(mod).is_specializable()) { specialized_spirv = static_cast(mod).specialize(spec_values); final_module = specialized_spirv; @@ -51,8 +50,6 @@ void Program::add_stages(const Module &mod, const map &spec_values) throw invalid_argument("Program::add_stages"); } - finalize(*final_module, transient); - if(final_module->get_format()==Module::SPIR_V) { const SpirVModule &spirv_mod = *static_cast(final_module); @@ -63,6 +60,8 @@ void Program::add_stages(const Module &mod, const map &spec_values) finalize_uniforms(); + reflect_data.update_used_bindings(); + for(const ReflectData::UniformInfo &u: reflect_data.uniforms) require_type(u.type); for(const ReflectData::AttributeInfo &a: reflect_data.attributes) @@ -252,6 +251,12 @@ int Program::get_uniform_binding(Tag tag) const return i!=reflect_data.uniforms.end() && i->tag==tag ? i->binding : -1; } +bool Program::uses_binding(int binding) const +{ + auto i = lower_bound(reflect_data.used_bindings, binding); + return i!=reflect_data.used_bindings.end() && *i==binding; +} + const ReflectData::AttributeInfo &Program::get_attribute_info(const string &name) const { auto i = lower_bound_member(reflect_data.attributes, name, &ReflectData::AttributeInfo::name);