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?

Ps:

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 4.5 and DSA

gl4.glGetString(GL4.GL_VERSION) 4.5.0 NVIDIA 347.88

gl4.isExtensionAvailable(“GL_ARB_direct_state_access” true

Are you creating the buffer using glGenBuffers or glCreateBuffers? Note that in the former case (i.e with glGenBuffers) the buffer object does not exist; all that glGenBuffers gives you is a name, but it doesn’t create an object.

glGenBuffers

Ok, but then why it works on C? Directly from the Nvidia github https://github.com/NVIDIAGameWorks/OpenGLSamples/blob/master/samples/gl4-kepler/BindlessApp/Mesh.cpp#L55-77

Is the driver directly fixing it on the fly?

Anyway, it seems if you bind the buffer before it doesnt complain

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

    // *** INTERESTING ***
    // get the GPU pointer for the vertex buffer and make the vertex buffer
    // resident on the GPU
    gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, vertexBuffer[0]);
    gl4.glGetBufferParameterui64vNV(GL4.GL_ARRAY_BUFFER, GL4.GL_BUFFER_GPU_ADDRESS_NV,
            vertexBufferGPUPtr, 0);
    gl4.glGetBufferParameteriv(GL4.GL_ARRAY_BUFFER, GL4.GL_BUFFER_SIZE,
            vertexBufferSize, 0);
    gl4.glMakeBufferResidentNV(GL4.GL_ARRAY_BUFFER, GL4.GL_READ_ONLY);
    gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, 0);

To:

// *** INTERESTING ***
    // get the GPU pointer for the vertex buffer and make the vertex buffer
    // resident on the GPU
    gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, vertexBuffer[0]);
    gl4.glNamedBufferData(vertexBuffer[0], Vertex.size() * vertices.size(),
            GLBuffers.newDirectFloatBuffer(verticesArray), GL4.GL_STATIC_DRAW);
    gl4.glGetBufferParameterui64vNV(GL4.GL_ARRAY_BUFFER, GL4.GL_BUFFER_GPU_ADDRESS_NV,
            vertexBufferGPUPtr, 0);
    gl4.glGetBufferParameteriv(GL4.GL_ARRAY_BUFFER, GL4.GL_BUFFER_SIZE,
            vertexBufferSize, 0);
    gl4.glMakeBufferResidentNV(GL4.GL_ARRAY_BUFFER, GL4.GL_READ_ONLY);
    gl4.glBindBuffer(GL4.GL_ARRAY_BUFFER, 0);

If I switch Gen to Create it works outside the bindings… this anyway doesnt explain why it works with the Nvidia C code

// Stick the data for the vertices and indices in their respective buffers
glNamedBufferDataEXT(m_vertexBuffer, sizeof(vertices[0]) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
glNamedBufferDataEXT(m_indexBuffer, sizeof(indices[0]) * indices.size(), &indices[0], GL_STATIC_DRAW);

The NVIDIA code isn’t using GL 4.5 DSA but rather the old GL_EXT_direct_state_access extension. These are not the same thing. When DSA was brought into core GL it wasn’t just a renamed version of the old extension, and the old extension didn’t have this requirement.

[QUOTE=mhagain;1265913]

// Stick the data for the vertices and indices in their respective buffers
glNamedBufferDataEXT(m_vertexBuffer, sizeof(vertices[0]) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
glNamedBufferDataEXT(m_indexBuffer, sizeof(indices[0]) * indices.size(), &indices[0], GL_STATIC_DRAW);

The NVIDIA code isn’t using GL 4.5 DSA but rather the old GL_EXT_direct_state_access extension. These are not the same thing. When DSA was brought into core GL it wasn’t just a renamed version of the old extension, and the old extension didn’t have this requirement.[/QUOTE]

Ah, thanks for the clarification, then I will always use glCreateBuffer together with glNamedBufferData