Search code examples
bufferjoglinvalidoperationexceptionopengl-4

glNamedBufferData fires GL_INVALID_OPERATION


I get an exception at the very begin of my sample, when I try to allocate geometry for the gound, here and here:

at this point

gl4.glNamedBufferData(vertexBuffer[0], Vertex.size() * vertices.size(),
                floatBuffer, GL4.GL_STATIC_DRAW);

Exception:

Caused by: com.jogamp.opengl.GLException: GL-Error 0x502 while creating mutable storage for buffer 1 of size 512 with data java.nio.DirectFloatBufferU[pos=0 lim=128 cap=128]

I have the object Vertex that takes 128 floats, I have 4 vertices, this means 512 Byte

Everything seems right

Anyway, error 0x502 is GL_INVALID_OPERATION and glNamedBufferData fires that only if:

- GL_INVALID_OPERATION is generated by glNamedBufferData if buffer is not the name of an existing buffer object.

- GL_INVALID_OPERATION is generated if the GL_BUFFER_IMMUTABLE_STORAGE flag of the buffer object is GL_TRUE. 

Since buffer exist (!= 0, 1), it must be the second one

But I cant query any GL_BUFFER_IMMUTABLE_STORAGE flag, since glGetBufferParameter requires a target which I didnt provide because of glNamedBufferData,

and looking here, if mutableUsage was false, I would have catched the internal error, which I didnt, so..

Any idea?

gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, vertexBuffer[0]);
gl4.glBufferData(GL4.GL_ARRAY_BUFFER, Vertex.size() * vertices.size(), floatBuffer, GL4.GL_STATIC_DRAW);
gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, 0);

it works like a charm and I am sure I have GL 4.5

gl4.glGetString(GL4.GL_VERSION) 4.5.0 NVIDIA 347.88

gl4.isExtensionAvailable("GL_ARB_direct_state_access" true

Solution

  • OpenGL 4.5 Specification - 6.1 Creating and Binding Buffer Objects:

    A buffer object is created by binding a name returned by GenBuffers to a buffer target. The binding is effected by calling

    void BindBuffer( enum target, uint buffer );
    

    target must be one of the targets listed in table 6.1. If the buffer object named buffer has not been previously bound, the GL creates a new state vector, initialized with a zero-sized memory buffer and comprising all the state and with the same initial values listed in table 6.2.

    So the difference between glGenBuffers and glCreateBuffers is, that glGenBuffers only returns an unused name, while glCreateBuffers also creates and initializes the state vector described above.