Mesa (mesa_7_5_branch): demos: fix issues in glxcontexts.c

Brian Paul brianp at kemper.freedesktop.org
Tue Jun 23 15:31:30 UTC 2009


Module: Mesa
Branch: mesa_7_5_branch
Commit: b79e6a59d89119953e3d11576b5fb221a671e472
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b79e6a59d89119953e3d11576b5fb221a671e472

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jun 23 09:31:27 2009 -0600

demos: fix issues in glxcontexts.c

The reshape() function was called when there was no GLX context so
the viewport/modelview/projection setup wasn't doing anything.  Move
the call to reshape() into draw().

Also, remove -stereo, -fullscreen options and do some general clean-up.

---

 progs/xdemos/glxcontexts.c |  160 +++++++++++++-------------------------------
 1 files changed, 46 insertions(+), 114 deletions(-)

diff --git a/progs/xdemos/glxcontexts.c b/progs/xdemos/glxcontexts.c
index a97b62a..481749b 100644
--- a/progs/xdemos/glxcontexts.c
+++ b/progs/xdemos/glxcontexts.c
@@ -20,16 +20,17 @@
  */
 
 /*
- * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT)
- * Port by Brian Paul  23 March 2001
+ * Version of glxgears that creates/destroys the rendering context for each
+ * frame.  Also periodically destroy/recreate the window.
+ * Good for finding memory leaks, etc.
  *
  * Command line options:
  *    -info      print GL implementation information
- *    -stereo    use stereo enabled GLX visual
  *
  */
 
 
+#include <assert.h>
 #include <math.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -92,13 +93,8 @@ static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
 static GLint gear1, gear2, gear3;
 static GLfloat angle = 0.0;
 
-static GLboolean fullscreen = GL_FALSE;	/* Create a single fullscreen window */
-static GLboolean stereo = GL_FALSE;	/* Enable stereo.  */
-static GLfloat eyesep = 5.0;		/* Eye separation. */
-static GLfloat fix_point = 40.0;	/* Fixation point distance.  */
-static GLfloat left, right, asp;	/* Stereo frustum params.  */
-
-   XVisualInfo *visinfo;
+static XVisualInfo *visinfo = NULL;
+static int WinWidth = 300, WinHeight = 300;
 
 
 /*
@@ -272,22 +268,13 @@ do_draw(void)
 }
 
 
-
 /* new window size or exposure */
 static void
 reshape(int width, int height)
 {
    glViewport(0, 0, (GLint) width, (GLint) height);
 
-   if (stereo) {
-      GLfloat w;
-
-      asp = (GLfloat) height / (GLfloat) width;
-      w = fix_point * (1.0 / 5.0);
-
-      left = -5.0 * ((w - 0.5 * eyesep) / fix_point);
-      right = 5.0 * ((w + 0.5 * eyesep) / fix_point);
-   } else {
+   {
       GLfloat h = (GLfloat) height / (GLfloat) width;
 
       glMatrixMode(GL_PROJECTION);
@@ -299,7 +286,6 @@ reshape(int width, int height)
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -40.0);
 }
-   
 
 
 static void
@@ -337,7 +323,7 @@ init(void)
 
    glEnable(GL_NORMALIZE);
 }
-
+   
 
 static void
 draw( Display *dpy, Window win )
@@ -354,36 +340,9 @@ draw( Display *dpy, Window win )
 
    init();
 
-   if (stereo) {
-      /* First left eye.  */
-      glDrawBuffer(GL_BACK_LEFT);
-
-      glMatrixMode(GL_PROJECTION);
-      glLoadIdentity();
-      glFrustum(left, right, -asp, asp, 5.0, 60.0);
+   reshape(WinWidth, WinHeight);
 
-      glMatrixMode(GL_MODELVIEW);
-
-      glPushMatrix();
-      glTranslated(+0.5 * eyesep, 0.0, 0.0);
-      do_draw();
-      glPopMatrix();
-
-      /* Then right eye.  */
-      glDrawBuffer(GL_BACK_RIGHT);
-
-      glMatrixMode(GL_PROJECTION);
-      glLoadIdentity();
-      glFrustum(-right, -left, -asp, asp, 5.0, 60.0);
-
-      glMatrixMode(GL_MODELVIEW);
-
-      glPushMatrix();
-      glTranslated(-0.5 * eyesep, 0.0, 0.0);
-      do_draw();
-      glPopMatrix();
-   } else
-      do_draw();
+   do_draw();
 
    glDeleteLists(gear1, 1);
    glDeleteLists(gear2, 1);
@@ -410,14 +369,6 @@ make_window( Display *dpy, const char *name,
                      GLX_DOUBLEBUFFER,
                      GLX_DEPTH_SIZE, 1,
                      None };
-   int stereoAttribs[] = { GLX_RGBA,
-                           GLX_RED_SIZE, 1,
-                           GLX_GREEN_SIZE, 1,
-                           GLX_BLUE_SIZE, 1,
-                           GLX_DOUBLEBUFFER,
-                           GLX_DEPTH_SIZE, 1,
-                           GLX_STEREO,
-                           None };
    int scrnum;
    XSetWindowAttributes attr;
    unsigned long mask;
