X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramdata.cpp;h=4d8ca4dd1adabc338967ab91bc2e817091d18a49;hb=24c58bfd2c3c80d879ec796b2f206bdba8d9e58d;hp=f454fe5145f595ed1cd6c62488c5b433aaba9a83;hpb=9f00daecc2517aa8fd5a6e4545b2db3f2fff985d;p=libs%2Fgl.git diff --git a/source/programdata.cpp b/source/programdata.cpp index f454fe51..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; @@ -489,21 +490,31 @@ ProgramData::SharedBlock *ProgramData::get_shared_block(const Program::UniformBl if(i==blocks.end()) { bool any_found = false; - for(vector::const_iterator j=info.uniforms.begin(); (!any_found && j!=info.uniforms.end()); ++j) - any_found = (find_uniform_index((*j)->name)>=0); + bool all_found = true; + for(vector::const_iterator j=info.uniforms.begin(); j!=info.uniforms.end(); ++j) + { + if(find_uniform_index((*j)->name)>=0) + any_found = true; + else + all_found = false; + } - // TODO throw if all uniforms for a buffer-backed block are not found if(!any_found) return 0; + else if(!all_found && info.bind_point>=0) + { +#ifdef DEBUG + IO::print(IO::cerr, "Warning: not all uniforms for block %s are present\n", info.name); +#else + throw incomplete_uniform_block(info.name); +#endif + } UniformBlock *block; 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); @@ -546,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. @@ -587,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)