--- /dev/null
+#ifndef MSP_GL_UNIFORMBLOCK_H_
+#define MSP_GL_UNIFORMBLOCK_H_
+
+#include <map>
+#include <vector>
+#include "bufferable.h"
+#include "program.h"
+#include "vector.h"
+
+namespace Msp {
+namespace GL {
+
+class BufferRange;
+class Matrix;
+class Uniform;
+struct Color;
+
+/**
+Stores uniforms with a specific layout. Both named and default uniform blocks
+are supported.
+*/
+class UniformBlock: public Bufferable
+{
+private:
+ std::map<int, const Uniform *> uniforms;
+ unsigned size;
+ std::vector<char> data;
+ mutable BufferRange *buf_range;
+
+ UniformBlock(const UniformBlock &);
+ UniformBlock &operator=(const UniformBlock &);
+public:
+ UniformBlock();
+ UniformBlock(unsigned);
+ ~UniformBlock();
+
+private:
+ virtual unsigned get_data_size() const { return size; }
+ virtual const void *get_data_pointer() const { return &data[0]; }
+ virtual unsigned get_alignment() const;
+ virtual void location_changed(Buffer *, unsigned, unsigned) const;
+
+public:
+ void attach(int, const Uniform &);
+ void attach(const Program::UniformInfo &, const Uniform &);
+
+ void apply(int) const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif