You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Looking at the vertex_buffer_upload function, I notice that you bind the buffer
and upload the data twice to the GPU if the buffers have not been created yet.
No matter what, the glBufferSubData gets called even if a glBufferData was
called before.
Small rearrangement avoids this:
void vertex_buffer_upload ( vertex_buffer_t *self )
{
if( !self->vertices_id )
{
glGenBuffers( 1, &self->vertices_id );
glBindBuffer( GL_ARRAY_BUFFER, self->vertices_id );
glBufferData( GL_ARRAY_BUFFER,
self->vertices->size*self->vertices->item_size,
self->vertices->items, GL_DYNAMIC_DRAW );
}
else
{
glBindBuffer( GL_ARRAY_BUFFER, self->vertices_id );
glBufferSubData( GL_ARRAY_BUFFER, 0,
self->vertices->size*self->vertices->item_size,
self->vertices->items );
}
glBindBuffer( GL_ARRAY_BUFFER, 0 );
if( !self->indices_id )
{
glGenBuffers( 1, &self->indices_id );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, self->indices_id );
glBufferData( GL_ELEMENT_ARRAY_BUFFER,
self->indices->size*self->indices->item_size,
self->indices->items, GL_DYNAMIC_DRAW );
}
else
{
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, self->indices_id );
glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, 0,
self->indices->size*self->indices->item_size,
self->indices->items );
}
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}
PS: nice work!
Original issue reported on code.google.com by cristi.c...@gmail.com on 23 May 2012 at 6:22
The text was updated successfully, but these errors were encountered:
Thanks for the report.
I tried to use glBufferSubData quite recently and I think it might be wrong
because it does not resize the buffer (on the GPU) if necessary. In fact,
BufferData acts both as both a "malloc" and a "memcpy" and since we upload the
whole buffer each time, maybe it is enough, what do you think ?
Original comment by Nicolas.Rougier@gmail.com on 23 May 2012 at 10:50
It's true that glBufferSubData will not allocate any memory. It is going to
reuse whatever was allocated by the last call to glBufferData. So, if you are
uploading data that is less or equal to the previous data, glBufferSubData is
generally faster (no need to allocate new memory, just reuse existing buffer).
Also I do not know of any other way than glBufferData to allocate (or
reallocate) memory for a given buffer. So, yeah, you can always use just
glBufferData, but I think for a more optimized approach one should not
allocate+deallocate buffers often.
Then again, it means extra work, to keep track of the size each buffer can hold
and only call glBufferData if the new data does not fit.
Original comment by cristi.c...@gmail.com on 23 May 2012 at 1:48
Original issue reported on code.google.com by
cristi.c...@gmail.com
on 23 May 2012 at 6:22The text was updated successfully, but these errors were encountered: