the buffer is actually used. */
}
-void Bufferable::update_buffer() const
+bool Bufferable::resize_buffer() const
{
- BindRestore bind(buffer, buffer->get_type());
if(offset+get_data_size()>=buffer->get_size())
{
const Bufferable *last = this;
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();
+ return true;
}
}
+ return false;
+}
+
+void Bufferable::update_buffer() const
+{
+ BindRestore bind(buffer, buffer->get_type());
+ if(resize_buffer())
+ {
+ /* Resizing the buffer invalidates its contents. Non-dirty data may
+ be in use, so reupload it. */
+ for(const Bufferable *b=prev_in_buffer; b; b=b->prev_in_buffer)
+ if(!b->dirty)
+ b->upload_data();
+ for(const Bufferable *b=next_in_buffer; b; b=b->next_in_buffer)
+ if(!b->dirty)
+ b->upload_data();
+ }
+
upload_data();
dirty = false;
}
+void Bufferable::upload_data() const
+{
+ buffer->sub_data(offset, get_data_size(), get_data_pointer());
+}
+
} // namespace GL
} // namespace Msp