Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vertex_buffer_upload uploading data twice #21

Closed
GoogleCodeExporter opened this issue Mar 15, 2016 · 3 comments
Closed

vertex_buffer_upload uploading data twice #21

GoogleCodeExporter opened this issue Mar 15, 2016 · 3 comments

Comments

@GoogleCodeExporter
Copy link

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

@GoogleCodeExporter
Copy link
Author

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

  • Changed state: Started

@GoogleCodeExporter
Copy link
Author

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

@GoogleCodeExporter
Copy link
Author

Yep, you're right. I just committed a fix. Thanks for the report (added your 
name in the README).

Original comment by Nicolas.Rougier@gmail.com on 23 May 2012 at 3:18

  • Changed state: Fixed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant