diff options
-rw-r--r-- | progs/xdemos/omlsync.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/progs/xdemos/omlsync.c b/progs/xdemos/omlsync.c index 4eee849b53..f2c1d13f81 100644 --- a/progs/xdemos/omlsync.c +++ b/progs/xdemos/omlsync.c @@ -69,6 +69,7 @@ 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) { @@ -94,14 +95,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 +117,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 +152,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 +177,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 +235,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) { @@ -240,6 +257,11 @@ int main(int argc, char *argv[]) glRectf(0, 0, width, height); glXSwapBuffersMscOML(disp, winGL, 0, divisor, remainder); + + if (wait_interval) { + glXWaitForMscOML(disp, winGL, msc + wait_interval, + 0, 0, &ust, &msc, &sbc); + } } XDestroyWindow(disp, winGL); |