Found 2 possible bugs with the 3.0 VAOs in the 177.89 drivers:
Main one is that calling glDisableVertexAttribArray(1); with no VAO bound breaks any existing VAOs that had attrib 1 active with a pointer set.
small test case, using glfw2.6 modified to use a gl3 context :
#include <stdio.h>
#include <GL/glfw.h>
#include "glext.h"
PFNGLGENBUFFERSPROC glGenBuffers = 0;
PFNGLBINDBUFFERPROC glBindBuffer = 0;
PFNGLBUFFERDATAPROC glBufferData = 0;
PFNGLGENVERTEXARRAYSAPPLEPROC glGenVertexArrays = 0;
PFNGLBINDVERTEXARRAYAPPLEPROC glBindVertexArray = 0;;
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = 0;
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = 0;
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = 0;
PFNGLCREATEPROGRAMPROC glCreateProgram = 0;
PFNGLCREATESHADERPROC glCreateShader = 0;
PFNGLSHADERSOURCEPROC glShaderSource = 0;
PFNGLCOMPILESHADERPROC glCompileShader = 0;
PFNGLATTACHSHADERPROC glAttachShader = 0;
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation = 0;
PFNGLLINKPROGRAMPROC glLinkProgram = 0;
PFNGLDELETESHADERPROC glDeleteShader = 0;
PFNGLUSEPROGRAMPROC glUseProgram = 0;
void init_extensions() {
glGenBuffers = glfwGetProcAddress("glGenBuffers");
glBindBuffer = glfwGetProcAddress("glBindBuffer");
glBufferData = glfwGetProcAddress("glBufferData");
glGenVertexArrays = glfwGetProcAddress("glGenVertexArrays");
glBindVertexArray = glfwGetProcAddress("glBindVertexArray");
glDisableVertexAttribArray = glfwGetProcAddress("glDisableVertexAttribArray");
glEnableVertexAttribArray = glfwGetProcAddress("glEnableVertexAttribArray");
glVertexAttribPointer = glfwGetProcAddress("glVertexAttribPointer");
glCreateProgram = glfwGetProcAddress("glCreateProgram");
glCreateShader = glfwGetProcAddress("glCreateShader");
glShaderSource = glfwGetProcAddress("glShaderSource");
glCompileShader = glfwGetProcAddress("glCompileShader");
glAttachShader = glfwGetProcAddress("glAttachShader");
glBindAttribLocation = glfwGetProcAddress("glBindAttribLocation");
glLinkProgram = glfwGetProcAddress("glLinkProgram");
glDeleteShader = glfwGetProcAddress("glDeleteShader");
glUseProgram = glfwGetProcAddress("glUseProgram");
}
const float cube[] = {-1.0, -1.0, -1.0,
-1.0, -1.0, 1.0,
-1.0, 1.0, -1.0,
-1.0, 1.0, 1.0,
1.0, -1.0, -1.0,
1.0, -1.0, 1.0,
1.0, 1.0, -1.0,
1.0, 1.0, 1.0, };
const int cubei[] = {0, 6, 4,
0, 2, 6,
0, 3, 2,
0, 1, 3,
2, 7, 6,
2, 3, 7,
4, 6, 7,
4, 7, 5,
0, 4, 5,
0, 5, 1,
1, 5, 7,
1, 7, 3,};
unsigned int vao = 0;
unsigned int program = 0;
// attrib indexes other than 1 don't trigger crash
#define ATTRIB 1
void fill_buffers() {
unsigned int i=0,v=0;
glGenBuffers(1, &v);
glGenBuffers(1, &i);
glBindBuffer(GL_ARRAY_BUFFER, v);
glBufferData(GL_ARRAY_BUFFER, 24*sizeof(float), cube, GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glEnableVertexAttribArray( ATTRIB );
glVertexAttribPointer(ATTRIB, 3, GL_FLOAT, 0, 3*sizeof(float), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36*sizeof(int), cubei, GL_STATIC_DRAW);
}
int main( void )
{
int width, height;
glfwInit();
glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW );
init_extensions();
glfwGetWindowSize( &width, &height );
glViewport( 0, 0, width, height );
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
fill_buffers();
//*** DrawElements below crashes if both of these lines are here :
glBindVertexArray(0); //***
glDisableVertexAttribArray( ATTRIB ); //***
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
glfwSwapBuffers();
// crashes on exit if we leave vao bound
glBindVertexArray(0);
glfwTerminate();
return 0;
}
Only attrib 1 seems to be a problem, no crashes with any others.
Other possible bug is that the above code crashes if the vao is still bound when it exits.
-b-