X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramdata.cpp;h=4d8ca4dd1adabc338967ab91bc2e817091d18a49;hb=24c58bfd2c3c80d879ec796b2f206bdba8d9e58d;hp=912bc3c88a54c25a8c52199e8552a0d0a2b5eecc;hpb=56133280d92c08c1c649a725260a6c4d5afb5e75;p=libs%2Fgl.git diff --git a/source/programdata.cpp b/source/programdata.cpp index 912bc3c8..4d8ca4dd 100644 --- a/source/programdata.cpp +++ b/source/programdata.cpp @@ -109,15 +109,16 @@ void ProgramData::uniform(const string &name, Uniform *uni) if(i>=0) { uniforms[i].replace_value(uni); - - if(static_cast(i)=MASK_BITS) + { + delete uni; + throw too_many_uniforms(name); + } + vector::iterator j = lower_bound(uniforms.begin(), uniforms.end(), name, uniform_name_compare); NamedUniform nu; @@ -513,10 +514,7 @@ ProgramData::SharedBlock *ProgramData::get_shared_block(const Program::UniformBl if(info.bind_point>=0) { if(!buffer) - { buffer = new Buffer(UNIFORM_BUFFER); - buffer->set_usage(STREAM_DRAW); - } block = new UniformBlock(info.data_size); block->use_buffer(buffer, last_block); @@ -559,6 +557,7 @@ void ProgramData::apply() const const Program::UniformBlockMap &prog_blocks = prog->get_uniform_blocks(); + UniformBlock *old_last_block = last_block; if(pu.dirty==ALL_ONES) { /* The set of uniforms has changed since this program was last used. @@ -600,6 +599,22 @@ void ProgramData::apply() const to avoid state thrashing. */ if(buffered_blocks_updated && !ARB_direct_state_access) buffer->bind(); + + if(last_block!=old_last_block) + { + unsigned required_size = last_block->get_required_buffer_size(); + if(last_block->get_required_buffer_size()>buffer->get_size()) + { + if(buffer->get_size()>0) + { + delete buffer; + buffer = new Buffer(UNIFORM_BUFFER); + last_block->change_buffer(buffer); + } + + buffer->storage(required_size); + } + } } for(vector::iterator i=pu.blocks.begin(); i!=pu.blocks.end(); ++i)