]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programdata.cpp
Get all blocks for the program before applying them
[libs/gl.git] / source / programdata.cpp
index 04fdd6b865053073435069696b968c5c90c48785..e1b4212e9d89588f78a42baf2d3e45d5a5a321db 100644 (file)
@@ -150,7 +150,7 @@ void ProgramData::uniform_matrix4_array(const string &name, unsigned n, const fl
        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)
        {
@@ -159,15 +159,7 @@ const UniformBlock &ProgramData::get_block(const Program &prog, const string &na
                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())
@@ -214,6 +206,14 @@ const UniformBlock &ProgramData::get_block(const Program &prog, const string &na
        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();
@@ -221,13 +221,24 @@ void ProgramData::apply() const
                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);
 }