glFlushMappedBufferRange and GL_INVALID_VALUE

I’d like to upload a bunch of vertices of meshes (simple arrays of float values x,y,z) into a single vbo. I’ve created a unique buffer with the total ammount of bytes needed to contains all the vertices

glBufferData(buffer->glTarget, buffer->nTotalBytes, 0, buffer->glUsage);

then reading each mesh vertices array i’d like to copy those bytes into the buffer, each at the right offset inside the VBO. to do that i calculate the offset and size of each array to copy then i call a function that simply do this

// Bind the buffer for use
glBindBuffer(buffer->glTarget, buffer->glId);

GLvoid* data_pointer = glMapBufferRange(
        offset, // Offset
        size,    // Size,

// copy the data

// flush the data
glFlushMappedBufferRange(buffer->glTarget, offset, size);

// release the buffer pointer

// Unbind the buffer
glBindBuffer(buffer->glTarget, 0);

offset is 0 at the begin, size is the size of the array in bytes, then the next mesh offset+= size, size = new_mesh_size. The problem is that at the second mesh copy, when i flush the data, OpenGL gives me a GL_INVALID_VALUE error. I checked all the ranges values and everything is ok (the buffer is like 2 Mbytes and the first mesh is like 3000 vertices, the second 1000) and if the ranges are wrong i’d assume glMapBufferRange would give me an error first, isn’t it?

If i remove the flush and let it do the operation automatically with glUnmapBuffer there’s no error. Any ideas why i cannot flush the second slice? :confused:

If your drivers support debug-output, that can help you.

Is it possible that the offset you need to specify for the flush command is relative to the interval set in glMapBufferRange itself?

For example glMapBufferRange has 1000 as offset and 500 as size of the interval. The flush offset has to be between 0 and 500, not between 1000 and 1500.

I’ve tried to flush with that in mind and it works. If i add +1 to the range the error returns, so…

All the examples i’ve found just upload data from the begin of the buffer and flush everything so you cannot understand how it works.

I’ll check debug output too

You’re right; from the spec:

The specified subrange to flush is relative to the start of the currently mapped range of buffer