X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fprogramdata.cpp;h=fc9b30a99e14b5011eba96d426f555a5467012f1;hp=43bcbf3febea57702fb6be343818b01d9d472325;hb=6080120777fdf7b6e1184288eff9d205ca7ebf5f;hpb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14 diff --git a/source/render/programdata.cpp b/source/render/programdata.cpp index 43bcbf3f..fc9b30a9 100644 --- a/source/render/programdata.cpp +++ b/source/render/programdata.cpp @@ -17,57 +17,23 @@ namespace Msp { 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() @@ -159,6 +125,11 @@ void ProgramData::uniform(Tag tag, int v) 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); @@ -170,6 +141,12 @@ void ProgramData::uniform(Tag tag, int v0, int v1) 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 }; @@ -181,6 +158,11 @@ void ProgramData::uniform2(Tag tag, const int *v) 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); @@ -192,6 +174,12 @@ void ProgramData::uniform(Tag tag, int v0, int v1, int v2) 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 }; @@ -203,6 +191,11 @@ void ProgramData::uniform3(Tag tag, const int *v) 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); @@ -214,6 +207,12 @@ void ProgramData::uniform(Tag tag, int v0, int v1, int v2, int v3) 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 }; @@ -230,6 +229,11 @@ void ProgramData::uniform4(Tag tag, const int *v) 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); @@ -290,6 +294,11 @@ void ProgramData::uniform_array(Tag tag, unsigned n, const int *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); @@ -300,6 +309,11 @@ void ProgramData::uniform1_array(Tag tag, unsigned n, const int *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); @@ -310,6 +324,11 @@ void ProgramData::uniform2_array(Tag tag, unsigned n, const int *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); @@ -320,6 +339,11 @@ void ProgramData::uniform3_array(Tag tag, unsigned n, const int *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); @@ -330,6 +354,11 @@ void ProgramData::uniform4_array(Tag tag, unsigned n, const int *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); @@ -413,6 +442,12 @@ void ProgramData::copy_uniform(const ProgramData &source, Tag tag) 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); @@ -621,7 +656,7 @@ vector::const_iterator ProgramData::prepare_program(c #endif } - buffer->storage(required_size); + buffer->storage(required_size, STREAMING); } } }