MathewWi / freetype-gl

Automatically exported from code.google.com/p/freetype-gl
Other
0 stars 0 forks source link

vertex_buffer_upload uploading data twice #21

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
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 commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
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 commented 9 years ago
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