namespace GL {
ProgramData::ProgramData(const Program *p):
- tied_program(p),
- generation(0),
- last_buffer_block(0),
- buffer(0),
- dirty(0)
+ tied_program(p)
{ }
-// Blocks are intentionally left uncopied
-ProgramData::ProgramData(const ProgramData &other):
+ProgramData::ProgramData(ProgramData &&other):
tied_program(other.tied_program),
- uniforms(other.uniforms),
- uniform_data(other.uniform_data),
+ uniforms(move(other.uniforms)),
+ uniform_data(move(other.uniform_data)),
generation(other.generation),
- last_buffer_block(0),
- buffer(0),
- dirty(0)
-{ }
-
-ProgramData::ProgramData(const ProgramData &other, const Program *p):
- tied_program(p),
- last_buffer_block(0),
- buffer(0),
- dirty(0)
+ blocks(move(other.blocks)),
+ programs(move(other.programs)),
+ last_buffer_block(other.last_buffer_block),
+ buffer(other.buffer),
+ dirty(other.dirty),
+ debug_name(move(other.debug_name))
{
- if(tied_program)
- {
- for(const TaggedUniform &u: other.uniforms)
- validate_tag(u.tag);
- }
-
- uniforms = other.uniforms;
- uniform_data = other.uniform_data;
-}
-
-ProgramData &ProgramData::operator=(const ProgramData &other)
-{
- tied_program = other.tied_program;
-
- uniforms = other.uniforms;
- uniform_data = other.uniform_data;
-
- for(SharedBlock &b: blocks)
- delete b.block;
- blocks.clear();
- programs.clear();
-
- last_buffer_block = 0;
- buffer = 0;
- dirty = 0;
-
- return *this;
+ other.blocks.clear();
+ other.buffer = 0;
}
ProgramData::~ProgramData()
uniform(tag, INT, 1, &v);
}
+void ProgramData::uniform(Tag tag, unsigned v)
+{
+ uniform(tag, UNSIGNED_INT, 1, &v);
+}
+
void ProgramData::uniform(Tag tag, float v)
{
uniform(tag, FLOAT, 1, &v);
uniform2(tag, va);
}
+void ProgramData::uniform(Tag tag, unsigned v0, unsigned v1)
+{
+ unsigned va[2] = { v0, v1 };
+ uniform2(tag, va);
+}
+
void ProgramData::uniform(Tag tag, float v0, float v1)
{
float va[2] = { v0, v1 };
uniform(tag, INT_VEC2, 1, v);
}
+void ProgramData::uniform2(Tag tag, const unsigned *v)
+{
+ uniform(tag, UINT_VEC2, 1, v);
+}
+
void ProgramData::uniform2(Tag tag, const float *v)
{
uniform(tag, FLOAT_VEC2, 1, v);
uniform3(tag, va);
}
+void ProgramData::uniform(Tag tag, unsigned v0, unsigned v1, unsigned v2)
+{
+ unsigned va[3] = { v0, v1, v2 };
+ uniform3(tag, va);
+}
+
void ProgramData::uniform(Tag tag, float v0, float v1, float v2)
{
float va[3] = { v0, v1, v2 };
uniform(tag, INT_VEC3, 1, v);
}
+void ProgramData::uniform3(Tag tag, const unsigned *v)
+{
+ uniform(tag, UINT_VEC3, 1, v);
+}
+
void ProgramData::uniform3(Tag tag, const float *v)
{
uniform(tag, FLOAT_VEC3, 1, v);
uniform4(tag, va);
}
+void ProgramData::uniform(Tag tag, unsigned v0, unsigned v1, unsigned v2, unsigned v3)
+{
+ unsigned va[4] = { v0, v1, v2, v3 };
+ uniform4(tag, va);
+}
+
void ProgramData::uniform(Tag tag, float v0, float v1, float v2, float v3)
{
float va[4] = { v0, v1, v2, v3 };
uniform(tag, INT_VEC4, 1, v);
}
+void ProgramData::uniform4(Tag tag, const unsigned *v)
+{
+ uniform(tag, UINT_VEC4, 1, v);
+}
+
void ProgramData::uniform4(Tag tag, const float *v)
{
uniform(tag, FLOAT_VEC4, 1, v);
uniform(tag, INT, n, v);
}
+void ProgramData::uniform_array(Tag tag, unsigned n, const unsigned *v)
+{
+ uniform(tag, UNSIGNED_INT, n, v);
+}
+
void ProgramData::uniform_array(Tag tag, unsigned n, const float *v)
{
uniform(tag, FLOAT, n, v);
uniform(tag, INT, n, v);
}
+void ProgramData::uniform1_array(Tag tag, unsigned n, const unsigned *v)
+{
+ uniform(tag, UNSIGNED_INT, n, v);
+}
+
void ProgramData::uniform1_array(Tag tag, unsigned n, const float *v)
{
uniform(tag, FLOAT, n, v);
uniform(tag, INT_VEC2, n, v);
}
+void ProgramData::uniform2_array(Tag tag, unsigned n, const unsigned *v)
+{
+ uniform(tag, UINT_VEC2, n, v);
+}
+
void ProgramData::uniform2_array(Tag tag, unsigned n, const float *v)
{
uniform(tag, FLOAT_VEC2, n, v);
uniform(tag, INT_VEC3, n, v);
}
+void ProgramData::uniform3_array(Tag tag, unsigned n, const unsigned *v)
+{
+ uniform(tag, INT_VEC3, n, v);
+}
+
void ProgramData::uniform3_array(Tag tag, unsigned n, const float *v)
{
uniform(tag, FLOAT_VEC3, n, v);
uniform(tag, INT_VEC4, n, v);
}
+void ProgramData::uniform4_array(Tag tag, unsigned n, const unsigned *v)
+{
+ uniform(tag, UINT_VEC4, n, v);
+}
+
void ProgramData::uniform4_array(Tag tag, unsigned n, const float *v)
{
uniform(tag, FLOAT_VEC4, n, v);
uniform(tag, tu.type, tu.array_size, source.uniform_data.data()+tu.data_offset);
}
+void ProgramData::copy_uniforms(const ProgramData &source)
+{
+ for(const TaggedUniform &u: source.uniforms)
+ uniform(u.tag, u.type, u.array_size, source.uniform_data.data()+u.data_offset);
+}
+
int ProgramData::find_uniform_index(Tag tag) const
{
auto i = lower_bound_member(uniforms, tag, &TaggedUniform::tag);
#endif
}
- buffer->storage(required_size);
+ buffer->storage(required_size, STREAMING);
}
}
}
}
-ProgramData::TaggedUniform::TaggedUniform():
- type(VOID),
- array_size(0),
- data_offset(0),
- data_size(0)
-{ }
-
-
ProgramData::SharedBlock::SharedBlock(ReflectData::LayoutHash h):
block_hash(h),
used(0),