]> git.tdb.fi Git - libs/gl.git/commitdiff
Improve performance of Bufferable::update_buffer_data
authorMikko Rasa <tdb@tdb.fi>
Sun, 26 Aug 2012 12:03:21 +0000 (15:03 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 26 Aug 2012 12:03:21 +0000 (15:03 +0300)
... by avoiding the walk through the entire chain every time it is
called.  It's not necessary to add up all the sizes either, since we can
just get the end of the last Bufferable.

source/bufferable.cpp

index 4660e9c31b32f787bfc553326078da669063b0a5..12e0aef7d345da45e948820606211926c1de9b49 100644 (file)
@@ -74,19 +74,22 @@ void Bufferable::update_buffer_offset()
 
 void Bufferable::update_buffer_data() const
 {
-       const Bufferable *first = this;
-       for(; first->prev_in_buffer; first=first->prev_in_buffer) ;
-
-       unsigned total_size = 0;
-       for(const Bufferable *b=first; b; b=b->next_in_buffer)
-               total_size += b->get_data_size();
-
-       if(total_size!=buffer->get_size())
+       if(buffer_offset+get_data_size()>=buffer->get_size())
        {
-               buffer->data(total_size, 0);
-               // Resizing the buffer invalidates its contents.
-               for(const Bufferable *b=first; b; b=b->next_in_buffer)
-                       b->dirty = true;
+               const Bufferable *last = this;
+               for(; last->next_in_buffer; last=last->next_in_buffer) ;
+
+               unsigned total_size = last->buffer_offset+last->get_data_size();
+
+               if(total_size>buffer->get_size())
+               {
+                       buffer->data(total_size, 0);
+                       /* Resizing the buffer invalidates its contents.  Non-dirty data may
+                       be in use, so reupload it. */
+                       for(const Bufferable *b=last; b; b=b->prev_in_buffer)
+                               if(!b->dirty)
+                                       b->upload_data();
+               }
        }
 
        upload_data();