using OpenGL 4.5 and an NVidia card, I have noticed that when switching transform feedback objects via glBindTransformFeedback(), the associated array buffer bindings established with glBindBufferBase(), do not get changed.
Have a look at the following snippets:
Let there be a pair of transform feedback and vertex buffer objects:
GLuint tfo1, vbo1;
glGenTransformFeedbacks(1, &tfo1);
glGenBuffers(1, &vbo1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo1);
Query result using glGetIntegerv():
GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 1
Let there be another pair of such objects:
GLuint tfo2, vbo2;
glGenTransformFeedbacks(1, &tfo2);
glGenBuffers(1, &vbo2);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, 123 * sizeof(float), nullptr, GL_DYNAMIC_DRAW);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo2);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo2);
Query result using glGetIntegerv():
GL_TRANSFORM_FEEDBACK_BINDING: 2
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2
And now comes the issue: After having created the second pair, binding the previous transform buffer object tfo1...
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo1);
...leads to the following query result:
GL_TRANSFORM_FEEDBACK_BINDING: 1
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 2 <--- WHY NOT 1?
The bound TFO is now tfo1 but the array buffer binding has not been changed.
It looks like as if the buffer binding is not part of the TFO state but can that be? Isn't managing buffer bindings the main reason TFOs exist?