PDA

View Full Version : glNamedBufferData fires GL_INVALID_OPERATION



elect
04-20-2015, 02:38 AM
I get an exception at the very begin of my sample, when I try to allocate geometry for the gound, here (https://github.com/elect86/NvGlSamples/blob/master/NvGlSamples/src/nvGlSamples/bindlessApp/BindlessApp.java#L402) and here (https://github.com/elect86/NvGlSamples/blob/master/NvGlSamples/src/nvGlSamples/bindlessApp/util/Mesh.java#L56-57):

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 (https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml) 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 (https://www.opengl.org/sdk/docs/man/html/glGetBufferParameter.xhtml) a target which I didnt provide because of glNamedBufferData,
and looking here (https://github.com/sgothel/jogl/blob/master/src/jogl/classes/jogamp/opengl/GLBufferObjectTracker.java#L217-220), 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

mhagain
04-20-2015, 05:16 AM
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.

elect
04-20-2015, 05:24 AM
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_BUFFE R, 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_BUFFE R, 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);

elect
04-20-2015, 05:27 AM
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.

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

mhagain
04-20-2015, 06:22 AM
// 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.

elect
04-20-2015, 06:53 AM
// 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.

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