X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fprogram.cpp;h=4b53b8fe2f28e7e812e605654d6d7d64ec695aeb;hb=ddb8e4ceea602d90ca7d9dc2637b9285610787bd;hp=ed4eb6619fa903b4911b955140d90648f6477feb;hpb=6c8e599159ea8d954cb78bccb3580160a07a76a8;p=libs%2Fgl.git diff --git a/source/core/program.cpp b/source/core/program.cpp index ed4eb661..4b53b8fe 100644 --- a/source/core/program.cpp +++ b/source/core/program.cpp @@ -277,6 +277,8 @@ void Program::link() throw invalid_operation("Program::link"); uniforms.clear(); + uniform_blocks.clear(); + attributes.clear(); glLinkProgram(id); linked = get_program_i(id, GL_LINK_STATUS); @@ -358,8 +360,6 @@ void Program::query_uniforms() void Program::query_uniform_blocks(const vector &uniforms_by_index) { - uniform_blocks.clear(); - std::set used_bind_points; unsigned count = get_program_i(id, GL_ACTIVE_UNIFORM_BLOCKS); for(unsigned i=0; i &uniforms_by_inde uniforms_by_index[*j]->block = &info; } - vector indices2(indices.begin(), indices.end()); + vector query_indices(indices.begin(), indices.end()); vector values(indices.size()); - glGetActiveUniformsiv(id, indices.size(), &indices2[0], GL_UNIFORM_OFFSET, &values[0]); + glGetActiveUniformsiv(id, query_indices.size(), &query_indices[0], GL_UNIFORM_OFFSET, &values[0]); for(unsigned j=0; jlocation = values[j]; + uniforms_by_index[indices[j]]->offset = values[j]; - indices2.clear(); + query_indices.clear(); for(vector::iterator j=indices.begin(); j!=indices.end(); ++j) if(uniforms_by_index[*j]->array_size>1) - indices2.push_back(*j); - if(!indices2.empty()) + query_indices.push_back(*j); + if(!query_indices.empty()) { - glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_ARRAY_STRIDE, &values[0]); - for(unsigned j=0; jarray_stride = values[j]; + glGetActiveUniformsiv(id, query_indices.size(), &query_indices[0], GL_UNIFORM_ARRAY_STRIDE, &values[0]); + for(unsigned j=0; jarray_stride = values[j]; } - indices2.clear(); + query_indices.clear(); for(vector::iterator j=indices.begin(); j!=indices.end(); ++j) { DataType t = uniforms_by_index[*j]->type; if(is_matrix(t)) - indices2.push_back(*j); + query_indices.push_back(*j); } - if(!indices2.empty()) + if(!query_indices.empty()) { - glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_MATRIX_STRIDE, &values[0]); - for(unsigned j=0; jmatrix_stride = values[j]; + glGetActiveUniformsiv(id, query_indices.size(), &query_indices[0], GL_UNIFORM_MATRIX_STRIDE, &values[0]); + for(unsigned j=0; jmatrix_stride = values[j]; } sort(info.uniforms.begin(), info.uniforms.end(), uniform_location_compare); @@ -495,15 +495,16 @@ void Program::collect_block_uniforms(UniformBlockInfo &block, const SpirVModule: { for(vector::const_iterator i=strct.members.begin(); i!=strct.members.end(); ++i) { + unsigned offset = base_offset+i->offset; if(i->struct_type) { if(i->array_size) { - for(unsigned j=0; jarray_size; ++j) - collect_block_uniforms(block, *i->struct_type, format("%s%s[%d].", prefix, i->name, j), base_offset+i->offset+i->array_stride*j); + for(unsigned j=0; jarray_size; ++j, offset+=i->array_stride) + collect_block_uniforms(block, *i->struct_type, format("%s%s[%d].", prefix, i->name, j), offset); } else - collect_block_uniforms(block, *i->struct_type, prefix+i->name+".", base_offset+i->offset); + collect_block_uniforms(block, *i->struct_type, prefix+i->name+".", offset); } else { @@ -511,7 +512,7 @@ void Program::collect_block_uniforms(UniformBlockInfo &block, const SpirVModule: UniformInfo &info = uniforms[name]; info.name = name; info.block = █ - info.location = i->offset; + info.offset = offset; info.array_size = i->array_size; info.array_stride = i->array_stride; info.matrix_stride = i->matrix_stride; @@ -533,6 +534,7 @@ void Program::collect_attributes() if((*j)->storage==SpirVModule::INPUT) { AttributeInfo &info = attributes[(*j)->name]; + info.name = (*j)->name; info.location = (*j)->location; info.array_size = (*j)->array_size; info.type = (*j)->type; @@ -580,12 +582,12 @@ const Program::UniformInfo &Program::get_uniform_info(const string &name) const return get_item(uniforms, name); } -int Program::get_uniform_location(const string &n) const +int Program::get_uniform_location(const string &name) const { - if(n[n.size()-1]==']') + if(name[name.size()-1]==']') throw invalid_argument("Program::get_uniform_location"); - UniformMap::const_iterator i = uniforms.find(n); + UniformMap::const_iterator i = uniforms.find(name); if(i==uniforms.end()) return -1; @@ -597,12 +599,12 @@ const Program::AttributeInfo &Program::get_attribute_info(const string &name) co return get_item(attributes, name); } -int Program::get_attribute_location(const string &n) const +int Program::get_attribute_location(const string &name) const { - if(n[n.size()-1]==']') + if(name[name.size()-1]==']') throw invalid_argument("Program::get_attribute_location"); - AttributeMap::const_iterator i = attributes.find(n); + AttributeMap::const_iterator i = attributes.find(name); return i!=attributes.end() ? i->second.location : -1; } @@ -628,7 +630,7 @@ void Program::unbind() Program::UniformInfo::UniformInfo(): block(0), - location(0), + location(-1), array_size(0), array_stride(0), matrix_stride(0),