]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programdata.cpp
Make buffer storage immutable and use ARB_buffer_storage
[libs/gl.git] / source / programdata.cpp
index 912bc3c88a54c25a8c52199e8552a0d0a2b5eecc..4a6c262a37a646bfd128f3cda4143ae5007e2a70 100644 (file)
@@ -513,10 +513,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 +556,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 +598,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<ProgramBlock>::iterator i=pu.blocks.begin(); i!=pu.blocks.end(); ++i)