Merge branch '7.8' into master
[mesa.git] / progs / xdemos / omlsync.c
index 4eee849b532ad7d5707645ab2e3ef14aa723744f..061d6c68613ba930f8ec00684d2d5c31d5d57883 100644 (file)
@@ -69,22 +69,16 @@ Bool (*glXWaitForMscOML)(Display *dpy, GLXDrawable drawable, int64_t target_msc,
                         int64_t *msc, int64_t *sbc);
 Bool (*glXWaitForSbcOML)(Display *dpy, GLXDrawable drawable, int64_t target_sbc,
                         int64_t *ust, int64_t *msc, int64_t *sbc);
+int (*glXSwapInterval)(int interval);
 
 static int GLXExtensionSupported(Display *dpy, const char *extension)
 {
-       const char *extensionsString, *client_extensions, *pos;
+       const char *extensionsString, *pos;
 
        extensionsString = glXQueryExtensionsString(dpy, DefaultScreen(dpy));
-       client_extensions = glXGetClientString(dpy, GLX_EXTENSIONS);
 
        pos = strstr(extensionsString, extension);
 
-       if (pos != NULL && (pos == extensionsString || pos[-1] == ' ') &&
-           (pos[strlen(extension)] == ' ' || pos[strlen(extension)] == '\0'))
-               return 1;
-
-       pos = strstr(client_extensions, extension);
-
        if (pos != NULL && (pos == extensionsString || pos[-1] == ' ') &&
            (pos[strlen(extension)] == ' ' || pos[strlen(extension)] == '\0'))
                return 1;
@@ -94,14 +88,15 @@ static int GLXExtensionSupported(Display *dpy, const char *extension)
 
 extern char *optarg;
 extern int optind, opterr, optopt;
-static char optstr[] = "w:h:vd:r:n:";
+static char optstr[] = "w:h:vd:r:n:i:";
 
 static void usage(char *name)
 {
-       printf("usage: %s [-w <width>] [-h <height>] [-i<swap interval>] "
-              "[-n<wait interval>] [-v]\n", name);
+       printf("usage: %s [-w <width>] [-h <height>] ...\n", name);
+       printf("\t-d<divisor> - divisor for OML swap\n");
+       printf("\t-r<remainder> - remainder for OML swap\n");
+       printf("\t-n<interval> - wait interval for OML WaitMSC\n");
        printf("\t-i<swap interval> - swap at most once every n frames\n");
-       printf("\t-n<wait interval> - wait n frames between swaps\n");
        printf("\t-v: verbose (print count)\n");
        exit(-1);
 }
@@ -115,8 +110,9 @@ int main(int argc, char *argv[])
        GLXContext context;
        int dummy;
        Atom wmDelete;
+       int64_t ust, msc, sbc;
        int width = 500, height = 500, verbose = 0, divisor = 0, remainder = 0,
-          wait_interval = 0;
+               wait_interval = 0, swap_interval = 1;
        int c, i = 1;
        int ret;
        int db_attribs[] = { GLX_RGBA,
@@ -149,6 +145,9 @@ int main(int argc, char *argv[])
                case 'n':
                        wait_interval = atoi(optarg);
                        break;
+               case 'i':
+                       swap_interval = atoi(optarg);
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -171,6 +170,11 @@ int main(int argc, char *argv[])
                return -1;
        }
 
+       if (!GLXExtensionSupported(disp, "GLX_MESA_swap_control")) {
+               fprintf(stderr, "GLX_MESA_swap_control not supported\n");
+               return -1;
+       }
+
        pvi = glXChooseVisual(disp, DefaultScreen(disp), db_attribs);
 
        if (!pvi) {
@@ -224,8 +228,14 @@ int main(int argc, char *argv[])
        glXSwapBuffersMscOML = (void *)glXGetProcAddress((unsigned char *)"glXSwapBuffersMscOML");
        glXWaitForMscOML = (void *)glXGetProcAddress((unsigned char *)"glXWaitForMscOML");
        glXWaitForSbcOML = (void *)glXGetProcAddress((unsigned char *)"glXWaitForSbcOML");
+       glXSwapInterval = (void *)glXGetProcAddress((unsigned char *)"glXSwapIntervalMESA");
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glXSwapInterval(swap_interval);
+       fprintf(stderr, "set swap interval to %d\n", swap_interval);
+
+       glXGetSyncValuesOML(disp, winGL, &ust, &msc, &sbc);
        while (i++) {
                /* Alternate colors to make tearing obvious */
                if (i & 1) {
@@ -239,7 +249,14 @@ int main(int argc, char *argv[])
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                glRectf(0, 0, width, height);
 
-               glXSwapBuffersMscOML(disp, winGL, 0, divisor, remainder);
+               if (!wait_interval)
+                       glXSwapBuffersMscOML(disp, winGL, 0, divisor,
+                                            remainder);
+               else {
+                       glXWaitForMscOML(disp, winGL, msc + wait_interval,
+                                        divisor, remainder, &ust, &msc, &sbc);
+                       glXSwapBuffersMscOML(disp, winGL, 0, 0, 0);
+               }
        }
 
        XDestroyWindow(disp, winGL);