#ifndef MSP_GL_UNIFORMBLOCK_H_
#define MSP_GL_UNIFORMBLOCK_H_
-#include <map>
#include <vector>
+#include <msp/core/noncopyable.h>
#include "bufferable.h"
-#include "program.h"
-#include "vector.h"
+#include "reflectdata.h"
+#include "uniformblock_backend.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.
+Stores uniform values in a block of memory.
+
+For named uniform blocks the values are stored according to the reflected
+layout of the block, ready for use by shaders. For the default uniform block,
+the location of the uniform is multiplied by 16 to obtain the memory offset.
+
+Applications normally don't need to deal with UniformBlocks directly. They're
+managed by the ProgramData class, which provides a higher-level interface for
+setting uniform values.
*/
-class UniformBlock: public Bufferable
+class UniformBlock: public UniformBlockBackend, 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();
+ UniformBlock(const ReflectData::UniformBlockInfo &);
-private:
- virtual unsigned get_data_size() const { return size; }
+ virtual std::size_t get_data_size() const { return data.size(); }
virtual const void *get_data_pointer() const { return &data[0]; }
- virtual unsigned get_alignment() const;
- virtual void location_changed(Buffer *, unsigned, unsigned) const;
+private:
+ virtual std::size_t get_alignment() const;
public:
- void attach(int, const Uniform &);
- void attach(const Program::UniformInfo &, const Uniform &);
-
- void apply(int) const;
+ void store(const ReflectData::UniformInfo &, std::size_t, const void *);
+ void check_store_range(std::size_t, std::size_t);
};
} // namespace GL