home *** CD-ROM | disk | FTP | other *** search
-
- /* Copyright (c) Mark J. Kilgard, 1996. */
-
- /* This program is freely distributable without licensing fees
- and is provided without guarantee or warrantee expressed or
- implied. This program is -not- in the public domain. */
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <X11/Xlib.h>
- #include <GL/glx.h>
-
- static char *ClassOf(int c);
- static char *Format(int n, int w);
-
- void
- main(int argc, char *argv[])
- {
- Display *dpy;
- XVisualInfo match, *visualList, *vi, *visualToTry;
- int errorBase, eventBase, major, minor, found;
- int glxCapable, bufferSize, level, renderType, doubleBuffer, stereo,
- auxBuffers, redSize, greenSize, blueSize, alphaSize, depthSize,
- stencilSize, acRedSize, acGreenSize, acBlueSize, acAlphaSize;
-
- dpy = XOpenDisplay(NULL);
- if (!dpy) {
- fprintf(stderr, "Could not connect to %s.\n", XDisplayName(NULL));
- exit(1);
- }
- if (glXQueryExtension(dpy, &errorBase, &eventBase) == False) {
- fprintf(stderr, "OpenGL not supported by X server.\n");
- exit(1);
- }
-
- glXQueryVersion(dpy, &major, &minor);
- printf("display: %s\n", XDisplayName(NULL));
- printf("using GLX version: %d.%d\n\n", major, minor);
-
- match.screen = DefaultScreen(dpy);
- visualList = XGetVisualInfo(dpy, VisualScreenMask, &match, &found);
-
- printf(" visual bf lv rg d st r g b a ax dp st accum buffs\n");
- printf(" id dep cl sz l ci b ro sz sz sz sz bf th cl r g b a\n");
- printf("-------------------------------------------------------------\n");
-
- visualToTry = NULL;
- for(vi = visualList; found > 0; found--, vi++) {
- glXGetConfig(dpy, vi, GLX_USE_GL, &glxCapable);
- if (glxCapable) {
- printf("0x%x %2d %s", vi->visualid, vi->depth, ClassOf(vi->class));
- glXGetConfig(dpy, vi, GLX_BUFFER_SIZE, &bufferSize);
- glXGetConfig(dpy, vi, GLX_LEVEL, &level);
- glXGetConfig(dpy, vi, GLX_RGBA, &renderType);
- glXGetConfig(dpy, vi, GLX_DOUBLEBUFFER, &doubleBuffer);
- glXGetConfig(dpy, vi, GLX_STEREO, &stereo);
- glXGetConfig(dpy, vi, GLX_AUX_BUFFERS, &auxBuffers);
- glXGetConfig(dpy, vi, GLX_RED_SIZE, &redSize);
- glXGetConfig(dpy, vi, GLX_GREEN_SIZE, &greenSize);
- glXGetConfig(dpy, vi, GLX_BLUE_SIZE, &blueSize);
- glXGetConfig(dpy, vi, GLX_ALPHA_SIZE, &alphaSize);
- glXGetConfig(dpy, vi, GLX_DEPTH_SIZE, &depthSize);
- glXGetConfig(dpy, vi, GLX_STENCIL_SIZE, &stencilSize);
- glXGetConfig(dpy, vi, GLX_ACCUM_RED_SIZE, &acRedSize);
- glXGetConfig(dpy, vi, GLX_ACCUM_GREEN_SIZE, &acGreenSize);
- glXGetConfig(dpy, vi, GLX_ACCUM_BLUE_SIZE, &acBlueSize);
- glXGetConfig(dpy, vi, GLX_ACCUM_ALPHA_SIZE, &acAlphaSize);
- printf(" %2s %2s %1s %1s %1s ",
- Format(bufferSize, 2), Format(level, 2),
- renderType ? "r" : "c",
- doubleBuffer ? "y" : ".",
- stereo ? "y" : ".");
- printf("%2s %2s %2s %2s ",
- Format(redSize, 2), Format(greenSize, 2),
- Format(blueSize, 2), Format(alphaSize, 2));
- printf("%2s %2s %2s %2s %2s %2s %2s",
- Format(auxBuffers, 2), Format(depthSize, 2), Format(stencilSize, 2),
- Format(acRedSize, 2), Format(acGreenSize, 2),
- Format(acBlueSize, 2), Format(acAlphaSize, 2));
- printf("\n");
- visualToTry = vi;
- }
- }
-
- if (visualToTry) {
- GLXContext context;
- Window window;
- Colormap colormap;
- XSetWindowAttributes swa;
-
- context = glXCreateContext(dpy, visualToTry, 0, GL_TRUE);
- colormap = XCreateColormap(dpy,
- RootWindow(dpy, visualToTry->screen),
- visualToTry->visual, AllocNone);
- swa.colormap = colormap;
- swa.border_pixel = 0;
- window = XCreateWindow(dpy, RootWindow(dpy, visualToTry->screen), 0, 0, 100, 100,
- 0, visualToTry->depth, InputOutput, visualToTry->visual,
- CWBorderPixel | CWColormap, &swa);
- glXMakeCurrent(dpy, window, context);
- printf("\n");
- printf("OpenGL vendor string: %s\n", glGetString(GL_VENDOR));
- printf("OpenGL renderer string: %s\n", glGetString(GL_RENDERER));
- printf("OpenGL version string: %s\n", glGetString(GL_VERSION));
- if (glXIsDirect(dpy, context))
- printf("direct rendering: supported\n");
- printf( "GL extensions: '%s'\n\n", glGetString(GL_EXTENSIONS) );
- #if defined(GLX_VERSION_1_1)
- printf( "GLX extensions: '%s'\n\n", glXQueryExtensionsString( dpy, visualToTry->screen ) );
- #endif
-
- } else
- printf("No GLX-capable visuals!\n");
- XFree(visualList);
- }
-
- static char *
- ClassOf(int c)
- {
- switch (c) {
- case StaticGray: return "sg";
- case GrayScale: return "gs";
- case StaticColor: return "sc";
- case PseudoColor: return "pc";
- case TrueColor: return "tc";
- case DirectColor: return "dc";
- default: return "??";
- }
- }
-
- static char *
- Format(int n, int w)
- {
- static char buffer[256];
- static int bufptr;
- char *buf;
-
- if (bufptr >= sizeof(buffer) - w)
- bufptr = 0;
- buf = buffer + bufptr;
- if (n == 0)
- sprintf(buf, "%*s", w, ".");
- else
- sprintf(buf, "%*d", w, n);
- bufptr += w + 1;
- return buf;
- }
-