uniform(name, new UniformArray<UniformMatrix4x4f>(n, v));
}
-const UniformBlock &ProgramData::get_block(const Program &prog, const string &name) const
+const UniformBlock &ProgramData::get_block(const Program &prog, const Program::UniformBlockInfo *info) const
{
if(modified)
{
modified = false;
}
- const Program::UniformBlockInfo *info = 0;
- unsigned layout_hash;
- if(!name.empty())
- {
- info = &prog.get_uniform_block_info(name);
- layout_hash = info->layout_hash;
- }
- else
- layout_hash = prog.get_uniform_layout_hash();
+ unsigned layout_hash = (info ? info->layout_hash : prog.get_uniform_layout_hash());
map<unsigned, Block>::iterator i = blocks.find(layout_hash);
if(i==blocks.end())
return block;
}
+const UniformBlock &ProgramData::get_block(const Program &prog, const string &name) const
+{
+ if(name.empty())
+ return get_block(prog, 0);
+ else
+ return get_block(prog, &prog.get_uniform_block_info(name));
+}
+
void ProgramData::apply() const
{
const Program *prog = Program::current();
throw invalid_operation("ProgramData::apply");
const Program::UniformBlockMap &prog_blocks = prog->get_uniform_blocks();
- for(Program::UniformBlockMap::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i)
+ if(!prog_blocks.empty())
{
- const UniformBlock &block = get_block(*prog, i->second.name);
- block.apply(i->second.bind_point);
+ typedef pair<const UniformBlock *, unsigned> ApplyBlock;
+ list<ApplyBlock> apply_blocks;
+ for(Program::UniformBlockMap::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i)
+ {
+ const UniformBlock &block = get_block(*prog, &i->second);
+ apply_blocks.push_back(make_pair(&block, i->second.bind_point));
+ }
+
+ if(buffer)
+ buffer->bind();
+
+ for(list<ApplyBlock>::const_iterator i=apply_blocks.begin(); i!=apply_blocks.end(); ++i)
+ i->first->apply(i->second);
}
- const UniformBlock &block = get_block(*prog, string());
+ const UniformBlock &block = get_block(*prog, 0);
block.apply(-1);
}