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…
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.
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);
// 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.
// 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