summaryrefslogtreecommitdiffstats
path: root/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c')
-rw-r--r--examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c
new file mode 100644
index 000000000..3c1a21e68
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c
@@ -0,0 +1,147 @@
+
+/* 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;
+}