+void DefaultUniformBlock::attach(const Program::UniformInfo &info, const Uniform &uni)
+{
+ if(info.block->bind_point>=0)
+ throw invalid_argument("DefaultUniformBlock::attach");
+
+ uniforms[info.location] = &uni;
+}
+
+void DefaultUniformBlock::attach(int index, const Uniform &uni)
+{
+ uniforms[index] = &uni;
+}
+
+void DefaultUniformBlock::apply(int index) const
+{
+ if(index>=0)
+ throw invalid_argument("DefaultUniformBlock::apply");
+
+ for(map<int, const Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+ i->second->apply(i->first);
+}
+
+
+BufferBackedUniformBlock::BufferBackedUniformBlock(unsigned s):