ok, here’s the complete code. what happens is a segmentation fault when glDrawarrays is called
#define GLX_GLXEXT_PROTOTYPES 0xffff
#include<stdio.h>
#include<X11/Xlib.h>
#include<GL/glx.h>
Display *dpy = XOpenDisplay(NULL);
Window root = DefaultRootWindow(dpy);
GLint att[] = {GLX_RGBA, None};
XVisualInfo *vi = glXChooseVisual(dpy, 0, att);
GLXContext glc = glXCreateContext(dpy, vi, NULL, False);
Visual *vis = DefaultVisual(dpy, 0);
Colormap cmap = XCreateColormap(dpy, root, vis, AllocNone);
int dep = DefaultDepth(dpy, 0);
XSetWindowAttributes swa;
Window win;
GLuint vbuf[] = {98, 99, 100};
#define GL_ARRAY_BUFFER_ARB 0x8892
#define GL_STATIC_DRAW_ARB 0x88E4
typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);
typedef bool (APIENTRY * PFNGLISBUFFERARBPROC) (GLuint);
PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
PFNGLISBUFFERARBPROC glIsBufferARB = NULL;
GLfloat vbo_data[] = {0., 0., 0., 1., 0., 0., 0., 1., 0.};
int main(int argc, char *argv[]){
swa.colormap = cmap;
swa.border_pixel = 0;
win = XCreateWindow(dpy, root, 0, 0, 100, 100, 0, dep, InputOutput, vis, CWColormap | CWBorderPixel, &swa);
XMapWindow(dpy, win);
glXMakeCurrent(dpy, win, glc);
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) glXGetProcAddressARB((const GLubyte*) "glGenBuffersARB");
glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) glXGetProcAddressARB((const GLubyte*) "glDeleteBuffersARB");
glBindBufferARB = (PFNGLBINDBUFFERARBPROC) glXGetProcAddressARB((const GLubyte*) "glBindBufferARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC) glXGetProcAddressARB((const GLubyte*) "glBufferDataARB");
glIsBufferARB = (PFNGLISBUFFERARBPROC) glXGetProcAddressARB((const GLubyte*) "glIsBufferARB");
if(glGenBuffersARB && glDeleteBuffersARB && glBindBufferARB && glBufferDataARB && glIsBufferARB)
printf("
VBO SETUP OK
");
glGenBuffersARB(3, vbuf);
printf("
BUFFER IDS = %i, %i, %i
", vbuf[0], vbuf[1], vbuf[2]);
printf(" GEN BUFFER : ERROR = %i
", glGetError());
if(glIsBufferARB(vbuf[0]) == False)
printf("
BUFFER NOT VALID
");
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbuf[0]);
printf(" BIND BUFFER : ERROR = %i
", glGetError());
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 9*sizeof(float), vbo_data, GL_STATIC_DRAW_ARB);
printf(" BUFFER DATA : ERROR = %i
", glGetError());
glEnableClientState(GL_VERTEX_ARRAY);
printf(" ENABLE ARRAY : ERROR = %i
", glGetError());
glVertexPointer(3, GL_FLOAT, 0, NULL);
printf(" VERTEX POINTER : ERROR = %i
", glGetError());
glDrawArrays(GL_TRIANGLES, 0, 3); }
//
// gcc -I/usr/X11R6/include -L/usr/X11R6/lib -o vbo vbo.cc -lX11 -lGL -lGLU -lm
//