X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fprogramdata.cpp;h=272489bb585f0d9536dd94653b0b8fb039b42fea;hb=3f5e469de3454aee1d1923045fc713329a32cc18;hp=b63ad60e3e5138e908ac9781d129ce27f016c144;hpb=498d96d4da75d7b3f34587c25a8b35cc80978d43;p=libs%2Fgl.git diff --git a/source/render/programdata.cpp b/source/render/programdata.cpp index b63ad60e..272489bb 100644 --- a/source/render/programdata.cpp +++ b/source/render/programdata.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -32,7 +33,7 @@ ProgramData::ProgramData(const ProgramData &other): buffer(0), dirty(0) { - for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) + for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) i->value = i->value->clone(); } @@ -44,12 +45,12 @@ ProgramData::ProgramData(const ProgramData &other, const Program *p): { if(tied_program) { - for(vector::const_iterator i=other.uniforms.begin(); i!=other.uniforms.end(); ++i) - validate_name(i->name); + for(vector::const_iterator i=other.uniforms.begin(); i!=other.uniforms.end(); ++i) + validate_tag(i->tag); } uniforms = other.uniforms; - for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) + for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) i->value = i->value->clone(); } @@ -58,7 +59,7 @@ ProgramData &ProgramData::operator=(const ProgramData &other) tied_program = other.tied_program; uniforms = other.uniforms; - for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) + for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) i->value = i->value->clone(); for(BlockMap::iterator i=blocks.begin(); i!=blocks.end(); ++i) @@ -74,22 +75,22 @@ ProgramData &ProgramData::operator=(const ProgramData &other) ProgramData::~ProgramData() { - for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) + for(vector::iterator i=uniforms.begin(); i!=uniforms.end(); ++i) delete i->value; for(BlockMap::iterator i=blocks.begin(); i!=blocks.end(); ++i) { if(i->second.indices.type_flag==0xFE) - delete i->second.indices.dynamic.values; + delete[] i->second.indices.dynamic.values; delete i->second.block; } delete buffer; } -void ProgramData::uniform(const string &name, Uniform *uni) +void ProgramData::uniform(Tag tag, Uniform *uni) { try { - if(!validate_name(name)) + if(!validate_tag(tag)) { delete uni; return; @@ -101,23 +102,23 @@ void ProgramData::uniform(const string &name, Uniform *uni) throw; } - int i = find_uniform_index(name); + int i = find_uniform_index(tag); if(i<0) - return add_uniform(name, uni); + return add_uniform(tag, uni); uniforms[i].replace_value(uni); dirty |= 1< -void ProgramData::uniform(const string &name, V value) +void ProgramData::uniform(Tag tag, V value) { - if(!validate_name(name)) + if(!validate_tag(tag)) return; - int i = find_uniform_index(name); + int i = find_uniform_index(tag); if(i<0) - return add_uniform(name, new T(value)); + return add_uniform(tag, new T(value)); if(T *uni = dynamic_cast(uniforms[i].value)) uni->set(value); @@ -128,14 +129,14 @@ void ProgramData::uniform(const string &name, V value) } template -void ProgramData::uniform_array(const string &name, unsigned n, V value) +void ProgramData::uniform_array(Tag tag, unsigned n, V value) { - if(!validate_name(name)) + if(!validate_tag(tag)) return; - int i = find_uniform_index(name); + int i = find_uniform_index(tag); if(i<0) - return add_uniform(name, new UniformArray(n, value)); + return add_uniform(tag, new UniformArray(n, value)); UniformArray *uni = dynamic_cast *>(uniforms[i].value); if(uni && n==uni->size()) @@ -146,320 +147,318 @@ void ProgramData::uniform_array(const string &name, unsigned n, V value) dirty |= 1<get_uniform_info(name); - else if(name[name.size()-1]==']') - throw invalid_argument("ProgramData::uniform"); + tied_program->get_uniform_info(tag); return true; } #ifdef DEBUG catch(const exception &e) { - IO::print(IO::cerr, "Error while setting uniform %s: %s: %s\n", name, Debug::demangle(typeid(e).name()), e.what()); + IO::print(IO::cerr, "Error while setting uniform %s: %s: %s\n", tag, Debug::demangle(typeid(e).name()), e.what()); return false; } #endif } -void ProgramData::add_uniform(const string &name, Uniform *uni) +void ProgramData::add_uniform(Tag tag, Uniform *uni) { if(uniforms.size()>=MASK_BITS) { delete uni; - throw too_many_uniforms(name); + throw too_many_uniforms(tag.str()); } - vector::iterator j = lower_bound(uniforms.begin(), uniforms.end(), name, uniform_name_compare); + vector::iterator j = lower_bound_member(uniforms, tag, &TaggedUniform::tag); - NamedUniform nu; - nu.name = name; + TaggedUniform nu; + nu.tag = tag; nu.value = uni; uniforms.insert(j, nu); dirty = ALL_ONES; } -void ProgramData::uniform(const string &name, const Uniform &u) +void ProgramData::uniform(Tag tag, const Uniform &u) { - uniform(name, u.clone()); + uniform(tag, u.clone()); } -void ProgramData::uniform(const string &name, int v) +void ProgramData::uniform(Tag tag, int v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, float v) +void ProgramData::uniform(Tag tag, float v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, int v0, int v1) +void ProgramData::uniform(Tag tag, int v0, int v1) { int va[2] = { v0, v1 }; - uniform2(name, va); + uniform2(tag, va); } -void ProgramData::uniform(const string &name, float v0, float v1) +void ProgramData::uniform(Tag tag, float v0, float v1) { float va[2] = { v0, v1 }; - uniform2(name, va); + uniform2(tag, va); } -void ProgramData::uniform2(const string &name, const int *v) +void ProgramData::uniform2(Tag tag, const int *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform2(const string &name, const float *v) +void ProgramData::uniform2(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, int v0, int v1, int v2) +void ProgramData::uniform(Tag tag, int v0, int v1, int v2) { int va[3] = { v0, v1, v2 }; - uniform3(name, va); + uniform3(tag, va); } -void ProgramData::uniform(const string &name, float v0, float v1, float v2) +void ProgramData::uniform(Tag tag, float v0, float v1, float v2) { float va[3] = { v0, v1, v2 }; - uniform3(name, va); + uniform3(tag, va); } -void ProgramData::uniform(const string &name, const Vector3 &v) +void ProgramData::uniform(Tag tag, const Vector3 &v) { - uniform(name, v.x, v.y, v.z); + uniform(tag, v.x, v.y, v.z); } -void ProgramData::uniform3(const string &name, const int *v) +void ProgramData::uniform3(Tag tag, const int *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform3(const string &name, const float *v) +void ProgramData::uniform3(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, int v0, int v1, int v2, int v3) +void ProgramData::uniform(Tag tag, int v0, int v1, int v2, int v3) { int va[4] = { v0, v1, v2, v3 }; - uniform4(name, va); + uniform4(tag, va); } -void ProgramData::uniform(const string &name, float v0, float v1, float v2, float v3) +void ProgramData::uniform(Tag tag, float v0, float v1, float v2, float v3) { float va[4] = { v0, v1, v2, v3 }; - uniform4(name, va); + uniform4(tag, va); } -void ProgramData::uniform(const string &name, const Vector4 &v) +void ProgramData::uniform(Tag tag, const Vector4 &v) { - uniform(name, v.x, v.y, v.z, v.w); + uniform(tag, v.x, v.y, v.z, v.w); } -void ProgramData::uniform(const string &name, const Color &c) +void ProgramData::uniform(Tag tag, const Color &c) { - uniform(name, c.r, c.g, c.b, c.a); + uniform(tag, c.r, c.g, c.b, c.a); } -void ProgramData::uniform4(const string &name, const int *v) +void ProgramData::uniform4(Tag tag, const int *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform4(const string &name, const float *v) +void ProgramData::uniform4(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix2(name, &m(0, 0)); + uniform_matrix2(tag, &m(0, 0)); } -void ProgramData::uniform_matrix2(const string &name, const float *v) +void ProgramData::uniform_matrix2(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix3x2(name, &m(0, 0)); + uniform_matrix3x2(tag, &m(0, 0)); } -void ProgramData::uniform_matrix3x2(const string &name, const float *v) +void ProgramData::uniform_matrix3x2(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix4x2(name, &m(0, 0)); + uniform_matrix4x2(tag, &m(0, 0)); } -void ProgramData::uniform_matrix4x2(const string &name, const float *v) +void ProgramData::uniform_matrix4x2(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix2x3(name, &m(0, 0)); + uniform_matrix2x3(tag, &m(0, 0)); } -void ProgramData::uniform_matrix2x3(const string &name, const float *v) +void ProgramData::uniform_matrix2x3(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix3(name, &m(0, 0)); + uniform_matrix3(tag, &m(0, 0)); } -void ProgramData::uniform_matrix3(const string &name, const float *v) +void ProgramData::uniform_matrix3(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix4x3(name, &m(0, 0)); + uniform_matrix4x3(tag, &m(0, 0)); } -void ProgramData::uniform_matrix4x3(const string &name, const float *v) +void ProgramData::uniform_matrix4x3(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix2x4(name, &m(0, 0)); + uniform_matrix2x4(tag, &m(0, 0)); } -void ProgramData::uniform_matrix2x4(const string &name, const float *v) +void ProgramData::uniform_matrix2x4(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const LinAl::Matrix &m) +void ProgramData::uniform(Tag tag, const LinAl::Matrix &m) { - uniform_matrix3x4(name, &m(0, 0)); + uniform_matrix3x4(tag, &m(0, 0)); } -void ProgramData::uniform_matrix3x4(const string &name, const float *v) +void ProgramData::uniform_matrix3x4(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform(const string &name, const Matrix &m) +void ProgramData::uniform(Tag tag, const Matrix &m) { - uniform_matrix4(name, m.data()); + uniform_matrix4(tag, m.data()); } -void ProgramData::uniform_matrix4(const string &name, const float *v) +void ProgramData::uniform_matrix4(Tag tag, const float *v) { - uniform(name, v); + uniform(tag, v); } -void ProgramData::uniform1_array(const string &name, unsigned n, const int *v) +void ProgramData::uniform1_array(Tag tag, unsigned n, const int *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform1_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform1_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform2_array(const string &name, unsigned n, const int *v) +void ProgramData::uniform2_array(Tag tag, unsigned n, const int *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform2_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform2_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform3_array(const string &name, unsigned n, const int *v) +void ProgramData::uniform3_array(Tag tag, unsigned n, const int *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform3_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform3_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform4_array(const string &name, unsigned n, const int *v) +void ProgramData::uniform4_array(Tag tag, unsigned n, const int *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform4_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform4_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix2_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix2_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix3x2_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix3x2_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix4x2_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix4x2_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix2x3_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix2x3_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix3_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix3_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix4x3_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix4x3_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix2x4_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix2x4_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix3x4_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix3x4_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::uniform_matrix4_array(const string &name, unsigned n, const float *v) +void ProgramData::uniform_matrix4_array(Tag tag, unsigned n, const float *v) { - uniform_array(name, n, v); + uniform_array(tag, n, v); } -void ProgramData::remove_uniform(const string &name) +void ProgramData::remove_uniform(Tag tag) { - vector::const_iterator i = lower_bound(uniforms.begin(), uniforms.end(), name, uniform_name_compare); - if(i==uniforms.end() || i->name!=name) + vector::const_iterator i = lower_bound_member(uniforms, tag, &TaggedUniform::tag); + if(i==uniforms.end() || i->tag!=tag) return; delete i->value; @@ -468,38 +467,33 @@ void ProgramData::remove_uniform(const string &name) dirty = ALL_ONES; } -vector ProgramData::get_uniform_names() const +vector ProgramData::get_uniform_tags() const { - vector names; - names.reserve(uniforms.size()); - for(vector::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i) - names.push_back(i->name); - return names; + vector tags; + tags.reserve(uniforms.size()); + for(vector::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i) + tags.push_back(i->tag); + return tags; } -const Uniform &ProgramData::get_uniform(const string &name) const +const Uniform &ProgramData::get_uniform(Tag tag) const { - int i = find_uniform_index(name); + int i = find_uniform_index(tag); if(i<0) - throw key_error(name); + throw key_error(tag); return *uniforms[i].value; } -const Uniform *ProgramData::find_uniform(const string &name) const +const Uniform *ProgramData::find_uniform(Tag tag) const { - int i = find_uniform_index(name); + int i = find_uniform_index(tag); return (i>=0 ? uniforms[i].value : 0); } -bool ProgramData::uniform_name_compare(const NamedUniform &nu, const string &name) +int ProgramData::find_uniform_index(Tag tag) const { - return nu.name::const_iterator i = lower_bound(uniforms.begin(), uniforms.end(), name, uniform_name_compare); - return ((i!=uniforms.end() && i->name==name) ? i-uniforms.begin() : -1); + vector::const_iterator i = lower_bound_member(uniforms, tag, &TaggedUniform::tag); + return ((i!=uniforms.end() && i->tag==tag) ? i-uniforms.begin() : -1); } void ProgramData::update_block_uniform_indices(SharedBlock &block, const Program::UniformBlockInfo &info) const @@ -518,7 +512,7 @@ void ProgramData::update_block_uniform_indices(SharedBlock &block, const Program block.used = 0; for(unsigned i=0; iname); + int j = find_uniform_index(info.uniforms[i]->tag); if(j>=0) { indices[i] = j; @@ -611,7 +605,7 @@ void ProgramData::apply() const dirty = 0; } - const Program::UniformBlockMap &prog_blocks = prog->get_uniform_blocks(); + const vector &prog_blocks = prog->get_uniform_blocks(); UniformBlock *old_last_block = last_block; if(pu.dirty==ALL_ONES) @@ -622,29 +616,29 @@ void ProgramData::apply() const pu.blocks.reserve(prog_blocks.size()); pu.used = 0; - for(Program::UniformBlockMap::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i) + for(vector::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i) { - SharedBlock *shared = get_shared_block(i->second); + SharedBlock *shared = get_shared_block(*i); if(shared) { if(shared->dirty==ALL_ONES) - update_block_uniform_indices(*shared, i->second); + update_block_uniform_indices(*shared, *i); pu.used |= shared->used; } - pu.blocks.push_back(ProgramBlock(i->second.bind_point, shared)); + pu.blocks.push_back(ProgramBlock(i->bind_point, shared)); } } // Update the contents of all dirty blocks. bool buffered_blocks_updated = false; - std::vector::iterator j = pu.blocks.begin(); - for(Program::UniformBlockMap::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i, ++j) + vector::iterator j = pu.blocks.begin(); + for(vector::const_iterator i=prog_blocks.begin(); i!=prog_blocks.end(); ++i, ++j) { if(!j->shared || !j->shared->dirty) continue; - update_block(*j->shared, i->second); + update_block(*j->shared, *i); j->shared->dirty = 0; buffered_blocks_updated |= (j->bind_point>=0); } @@ -679,11 +673,11 @@ void ProgramData::apply() const } -ProgramData::NamedUniform::NamedUniform(): +ProgramData::TaggedUniform::TaggedUniform(): value(0) { } -void ProgramData::NamedUniform::replace_value(Uniform *v) +void ProgramData::TaggedUniform::replace_value(Uniform *v) { /* UniformBlock does not copy the uniforms, so existing default blocks will be left with stale pointers. This is not a problem as long as no