static void realize(GtkGLArea *const area) { gtk_gl_area_make_current (area); const GError* error = gtk_gl_area_get_error (area); if(error != NULL) { puts(error->message); abort(); } const GLenum err = glewInit(); if (err != GLEW_OK) { printf("Glew derped %d %s\n", err, glewGetErrorString(err)); } printf("Mmm %d %d %d %d\n", GLEW_ARB_buffer_storage, GLEW_ARB_shader_storage_buffer_object, GLEW_ARB_shader_image_load_store, GLEW_ARB_vertex_program); //glBindVertexArray(0); // only one vertex array so can leave it bound const char* blob = (const char*)glGetString(GL_EXTENSIONS); for(;*blob;++blob) { if(*blob == ' ') { putchar('\n'); } else { putchar(*blob); } } exit(0); glGetIntegerv(GL_MAJOR_VERSION, &GLversion.major); glGetIntegerv(GL_MINOR_VERSION, &GLversion.minor); // GLversion.major = 1; GLversion.minor = 5; // XXX: wat GLversion.headerlen = snprintf(GLversion.shader_header, 0x100, "#version %d%d0 es\n", GLversion.major, GLversion.minor); const GLuint vertex_shader = make_shader(GL_VERTEX_SHADER, vertex_SHADER_DATA, vertex_SHADER_DATA_length); #if defined(WIREFRAME) const GLuint geometry_shader = make_shader(GL_GEOMETRY_SHADER, wireframe_SHADER_DATA, wireframe_SHADER_DATA_length); #else const GLuint geometry_shader = make_shader(GL_GEOMETRY_SHADER, triangles_SHADER_DATA, triangles_SHADER_DATA_length); #endif const GLuint fragment_shader = make_shader(GL_FRAGMENT_SHADER, LITANDLEN("out vec4 FragColor;\n" "void main() { FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f); }")); shader_program = glCreateProgram(); glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, geometry_shader); glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); GLint ok = 0; glGetProgramiv(shader_program, GL_LINK_STATUS, &ok); if(!ok) { char log[512]; glGetProgramInfoLog(shader_program, 512, NULL, log); fprintf(stderr, "link program %s\n", log); abort(); } glDeleteShader(vertex_shader); glDeleteShader(geometry_shader); glDeleteShader(fragment_shader); glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); // bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s). glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); }