+class UniformBlock: public NonCopyable
+{
+protected:
+ UniformBlock() { }
+public:
+ virtual ~UniformBlock() { }
+
+ virtual void attach(const Program::UniformInfo &, const Uniform &) = 0;
+ virtual void apply(int) const = 0;
+};
+
+/** Stores uniforms for the default uniform block. Uniforms are associated
+with locations, as returned by Program::get_uniform_location. */
+class DefaultUniformBlock: public UniformBlock
+{
+private:
+ std::vector<const Uniform *> uniforms;
+
+public:
+ DefaultUniformBlock();
+
+ virtual void attach(const Program::UniformInfo &, const Uniform &);
+ void attach(int, const Uniform &);
+ virtual void apply(int) const;
+};
+
+/** Stores uniforms for a buffer-backed uniform block. Uniform values are
+stored in a memory block which can be uploaded into a buffer and bound for use
+by a Program. */
+class BufferBackedUniformBlock: public UniformBlock, public Bufferable