I’ve made a small test example. The results are:
For ATI Catalyst 9.5: InvalidOperation on BindBufferBase call
For Nvidia 180.xx WHQL: (will be posted a little bit later)
If there is someone from ATI/Nvidia here, please, tell me if I’m doing something wrong or it’s just your drivers bugs.
#include "glew.h"
#include "glfw.h"
#include <stdio.h>
#include <assert.h>
#pragma comment(lib,"GLFW.lib")
#pragma comment(lib,"glew32.lib")
#pragma comment(lib,"opengl32.lib")
static const char* const sourceVert = "varying vec4 out_pos; \
void main() { gl_Position = out_pos = gl_Vertex + vec4(0.5); } \
";
static const char* const sourceFrag = "varying vec4 out_pos; \
void main() {}";
static void checkShader(const GLuint id, const GLenum type, const char str[]) {
static char msg[240];
int size,aux;
glGetObjectParameterivARB(id, type, &size);
if(!size) return;
glGetObjectParameterivARB(id, GL_OBJECT_INFO_LOG_LENGTH_ARB, &size);
assert(size < sizeof(msg));
glGetInfoLogARB(id, size, &aux, msg);
msg[size] = 0;
printf("%s: %s", str, msg);
}
int main() {
printf("Testing EXT_TRANSFORM_FEEDBACK
");
glfwInit();
int ok = glfwOpenWindow(400, 300, 8,8,8, 0,0,0, GLFW_WINDOW);
if(!ok) return -1;
GLenum err = glewInit();
if(err != GLEW_OK) return -2;
printf("Context initialized
");
if(!GLEW_EXT_transform_feedback || !GLEW_ARB_shader_objects || !GLEW_ARB_vertex_buffer_object)
return -3;
printf("Extensions supported
");
GLuint shid, bid, tmp;
shid = glCreateProgramObjectARB();
tmp = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
glShaderSourceARB(tmp, 1, (const GLcharARB**)&sourceVert, NULL);
glCompileShaderARB(tmp);
checkShader(tmp, GL_OBJECT_COMPILE_STATUS_ARB, "Compile vertex");
glAttachObjectARB(shid,tmp);
tmp = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB(tmp, 1, (const GLcharARB**)&sourceFrag, NULL);
glCompileShaderARB(tmp);
checkShader(tmp, GL_OBJECT_COMPILE_STATUS_ARB, "Compile fragment");
glAttachObjectARB(shid,tmp);
const char *vars[] = {"out_pos"};
glTransformFeedbackVaryingsEXT(shid, 1, vars, GL_SEPARATE_ATTRIBS_EXT);
glLinkProgramARB(shid);
checkShader(shid, GL_OBJECT_LINK_STATUS_ARB, "Link result");
printf("Shader loaded: %d
", glGetError());
glGenBuffersARB(1, &bid);
glBindBufferARB(GL_ARRAY_BUFFER, bid);
const float init[] = {0.1f,0.2f,0.3f,0.4f};
glBufferDataARB(GL_ARRAY_BUFFER, 4*sizeof(float)*1, init, GL_STREAM_DRAW);
printf("Buffer prepared: %d
", glGetError());
glBindBufferBaseEXT(GL_TRANSFORM_FEEDBACK_BUFFER_EXT, 1, bid);
printf("Feedback assigned: %d
", glGetError());
glUseProgramObjectARB(shid);
glBeginTransformFeedbackEXT(GL_POINTS);
glEnable(GL_RASTERIZER_DISCARD_EXT);
glBegin(GL_POINTS);
glVertex4fv(init);
glEnd();
glDisable(GL_RASTERIZER_DISCARD_EXT);
glEndTransformFeedbackEXT();
printf("Drawing completed: %d
", glGetError());
float *const data = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
for(int i=0; data && i!=4; ++i)
printf("%.1f ", data[i]);
glUnmapBuffer(GL_ARRAY_BUFFER);
printf("
Data readed: %d
", glGetError());
glfwTerminate();
getchar();
return 0;
}