//g++ little.C -lGL -lX11 #include "GL/glx.h" ///usr/include/GL #include "GL/gl.h" #include #include using namespace std; int main() { Display *const display = XOpenDisplay(0); if (display == 0) { cerr << "Could not open a display.\n"; return EXIT_FAILURE; } cout << "Opened a display whose connection number is " << XConnectionNumber(display) << ".\n"; if (!glXQueryExtension(display, 0, 0)) { cerr << "X server has no OpenGL GLX extension.\n"; return EXIT_FAILURE; } cout << "The display has an OpenGL GLX extension.\n"; if (const GLubyte *const p = glGetString(GL_EXTENSIONS)) { cout << "GL extensions: \"" << p << "\"\n"; } else { cout << "No GL extensions.\n"; } int attributeList[] = { //GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 24, None }; XVisualInfo *const visual = glXChooseVisual(display, DefaultScreen(display), attributeList); if (visual == 0) { cerr << "Couldn't get a Visual\n"; return EXIT_FAILURE; } /* Before i5.nyu.edu had /dev/winlock, glXCreateContext caused Xvfb to Segmentation Fault(coredump). Now that we have /devwinlock, glXCreateContext causes Xvfb say fstat: Bad file number. */ const GLXContext context = glXCreateContext(display, visual, 0, GL_TRUE); if (context == 0) { cerr << "Couldn't get a GLXContext\n"; return EXIT_FAILURE; } XCloseDisplay(display); cout << "The display is closed.\n"; return EXIT_SUCCESS; }