X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprogram.cpp;h=9193cd7be155b54a4f8b1fc8a87de974cc3d72b4;hb=2e6e6fd559010aad6ae0d44c433e32acb387e8b9;hp=6458b4779d396ae3fe5072f4ec9381c1ba4b05e3;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/core/program.cpp b/source/core/program.cpp index 6458b477..9193cd7b 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -17,6 +17,8 @@ void Program::add_stages(const Module &mod, const map &spec_values) if(has_stages()) throw invalid_operation("Program::add_stages"); + reflect_data = ReflectData(); + TransientData transient; switch(mod.get_format()) { @@ -30,22 +32,23 @@ void Program::add_stages(const Module &mod, const map &spec_values) throw invalid_argument("Program::add_stages"); } - reflect_data = ReflectData(); + finalize(mod, transient); - finalize(mod); - - if(mod.get_format()==Module::GLSL) - { - query_uniforms(); - query_attributes(); - apply_bindings(transient); - } - else if(mod.get_format()==Module::SPIR_V) + if(mod.get_format()==Module::SPIR_V) { collect_uniforms(static_cast(mod), transient.spec_values); collect_attributes(static_cast(mod)); } + finalize_uniforms(); + + for(ReflectData::UniformBlockInfo &b: reflect_data.uniform_blocks) + if(!b.data_size && !b.uniforms.empty()) + { + const ReflectData::UniformInfo &uni = *b.uniforms.back(); + b.data_size = uni.location*16+uni.array_size*get_type_size(uni.type); + } + for(const ReflectData::UniformInfo &u: reflect_data.uniforms) require_type(u.type); for(const ReflectData::AttributeInfo &a: reflect_data.attributes) @@ -166,6 +169,20 @@ void Program::collect_attributes(const SpirVModule &mod) } } +void Program::collect_builtins(const SpirVModule &mod) +{ + for(const SpirVModule::Variable &v: mod.get_variables()) + if(v.storage==SpirVModule::OUTPUT && v.struct_type) + collect_builtins(*v.struct_type); +} + +void Program::collect_builtins(const SpirVModule::Structure &strct) +{ + for(const SpirVModule::StructMember &m: strct.members) + if(m.builtin==SpirVModule::CLIP_DISTANCE) + reflect_data.n_clip_distances = m.array_size; +} + const ReflectData::UniformBlockInfo &Program::get_uniform_block_info(const string &name) const { auto i = find_member(reflect_data.uniform_blocks, name, &ReflectData::UniformBlockInfo::name);