+void ProgramData::find_uniforms_for_block(Block &block, const Program::UniformBlockInfo &info) const
+{
+ block.uniforms.clear();
+ for(vector<const Program::UniformInfo *>::const_iterator i=info.uniforms.begin(); i!=info.uniforms.end(); ++i)
+ {
+ // XXX individual array elements
+ UniformMap::const_iterator j = uniforms.find((*i)->name);
+ if(j!=uniforms.end())
+ block.uniforms[(*i)->location] = &j->second;
+ }
+}
+
+UniformBlock *ProgramData::create_block(const Program::UniformBlockInfo &info) const
+{
+ UniformBlock *block = new UniformBlock(info.data_size);
+ if(!buffer)
+ {
+ buffer = new Buffer(UNIFORM_BUFFER);
+ buffer->set_usage(STREAM_DRAW);
+ }
+ block->use_buffer(buffer, last_block);
+ last_block = block;
+ return block;
+}
+
+const UniformBlock *ProgramData::get_block(const Program &prog, const Program::UniformBlockInfo *info) const