@@ -427,22 +378,9 @@ make_window( Display *dpy, const char *name,
    scrnum = DefaultScreen( dpy );
    root = RootWindow( dpy, scrnum );
 
-   if (fullscreen) {
-      x = 0; y = 0;
-      width = DisplayWidth( dpy, scrnum );
-      height = DisplayHeight( dpy, scrnum );
-   }
-
-   if (stereo)
-      visinfo = glXChooseVisual( dpy, scrnum, stereoAttribs );
-   else
-      visinfo = glXChooseVisual( dpy, scrnum, attribs );
+   visinfo = glXChooseVisual( dpy, scrnum, attribs );
    if (!visinfo) {
-      if (stereo) {
-         printf("Error: couldn't get an RGB, "
-                "Double-buffered, Stereo visual\n");
-      } else
-         printf("Error: couldn't get an RGB, Double-buffered visual\n");
+      printf("Error: couldn't get an RGB, Double-buffered visual\n");
       exit(1);
    }
 
@@ -451,7 +389,7 @@ make_window( Display *dpy, const char *name,
    attr.border_pixel = 0;
    attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
    attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
-   attr.override_redirect = fullscreen;
+   attr.override_redirect = 0;
    mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
 
    win = XCreateWindow( dpy, root, x, y, width, height,
@@ -479,10 +417,9 @@ static void
 event_loop(Display *dpy)
 {
    Window win;
-   make_window(dpy, "glxgears", 0, 0, 300, 300, &win);
+   make_window(dpy, "glxgears", 0, 0, WinWidth, WinHeight, &win);
    XMapWindow(dpy, win);
 
-
    while (1) {
       while (XPending(dpy) > 0) {
          XEvent event;
@@ -492,34 +429,35 @@ event_loop(Display *dpy)
             /* we'll redraw below */
 	    break;
 	 case ConfigureNotify:
-	    reshape(event.xconfigure.width, event.xconfigure.height);
+            WinWidth = event.xconfigure.width;
+            WinHeight = event.xconfigure.height;
 	    break;
          case KeyPress:
-	 {
-	    char buffer[10];
-	    int r, code;
-	    code = XLookupKeysym(&event.xkey, 0);
-	    if (code == XK_Left) {
-	       view_roty += 5.0;
-	    }
-	    else if (code == XK_Right) {
-	       view_roty -= 5.0;
-	    }
-	    else if (code == XK_Up) {
-	       view_rotx += 5.0;
-	    }
-	    else if (code == XK_Down) {
-	       view_rotx -= 5.0;
-	    }
-	    else {
-	       r = XLookupString(&event.xkey, buffer, sizeof(buffer),
-				 NULL, NULL);
-	       if (buffer[0] == 27) {
-		  /* escape */
-		  return;
-	       }
-	    }
-	 }
+            {
+               char buffer[10];
+               int r, code;
+               code = XLookupKeysym(&event.xkey, 0);
+               if (code == XK_Left) {
+                  view_roty += 5.0;
+               }
+               else if (code == XK_Right) {
+                  view_roty -= 5.0;
+               }
+               else if (code == XK_Up) {
+                  view_rotx += 5.0;
+               }
+               else if (code == XK_Down) {
+                  view_rotx -= 5.0;
+               }
+               else {
+                  r = XLookupString(&event.xkey, buffer, sizeof(buffer),
+                                    NULL, NULL);
+                  if (buffer[0] == 27) {
+                     /* escape */
+                     return;
+                  }
+               }
+            }
          }
       }
 
@@ -550,9 +488,12 @@ event_loop(Display *dpy)
             printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds,
                    fps);
             tRate0 = t;
-	    
+
+            /* Destroy window and create new one */	    
 	    XDestroyWindow(dpy, win);
-	    make_window(dpy, "glxgears", (int)(fps * 100) % 100, (int)(fps * 100) % 100, 300, 300, &win);
+	    make_window(dpy, "glxgears",
+                        (int)(fps * 100) % 100, (int)(fps * 100) % 100, /* x,y */
+                        WinWidth, WinHeight, &win);
 	    XMapWindow(dpy, win);
 
             frames = 0;
@@ -562,7 +503,6 @@ event_loop(Display *dpy)
 }
 
 
-
 int
 main(int argc, char *argv[])
 {
@@ -579,12 +519,6 @@ main(int argc, char *argv[])
       else if (strcmp(argv[i], "-info") == 0) {
          printInfo = GL_TRUE;
       }
-      else if (strcmp(argv[i], "-stereo") == 0) {
-         stereo = GL_TRUE;
-      }
-      else if (strcmp(argv[i], "-fullscreen") == 0) {
-         fullscreen = GL_TRUE;
-      }
       else
 	 printf("Warrning: unknown parameter: %s\n", argv[i]);
    }
@@ -596,7 +530,6 @@ main(int argc, char *argv[])
       return -1;
    }
 
-
    if (printInfo) {
       printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
       printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
@@ -604,7 +537,6 @@ main(int argc, char *argv[])
       printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
    }
 
-
    event_loop(dpy);
 
    XCloseDisplay(dpy);




More information about the mesa-commit mailing list