/*
 * oglinfo.c 
 */

/*
 * This demo modified by BrianP to accomodate Mesa and test
 * * the GLX 1.1 functions.
 */

#include <GL/glx.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <string.h>

int visual_request0[] =
{None};									       /*

									        * don't need much of a visual 
									        */
int visual_request1[] =
{GLX_RGBA, None};							       /*

									        * in case CI failed 
									        */

int main(int argc, char **argv)
{
  char *display_name = NULL;
  char *string;
  Display *dpy;
  int screen_num;
  int major, minor;
  XVisualInfo *vis;
  GLXContext ctx;
  Window root, win;
  Colormap cmap;
  XSetWindowAttributes swa;
  int dontcare;

  /*
   * parse arguments 
   */
  if (argc > 1)
    if (!strcmp(argv[1], "-display"))
      display_name = argv[2];
    else {
      fprintf(stderr, "Usage: %s [-display <display>]\n", argv[0]);
      return -1;
    }

  /*
   * get display 
   */
  if (!(dpy = XOpenDisplay(display_name))) {
    fprintf(stderr, "Error: XOpenDisplay() failed.\n");
    return -1;
  }

  /*
   * does the server know about OpenGL & GLX? 
   */
#ifndef MESA
  if (!XQueryExtension(dpy, "GLX", &dontcare, &dontcare, &dontcare)) {
    fprintf(stderr, "This system doesn't appear to support OpenGL\n");
    return -1;
  }
#endif

  /*
   * find the glx version 
   */
  if (glXQueryVersion(dpy, &major, &minor))
    printf("GLX Version: %d.%d\n", major, minor);
  else {
    fprintf(stderr, "Error: glXQueryVersion() failed.\n");
    return -1;
  }

  /*
   * get screen number 
   */
  screen_num = DefaultScreen(dpy);

/*
 * This #ifdef isn't redundant. It keeps the build from breaking
 * ** if you are building on a machine that has an old (1.0) version
 * ** of glx.
 * **
 * ** This program could still be *run* on a machine that has an old 
 * ** version of glx, even if it was *compiled* on a version that has
 * ** a new version.
 * **
 * ** If compiled on a system with an old version of glx, then it will 
 * ** never recognize glx extensions, since that code would have been
 * ** #ifdef'ed out.
 */
#ifdef GLX_VERSION_1_1

  /*
   * ** This test guarantees that glx, on the display you are inquiring,
   * ** suppports glXQueryExtensionsString().
   */
  if (minor > 0 || major > 1)
    string = (char *)glXQueryExtensionsString(dpy, screen_num);
  else
    string = "";

  if (string)
    printf("GLX Extensions (client & server): %s\n",
	   string);
  else {
    fprintf(stderr, "Error: glXQueryExtensionsString() failed.\n");
    return -1;
  }

  if (minor > 0 || major > 1) {
    printf("glXGetClientString(GLX_VENDOR): %s\n", glXGetClientString(dpy, GLX_VENDOR));
    printf("glXGetClientString(GLX_VERSION): %s\n", glXGetClientString(dpy, GLX_VERSION));
    printf("glXGetClientString(GLX_EXTENSIONS): %s\n", glXGetClientString(dpy, GLX_EXTENSIONS));
    printf("glXQueryServerString(GLX_VENDOR): %s\n", glXQueryServerString(dpy, screen_num, GLX_VENDOR));
    printf("glXQueryServerString(GLX_VERSION): %s\n", glXQueryServerString(dpy, screen_num, GLX_VERSION));
    printf("glXQueryServerString(GLX_EXTENSIONS): %s\n", glXQueryServerString(dpy, screen_num, GLX_EXTENSIONS));
  }

#endif

  /*
   * get any valid OpenGL visual 
   */
  if (!(vis = glXChooseVisual(dpy, screen_num, visual_request0))) {
    if (!(vis = glXChooseVisual(dpy, screen_num, visual_request1))) {
      fprintf(stderr, "Error: glXChooseVisual() failed.\n");
      return -1;
    }
  }

  /*
   * get context 
   */
  ctx = glXCreateContext(dpy, vis, 0, GL_TRUE);

  /*
   * root window 
   */
  root = RootWindow(dpy, vis->screen);

  /*
   * get RGBA colormap 
   */
  cmap = XCreateColormap(dpy, root, vis->visual, AllocNone);

  /*
   * get window 
   */
  swa.colormap = cmap;
  swa.border_pixel = 0;
  swa.event_mask = StructureNotifyMask;
  win = XCreateWindow(dpy, root, 0, 0, 1, 1, 0, vis->depth,
		      InputOutput, vis->visual,
		      CWBorderPixel | CWColormap | CWEventMask,
		      &swa);

  glXMakeCurrent(dpy, win, ctx);

  string = (char *)glGetString(GL_VERSION);
  if (string)
#ifdef MESA
    printf("Mesa Version: %s\n", string);
#else
    printf("OpenGL Version: %s\n", string);
#endif
  else {
    fprintf(stderr, "Error: glGetString(GL_VERSION) failed.\n");
    return -1;
  }

  string = (char *)glGetString(GL_EXTENSIONS);

  if (string)
#ifdef MESA
    printf("Mesa Extensions: %s\n", string);
#else
    printf("OpenGL Extensions: %s\n", string);
#endif
  else {
    fprintf(stderr, "Error: glGetString(GL_EXTENSIONS) failed.\n");
    return -1;
  }

  string = (char *)glGetString(GL_RENDERER);

  if (string)
#ifdef MESA
    printf("Mesa Renderer: %s\n", string);
#else
    printf("OpenGL renderer: %s\n", string);
#endif
  else {
    fprintf(stderr, "Error: glGetString(GL_RENDERER) failed.\n");
    return -1;
  }

/*
 * ** This #ifdef prevents a build failure if you compile on an a
 * ** machine with an old GLU library. 
 * **
 * ** If you build on a pre GLU 1.1 machine, you will never be able
 * ** to get glu info, even if you run on a GLU 1.1 or latter machine,
 * ** since the code has been #ifdef'ed out.
 */
#ifdef GLU_VERSION_1_1

  /*
   * ** If the glx version is 1.1 or latter, gluGetString() is guaranteed
   * ** to exist.
   */
  if (minor > 0 || major > 1)
    string = (char *)gluGetString(GLU_VERSION);
  else
    string = "1.0";

  if (string)
    printf("GLU Version: %s\n", string);
  else {
    fprintf(stderr, "Error: gluGetString(GLU_VERSION) failed.\n");
    return -1;
  }

  if (minor > 0 || major > 1)
    string = (char *)gluGetString(GLU_EXTENSIONS);
  else
    string = "";

  if (string)
    printf("GLU Extensions: %s\n", string);
  else {
    fprintf(stderr, "Error: gluGetString(GLU_EXTENSIONS) failed.\n");
    return -1;
  }

#endif
  return 0;
}
