xdemos/glsync: check glXMakeCurrent return value
[mesa.git] / progs / xdemos / glsync.c
index 95cd1af400415ecaee824f9f7d5a6a16300e4778..6108d991d01fdf3bd5ea66f6fb9634ae4eb5ba49 100644 (file)
@@ -59,6 +59,7 @@
 
 void (*video_sync_get)();
 void (*video_sync)();
+void (*swap_interval)();
 
 static int GLXExtensionSupported(Display *dpy, const char *extension)
 {
@@ -84,7 +85,7 @@ static int GLXExtensionSupported(Display *dpy, const char *extension)
 
 extern char *optarg;
 extern int optind, opterr, optopt;
-static char optstr[] = "w:h:s:v";
+static char optstr[] = "w:h:s:vi:";
 
 enum sync_type {
        none = 0,
@@ -95,11 +96,12 @@ enum sync_type {
 static void usage(char *name)
 {
        printf("usage: %s [-w <width>] [-h <height>] [-s<sync method>] "
-              "[-vc]\n", name);
+              "[-v]\n", name);
        printf("\t-s<sync method>:\n");
        printf("\t\tn: none\n");
        printf("\t\ts: SGI video sync extension\n");
        printf("\t\tb: buffer swap\n");
+       printf("\t-i<swap interval>\n");
        printf("\t-v: verbose (print count)\n");
        exit(-1);
 }
@@ -109,15 +111,29 @@ int main(int argc, char *argv[])
        Display *disp;
        XVisualInfo *pvi;
        XSetWindowAttributes swa;
-       int attrib[14];
        GLint last_val = -1, count = 0;
        Window winGL;
+       GLXContext context;
        int dummy;
        Atom wmDelete;
        enum sync_type waitforsync = none;
        int width = 500, height = 500, verbose = 0,
-               countonly = 0;
+               countonly = 0, interval = 1;
        int c, i = 1;
+       int ret;
+       int attribs[] = { GLX_RGBA,
+                     GLX_RED_SIZE, 1,
+                     GLX_GREEN_SIZE, 1,
+                     GLX_BLUE_SIZE, 1,
+                     None };
+       int db_attribs[] = { GLX_RGBA,
+                     GLX_RED_SIZE, 1,
+                     GLX_GREEN_SIZE, 1,
+                     GLX_BLUE_SIZE, 1,
+                     GLX_DOUBLEBUFFER,
+                     GLX_DEPTH_SIZE, 1,
+                     None };
+       XSizeHints sizehints;
 
        opterr = 0;
        while ((c = getopt(argc, argv, optstr)) != -1) {
@@ -147,6 +163,9 @@ int main(int argc, char *argv[])
                case 'v':
                        verbose = 1;
                        break;
+               case 'i':
+                       interval = atoi(optarg);
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -169,35 +188,17 @@ int main(int argc, char *argv[])
                return -1;
        }
 
-       attrib[0] = GLX_RGBA;
-       attrib[1] = 1;
-       attrib[2] = GLX_RED_SIZE;
-       attrib[3] = 1;
-       attrib[4] = GLX_GREEN_SIZE;
-       attrib[5] = 1;
-       attrib[6] = GLX_BLUE_SIZE;
-       attrib[7] = 1;
-       if (waitforsync != buffer_swap)
-               attrib[8] = None;
-       else {
-               attrib[8] = GLX_DOUBLEBUFFER;
-               attrib[9] = 1;
-               attrib[10] = None;
+       if (waitforsync != buffer_swap) {
+               pvi = glXChooseVisual(disp, DefaultScreen(disp), attribs);
+       } else {
+               pvi = glXChooseVisual(disp, DefaultScreen(disp), db_attribs);
        }
 
-       GLXContext context;
-       pvi = glXChooseVisual(disp, DefaultScreen(disp), attrib);
        if (!pvi) {
                fprintf(stderr, "failed to choose visual, exiting\n");
                return -1;
        }
 
-       context = glXCreateContext(disp, pvi, None, GL_TRUE);
-       if (!context) {
-               fprintf(stderr, "failed to create glx context\n");
-               return -1;
-       }
-
        pvi->screen = DefaultScreen(disp);
 
        swa.colormap = XCreateColormap(disp, RootWindow(disp, pvi->screen),
@@ -217,24 +218,58 @@ int main(int argc, char *argv[])
         wmDelete = XInternAtom(disp, "WM_DELETE_WINDOW", True);
         XSetWMProtocols(disp, winGL, &wmDelete, 1);
 
+       sizehints.x = 0;
+       sizehints.y = 0;
+       sizehints.width  = width;
+       sizehints.height = height;
+       sizehints.flags = USSize | USPosition;
+
+       XSetNormalHints(disp, winGL, &sizehints);
        XSetStandardProperties(disp, winGL, "glsync test", "glsync text",
-                              None, NULL, 0, NULL);
+                              None, NULL, 0, &sizehints);
 
-       XMapRaised(disp, winGL);
+       context = glXCreateContext(disp, pvi, NULL, GL_TRUE);
+       if (!context) {
+               fprintf(stderr, "failed to create glx context\n");
+               return -1;
+       }
 
-       glXMakeCurrent(disp, winGL, context);
+       XMapWindow(disp, winGL);
+       ret = glXMakeCurrent(disp, winGL, context);
+       if (ret) {
+               fprintf(stderr, "failed to make context current: %d\n", ret);
+       }
 
        video_sync_get = glXGetProcAddress((unsigned char *)"glXGetVideoSyncSGI");
        video_sync = glXGetProcAddress((unsigned char *)"glXWaitVideoSyncSGI");
 
-       if (!video_sync_get || !video_sync) {
+       swap_interval = glXGetProcAddress((unsigned char *)"glXSwapIntervalSGI");
+
+       if (!video_sync_get || !video_sync || !swap_interval) {
                fprintf(stderr, "failed to get sync functions\n");
                return -1;
        }
 
+       if (waitforsync == buffer_swap) {
+               swap_interval(interval);
+               fprintf(stderr, "set swap interval to %d\n", interval);
+       }
        video_sync_get(&count);
        count++;
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        while (i++) {
+               /* Alternate colors to make tearing obvious */
+               if (i & 1) {
+                       glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+                       glColor3f(1.0f, 1.0f, 1.0f);
+               } else {
+                       glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
+                       glColor3f(1.0f, 0.0f, 0.0f);
+               }
+
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+               glRectf(0, 0, width, height);
+
                /* Wait for vsync */
                if (waitforsync == sgi_video_sync) {
                        if (verbose)
@@ -245,6 +280,7 @@ int main(int argc, char *argv[])
                        if (count == last_val)
                                fprintf(stderr, "error:  count didn't change: %d\n", count);
                        last_val = count;
+                       glFlush();
                } else if (waitforsync == buffer_swap) {
                        glXSwapBuffers(disp, winGL);
                }
@@ -256,13 +292,10 @@ int main(int argc, char *argv[])
                        continue;
                }
 
-               /* Alternate colors to make tearing obvious */
-               if (i & 1)
-                       glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
-               else
-                       glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
-               glClear(GL_COLOR_BUFFER_BIT);
-               glFlush();
+               if (verbose) {
+                       video_sync_get(&count);
+                       fprintf(stderr, "current count: %d\n", count);
+               }
        }
 
        XDestroyWindow(disp, winGL);