- int i = find_uniform_index(tag);
- if(i<0)
- return add_uniform(tag, new UniformArray<T>(n, value));
+ auto i = lower_bound_member(uniforms, tag, &TaggedUniform::tag);
+ if(i==uniforms.end() || i->tag!=tag)
+ {
+ if(uniforms.size()>=MASK_BITS)
+ throw too_many_uniforms(tag.str());
+
+ TaggedUniform tu;
+ tu.tag = tag;
+ tu.type = type;
+ tu.array_size = array_size;
+ tu.data_offset = uniform_data.size();
+ tu.data_size = array_size*get_type_size(type);
+ i = uniforms.insert(i, tu);
+ uniform_data.resize(tu.data_offset+tu.data_size);
+
+ mark_dirty(ALL_ONES);
+ }
+ else if(type!=i->type)
+ throw invalid_operation("ProgramData::uniform");
+ else if(array_size>i->array_size)
+ {
+ unsigned add_bytes = (array_size-i->array_size)*get_type_size(type);
+ uniform_data.insert(uniform_data.begin()+i->data_offset+i->data_size, add_bytes, 0);
+ for(TaggedUniform &u: uniforms)
+ if(u.data_offset>i->data_offset)
+ u.data_offset += add_bytes;
+ i->array_size = array_size;
+ i->data_size = array_size*get_type_size(type);
+ }