#define MSP_GL_PROGRAMDATA_H_
#include <stdexcept>
+#include <msp/core/noncopyable.h>
#include <msp/datafile/objectloader.h>
#include "datatype.h"
#include "matrix.h"
The class is optimized for an access pattern where the set of uniforms and
programs stays constants, with only the values changing.
*/
-class ProgramData
+class ProgramData: public NonCopyable
{
public:
class Loader: public DataFile::ObjectLoader<ProgramData>
mutable std::vector<ProgramBlock> programs;
mutable UniformBlock *last_buffer_block = 0;
mutable Buffer *buffer = 0;
+ bool streaming = false;
mutable Mask dirty = 0;
std::string debug_name;
public:
ProgramData(const Program * = 0);
- ProgramData(const ProgramData &);
- ProgramData(const ProgramData &, const Program *);
- ProgramData &operator=(const ProgramData &);
+ ProgramData(ProgramData &&);
~ProgramData();
private:
void mark_dirty(Mask);
public:
void uniform(Tag, int);
+ void uniform(Tag, unsigned);
void uniform(Tag, float);
void uniform(Tag, int, int);
+ void uniform(Tag, unsigned, unsigned);
void uniform(Tag, float, float);
void uniform2(Tag, const int *);
+ void uniform2(Tag, const unsigned *);
void uniform2(Tag, const float *);
void uniform(Tag, int, int, int);
+ void uniform(Tag, unsigned, unsigned, unsigned);
void uniform(Tag, float, float, float);
void uniform3(Tag, const int *);
+ void uniform3(Tag, const unsigned *);
void uniform3(Tag, const float *);
void uniform(Tag, int, int, int, int);
+ void uniform(Tag, unsigned, unsigned, unsigned, unsigned);
void uniform(Tag, float, float, float, float);
void uniform(Tag, const Color &);
void uniform4(Tag, const int *);
+ void uniform4(Tag, const unsigned *);
void uniform4(Tag, const float *);
void uniform_matrix2(Tag, const float *);
void uniform_matrix3x2(Tag, const float *);
void uniform(Tag, const Matrix &);
void uniform_matrix4(Tag, const float *);
void uniform_array(Tag, unsigned, const int *);
+ void uniform_array(Tag, unsigned, const unsigned *);
void uniform_array(Tag, unsigned, const float *);
void uniform1_array(Tag, unsigned, const int *);
+ void uniform1_array(Tag, unsigned, const unsigned *);
void uniform1_array(Tag, unsigned, const float *);
void uniform2_array(Tag, unsigned, const int *);
+ void uniform2_array(Tag, unsigned, const unsigned *);
void uniform2_array(Tag, unsigned, const float *);
void uniform3_array(Tag, unsigned, const int *);
+ void uniform3_array(Tag, unsigned, const unsigned *);
void uniform3_array(Tag, unsigned, const float *);
void uniform4_array(Tag, unsigned, const int *);
+ void uniform4_array(Tag, unsigned, const unsigned *);
void uniform4_array(Tag, unsigned, const float *);
void uniform_matrix2_array(Tag, unsigned, const float *);
void uniform_matrix3x2_array(Tag, unsigned, const float *);
std::vector<Tag> get_uniform_tags() const;
void copy_uniform(const ProgramData &, Tag);
+ void copy_uniforms(const ProgramData &);
private:
int find_uniform_index(Tag) const;
std::vector<ProgramBlock>::iterator get_program(const Program &) const;
+ void recreate_buffer() const;
void update_block_uniform_indices(SharedBlock &, const ReflectData::UniformBlockInfo &) const;
void update_block(SharedBlock &, const ReflectData::UniformBlockInfo &) const;
public:
/** Creates or updates UniformBlocks for a specific program if necessary,
then sets them to the PipelineState. */
- void apply(const Program &, PipelineState &) const;
+ void apply(const Program &, PipelineState &, unsigned) const;
void set_debug_name(const std::string &);
};