From e85fa91ec6655da593c0b8b31832045da5ad9ad4 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Thu, 2 May 2013 11:45:18 +0200 Subject: update Xorg to 7.7 --- package/MesaLib/patches/000-mesalib-xdemos.patch | 14774 ------------------- package/MesaLib/patches/patch-bin_mklib | 19 +- package/MesaLib/patches/patch-configs_default | 11 - .../patches/patch-include_GL_internal_sarea_h | 12 - package/MesaLib/patches/patch-src_glsl_Makefile | 17 +- .../MesaLib/patches/patch-src_glsl_apps_Makefile | 15 - package/MesaLib/patches/patch-src_mesa_Makefile | 21 - ...patch-src_mesa_drivers_dri_savage_savageioctl_c | 10 - .../MesaLib/patches/patch-src_mesa_main_imports_c | 17 - .../patch-src_mesa_shader_slang_library_Makefile | 11 - 10 files changed, 20 insertions(+), 14887 deletions(-) delete mode 100644 package/MesaLib/patches/000-mesalib-xdemos.patch delete mode 100644 package/MesaLib/patches/patch-configs_default delete mode 100644 package/MesaLib/patches/patch-include_GL_internal_sarea_h delete mode 100644 package/MesaLib/patches/patch-src_glsl_apps_Makefile delete mode 100644 package/MesaLib/patches/patch-src_mesa_Makefile delete mode 100644 package/MesaLib/patches/patch-src_mesa_drivers_dri_savage_savageioctl_c delete mode 100644 package/MesaLib/patches/patch-src_mesa_main_imports_c delete mode 100644 package/MesaLib/patches/patch-src_mesa_shader_slang_library_Makefile (limited to 'package/MesaLib/patches') diff --git a/package/MesaLib/patches/000-mesalib-xdemos.patch b/package/MesaLib/patches/000-mesalib-xdemos.patch deleted file mode 100644 index 0ebf160e5..000000000 --- a/package/MesaLib/patches/000-mesalib-xdemos.patch +++ /dev/null @@ -1,14774 +0,0 @@ -diff -Naurp Mesa-7.8.1/progs/xdemos/corender.c Mesa-7.8.1.patched/progs/xdemos/corender.c ---- Mesa-7.8.1/progs/xdemos/corender.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/corender.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,400 @@ -+/** -+ * Example of cooperative rendering into one window by two processes. -+ * The first instance of the program creates the GLX window. -+ * The second instance of the program gets the window ID from the first -+ * and draws into it. -+ * Socket IPC is used for synchronization. -+ * -+ * Usage: -+ * 1. run 'corender &' -+ * 2. run 'corender 2' (any arg will do) -+ * -+ * Brian Paul -+ * 11 Oct 2007 -+ */ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ipc.h" -+ -+ -+#ifndef M_PI -+#define M_PI 3.14159265358979323846 -+#endif -+ -+static int MyID = 0; /* 0 or 1 */ -+static int WindowID = 0; -+static GLXContext Context = 0; -+static int Width = 700, Height = 350; -+static int Rot = 0; -+static int Sock = 0; -+ -+static GLfloat Red[4] = {1.0, 0.2, 0.2, 1.0}; -+static GLfloat Blue[4] = {0.2, 0.2, 1.0, 1.0}; -+ -+static int Sync = 1; /** synchronized rendering? */ -+ -+ -+static void -+setup_ipc(void) -+{ -+ int k, port = 10001; -+ -+ if (MyID == 0) { -+ /* I'm the first one, wait for connection from second */ -+ k = CreatePort(&port); -+ assert(k != -1); -+ -+ printf("Waiting for connection from another 'corender'\n"); -+ Sock = AcceptConnection(k); -+ assert(Sock != -1); -+ -+ printf("Got connection, sending windowID\n"); -+ -+ /* send windowID */ -+ SendData(Sock, &WindowID, sizeof(WindowID)); -+ } -+ else { -+ /* I'm the second one, connect to first */ -+ char hostname[1000]; -+ -+ MyHostName(hostname, 1000); -+ Sock = Connect(hostname, port); -+ assert(Sock != -1); -+ -+ /* get windowID */ -+ ReceiveData(Sock, &WindowID, sizeof(WindowID)); -+ printf("Contacted first 'corender', getting WindowID\n"); -+ } -+} -+ -+ -+ -+/** from GLUT */ -+static void -+doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings) -+{ -+ int i, j; -+ GLfloat theta, phi, theta1; -+ GLfloat cosTheta, sinTheta; -+ GLfloat cosTheta1, sinTheta1; -+ GLfloat ringDelta, sideDelta; -+ -+ ringDelta = 2.0 * M_PI / rings; -+ sideDelta = 2.0 * M_PI / nsides; -+ -+ theta = 0.0; -+ cosTheta = 1.0; -+ sinTheta = 0.0; -+ for (i = rings - 1; i >= 0; i--) { -+ theta1 = theta + ringDelta; -+ cosTheta1 = cos(theta1); -+ sinTheta1 = sin(theta1); -+ glBegin(GL_QUAD_STRIP); -+ phi = 0.0; -+ for (j = nsides; j >= 0; j--) { -+ GLfloat cosPhi, sinPhi, dist; -+ -+ phi += sideDelta; -+ cosPhi = cos(phi); -+ sinPhi = sin(phi); -+ dist = R + r * cosPhi; -+ -+ glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); -+ glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi); -+ glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); -+ glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); -+ } -+ glEnd(); -+ theta = theta1; -+ cosTheta = cosTheta1; -+ sinTheta = sinTheta1; -+ } -+} -+ -+ -+static void -+redraw(Display *dpy) -+{ -+ int dbg = 0; -+ -+ glXMakeCurrent(dpy, WindowID, Context); -+ glEnable(GL_LIGHTING); -+ glEnable(GL_LIGHT0); -+ glEnable(GL_DEPTH_TEST); -+ glClearColor(0.5, 0.5, 0.5, 0.0); -+ -+ if (MyID == 0) { -+ /* First process */ -+ -+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -+ -+ glPushMatrix(); -+ glTranslatef(-1, 0, 0); -+ glRotatef(Rot, 1, 0, 0); -+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Red); -+ doughnut(0.5, 2.0, 20, 30); -+ glPopMatrix(); -+ -+ glFinish(); -+ if (!Sync) { -+ usleep(1000*10); -+ } -+ -+ /* signal second process to render */ -+ if (Sync) { -+ int code = 1; -+ if (dbg) printf("0: send signal\n"); -+ SendData(Sock, &code, sizeof(code)); -+ SendData(Sock, &Rot, sizeof(Rot)); -+ } -+ -+ /* wait for second process to finish rendering */ -+ if (Sync) { -+ int code = 0; -+ if (dbg) printf("0: wait signal\n"); -+ ReceiveData(Sock, &code, sizeof(code)); -+ if (dbg) printf("0: got signal\n"); -+ assert(code == 2); -+ } -+ -+ } -+ else { -+ /* Second process */ -+ -+ /* wait for first process's signal for me to render */ -+ if (Sync) { -+ int code = 0; -+ if (dbg) printf("1: wait signal\n"); -+ ReceiveData(Sock, &code, sizeof(code)); -+ ReceiveData(Sock, &Rot, sizeof(Rot)); -+ -+ if (dbg) printf("1: got signal\n"); -+ assert(code == 1); -+ } -+ -+ /* XXX this clear should not be here, but for some reason, it -+ * makes things _mostly_ work correctly w/ NVIDIA's driver. -+ * There's only occasional glitches. -+ * Without this glClear(), depth buffer for the second process -+ * is pretty much broken. -+ */ -+ /* glClear(GL_DEPTH_BUFFER_BIT); */ -+ -+ glPushMatrix(); -+ glTranslatef(1, 0, 0); -+ glRotatef(Rot + 90 , 1, 0, 0); -+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Blue); -+ doughnut(0.5, 2.0, 20, 30); -+ glPopMatrix(); -+ glFinish(); -+ -+ glXSwapBuffers(dpy, WindowID); -+ usleep(1000*10); -+ -+ /* signal first process that I'm done rendering */ -+ if (Sync) { -+ int code = 2; -+ if (dbg) printf("1: send signal\n"); -+ SendData(Sock, &code, sizeof(code)); -+ } -+ } -+} -+ -+ -+static void -+resize(Display *dpy, int width, int height) -+{ -+ float ar = (float) width / height; -+ -+ glXMakeCurrent(dpy, WindowID, Context); -+ -+ glViewport(0, 0, width, height); -+ glMatrixMode(GL_PROJECTION); -+ glLoadIdentity(); -+ glFrustum(-ar, ar, 1.0, -1.0, 5.0, 200.0); -+ glMatrixMode(GL_MODELVIEW); -+ glLoadIdentity(); -+ glTranslatef(0, 0, -15); -+ -+ Width = width; -+ Height = height; -+} -+ -+ -+ -+static void -+set_window_title(Display *dpy, Window win, const char *title) -+{ -+ XSizeHints sizehints; -+ sizehints.flags = 0; -+ XSetStandardProperties(dpy, win, title, title, -+ None, (char **)NULL, 0, &sizehints); -+} -+ -+ -+static Window -+make_gl_window(Display *dpy, XVisualInfo *visinfo, int width, int height) -+{ -+ int scrnum; -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root; -+ Window win; -+ int x = 0, y = 0; -+ char *name = NULL; -+ -+ scrnum = DefaultScreen( dpy ); -+ root = RootWindow( dpy, scrnum ); -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -+ -+ win = XCreateWindow( dpy, root, x, y, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr ); -+ -+ /* set hints and properties */ -+ { -+ XSizeHints sizehints; -+ sizehints.x = x; -+ sizehints.y = y; -+ sizehints.width = width; -+ sizehints.height = height; -+ sizehints.flags = USSize | USPosition; -+ XSetNormalHints(dpy, win, &sizehints); -+ XSetStandardProperties(dpy, win, name, name, -+ None, (char **)NULL, 0, &sizehints); -+ } -+ -+ return win; -+} -+ -+ -+static void -+set_event_mask(Display *dpy, Window win) -+{ -+ XSetWindowAttributes attr; -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ XChangeWindowAttributes(dpy, win, CWEventMask, &attr); -+} -+ -+ -+static void -+event_loop(Display *dpy) -+{ -+ while (1) { -+ while (XPending(dpy) > 0) { -+ XEvent event; -+ XNextEvent(dpy, &event); -+ -+ switch (event.type) { -+ case Expose: -+ redraw(dpy); -+ break; -+ case ConfigureNotify: -+ resize(dpy, event.xconfigure.width, event.xconfigure.height); -+ break; -+ case KeyPress: -+ { -+ char buffer[10]; -+ int r, code; -+ code = XLookupKeysym(&event.xkey, 0); -+ if (code == XK_Left) { -+ } -+ else { -+ r = XLookupString(&event.xkey, buffer, sizeof(buffer), -+ NULL, NULL); -+ if (buffer[0] == 27) { -+ exit(0); -+ } -+ } -+ } -+ default: -+ /* nothing */ -+ ; -+ } -+ } -+ -+ if (MyID == 0 || !Sync) -+ Rot += 1; -+ redraw(dpy); -+ } -+} -+ -+ -+static XVisualInfo * -+choose_visual(Display *dpy) -+{ -+ int attribs[] = { GLX_RGBA, -+ GLX_RED_SIZE, 1, -+ GLX_GREEN_SIZE, 1, -+ GLX_BLUE_SIZE, 1, -+ GLX_DOUBLEBUFFER, -+ GLX_DEPTH_SIZE, 1, -+ None }; -+ int scrnum = DefaultScreen( dpy ); -+ return glXChooseVisual(dpy, scrnum, attribs); -+} -+ -+ -+static void -+parse_opts(int argc, char *argv[]) -+{ -+ if (argc > 1) { -+ MyID = 1; -+ } -+} -+ -+ -+int -+main( int argc, char *argv[] ) -+{ -+ Display *dpy; -+ XVisualInfo *visinfo; -+ -+ parse_opts(argc, argv); -+ -+ dpy = XOpenDisplay(NULL); -+ -+ visinfo = choose_visual(dpy); -+ -+ Context = glXCreateContext( dpy, visinfo, NULL, True ); -+ if (!Context) { -+ printf("Error: glXCreateContext failed\n"); -+ exit(1); -+ } -+ -+ if (MyID == 0) { -+ WindowID = make_gl_window(dpy, visinfo, Width, Height); -+ set_window_title(dpy, WindowID, "corender"); -+ XMapWindow(dpy, WindowID); -+ /*printf("WindowID 0x%x\n", (int) WindowID);*/ -+ } -+ -+ /* do ipc hand-shake here */ -+ setup_ipc(); -+ assert(Sock); -+ assert(WindowID); -+ -+ if (MyID == 1) { -+ set_event_mask(dpy, WindowID); -+ } -+ -+ resize(dpy, Width, Height); -+ -+ event_loop(dpy); -+ -+ return 0; -+} -diff -Naurp Mesa-7.8.1/progs/xdemos/glsync.c Mesa-7.8.1.patched/progs/xdemos/glsync.c ---- Mesa-7.8.1/progs/xdemos/glsync.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/glsync.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,295 @@ -+/* -+ * Copyright © 2007 Intel Corporation -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the next -+ * paragraph) shall be included in all copies or substantial portions of the -+ * Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -+ * IN THE SOFTWARE. -+ * -+ * Authors: -+ * Jesse Barnes -+ * -+ */ -+ -+/** @file glsync.c -+ * The program is simple: it paints a window alternating colors (red & -+ * white) either as fast as possible or synchronized to vblank events -+ * -+ * If run normally, the program should display a window that exhibits -+ * significant tearing between red and white colors (e.g. you might get -+ * a "waterfall" effect of red and white horizontal bars). -+ * -+ * If run with the '-s b' option, the program should synchronize the -+ * window color changes with the vertical blank period, resulting in a -+ * window that looks orangish with a high frequency flicker (which may -+ * be invisible). If the window is moved to another screen, this -+ * property should be preserved. If the window spans two screens, it -+ * shouldn't tear on whichever screen most of the window is on; the -+ * portion on the other screen may show some tearing (like the -+ * waterfall effect above). -+ * -+ * Other options include '-w ' and '-h -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+void (*video_sync_get)(); -+void (*video_sync)(); -+void (*swap_interval)(); -+ -+static int GLXExtensionSupported(Display *dpy, const char *extension) -+{ -+ const char *extensionsString, *pos; -+ -+ extensionsString = glXQueryExtensionsString(dpy, DefaultScreen(dpy)); -+ -+ pos = strstr(extensionsString, extension); -+ -+ if (pos != NULL && (pos == extensionsString || pos[-1] == ' ') && -+ (pos[strlen(extension)] == ' ' || pos[strlen(extension)] == '\0')) -+ return 1; -+ -+ return 0; -+} -+ -+extern char *optarg; -+extern int optind, opterr, optopt; -+static char optstr[] = "w:h:s:vi:"; -+ -+enum sync_type { -+ none = 0, -+ sgi_video_sync, -+ buffer_swap -+}; -+ -+static void usage(char *name) -+{ -+ printf("usage: %s [-w ] [-h ] [-s] " -+ "[-v]\n", name); -+ printf("\t-s:\n"); -+ printf("\t\tn: none\n"); -+ printf("\t\ts: SGI video sync extension\n"); -+ printf("\t\tb: buffer swap\n"); -+ printf("\t-i\n"); -+ printf("\t-v: verbose (print count)\n"); -+ exit(-1); -+} -+ -+int main(int argc, char *argv[]) -+{ -+ Display *disp; -+ XVisualInfo *pvi; -+ XSetWindowAttributes swa; -+ 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, 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) { -+ switch (c) { -+ case 'w': -+ width = atoi(optarg); -+ break; -+ case 'h': -+ height = atoi(optarg); -+ break; -+ case 's': -+ switch (optarg[0]) { -+ case 'n': -+ waitforsync = none; -+ break; -+ case 's': -+ waitforsync = sgi_video_sync; -+ break; -+ case 'b': -+ waitforsync = buffer_swap; -+ break; -+ default: -+ usage(argv[0]); -+ break; -+ } -+ break; -+ case 'v': -+ verbose = 1; -+ break; -+ case 'i': -+ interval = atoi(optarg); -+ break; -+ default: -+ usage(argv[0]); -+ break; -+ } -+ } -+ -+ disp = XOpenDisplay(NULL); -+ if (!disp) { -+ fprintf(stderr, "failed to open display\n"); -+ return -1; -+ } -+ -+ if (!glXQueryExtension(disp, &dummy, &dummy)) { -+ fprintf(stderr, "glXQueryExtension failed\n"); -+ return -1; -+ } -+ -+ if (!GLXExtensionSupported(disp, "GLX_SGI_video_sync")) { -+ fprintf(stderr, "GLX_SGI_video_sync not supported, exiting\n"); -+ return -1; -+ } -+ -+ if (waitforsync != buffer_swap) { -+ pvi = glXChooseVisual(disp, DefaultScreen(disp), attribs); -+ } else { -+ pvi = glXChooseVisual(disp, DefaultScreen(disp), db_attribs); -+ } -+ -+ if (!pvi) { -+ fprintf(stderr, "failed to choose visual, exiting\n"); -+ return -1; -+ } -+ -+ pvi->screen = DefaultScreen(disp); -+ -+ swa.colormap = XCreateColormap(disp, RootWindow(disp, pvi->screen), -+ pvi->visual, AllocNone); -+ swa.border_pixel = 0; -+ swa.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | -+ StructureNotifyMask; -+ winGL = XCreateWindow(disp, RootWindow(disp, pvi->screen), -+ 0, 0, -+ width, height, -+ 0, pvi->depth, InputOutput, pvi->visual, -+ CWBorderPixel | CWColormap | CWEventMask, &swa); -+ if (!winGL) { -+ fprintf(stderr, "window creation failed\n"); -+ return -1; -+ } -+ 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, &sizehints); -+ -+ context = glXCreateContext(disp, pvi, NULL, GL_TRUE); -+ if (!context) { -+ fprintf(stderr, "failed to create glx context\n"); -+ return -1; -+ } -+ -+ 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"); -+ -+ 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) -+ fprintf(stderr, "waiting on count %d\n", count); -+ video_sync(2, (count + 1) % 2, &count); -+ if (count < last_val) -+ fprintf(stderr, "error: vblank count went backwards: %d -> %d\n", last_val, count); -+ 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); -+ } else { -+ video_sync_get(&count); -+ sleep(1); -+ glFinish(); -+ } -+ -+ if (verbose) { -+ video_sync_get(&count); -+ fprintf(stderr, "current count: %d\n", count); -+ } -+ } -+ -+ XDestroyWindow(disp, winGL); -+ glXDestroyContext(disp, context); -+ XCloseDisplay(disp); -+ -+ return 0; -+} -diff -Naurp Mesa-7.8.1/progs/xdemos/glthreads.c Mesa-7.8.1.patched/progs/xdemos/glthreads.c ---- Mesa-7.8.1/progs/xdemos/glthreads.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/glthreads.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,716 @@ -+/* -+ * Copyright (C) 2000 Brian Paul All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included -+ * in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+ -+/* -+ * This program tests GLX thread safety. -+ * Command line options: -+ * -p Open a display connection for each thread -+ * -l Enable application-side locking -+ * -n Number of threads to create (default is 2) -+ * -display Specify X display (default is $DISPLAY) -+ * -t Use texture mapping -+ * -+ * Brian Paul 20 July 2000 -+ */ -+ -+ -+/* -+ * Notes: -+ * - Each thread gets its own GLX context. -+ * -+ * - The GLX contexts share texture objects. -+ * -+ * - When 't' is pressed to update the texture image, the window/thread which -+ * has input focus is signalled to change the texture. The other threads -+ * should see the updated texture the next time they call glBindTexture. -+ */ -+ -+ -+#if defined(PTHREADS) /* defined by Mesa on Linux and other platforms */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+/* -+ * Each window/thread/context: -+ */ -+struct winthread { -+ Display *Dpy; -+ int Index; -+ pthread_t Thread; -+ Window Win; -+ GLXContext Context; -+ float Angle; -+ int WinWidth, WinHeight; -+ GLboolean NewSize; -+ GLboolean Initialized; -+ GLboolean MakeNewTexture; -+}; -+ -+ -+#define MAX_WINTHREADS 100 -+static struct winthread WinThreads[MAX_WINTHREADS]; -+static int NumWinThreads = 0; -+static volatile GLboolean ExitFlag = GL_FALSE; -+ -+static GLboolean MultiDisplays = 0; -+static GLboolean Locking = 0; -+static GLboolean Texture = GL_FALSE; -+static GLuint TexObj = 12; -+static GLboolean Animate = GL_TRUE; -+ -+static pthread_mutex_t Mutex; -+static pthread_cond_t CondVar; -+static pthread_mutex_t CondMutex; -+ -+ -+static void -+Error(const char *msg) -+{ -+ fprintf(stderr, "Error: %s\n", msg); -+ exit(1); -+} -+ -+ -+static void -+signal_redraw(void) -+{ -+ pthread_mutex_lock(&CondMutex); -+ pthread_cond_broadcast(&CondVar); -+ pthread_mutex_unlock(&CondMutex); -+} -+ -+ -+static void -+MakeNewTexture(struct winthread *wt) -+{ -+#define TEX_SIZE 128 -+ static float step = 0.0; -+ GLfloat image[TEX_SIZE][TEX_SIZE][4]; -+ GLint width; -+ int i, j; -+ -+ for (j = 0; j < TEX_SIZE; j++) { -+ for (i = 0; i < TEX_SIZE; i++) { -+ float dt = 5.0 * (j - 0.5 * TEX_SIZE) / TEX_SIZE; -+ float ds = 5.0 * (i - 0.5 * TEX_SIZE) / TEX_SIZE; -+ float r = dt * dt + ds * ds + step; -+ image[j][i][0] = -+ image[j][i][1] = -+ image[j][i][2] = 0.75 + 0.25 * cos(r); -+ image[j][i][3] = 1.0; -+ } -+ } -+ -+ step += 0.5; -+ -+ glBindTexture(GL_TEXTURE_2D, TexObj); -+ -+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); -+ if (width) { -+ assert(width == TEX_SIZE); -+ /* sub-tex replace */ -+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEX_SIZE, TEX_SIZE, -+ GL_RGBA, GL_FLOAT, image); -+ } -+ else { -+ /* create new */ -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ -+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, -+ GL_RGBA, GL_FLOAT, image); -+ } -+} -+ -+ -+ -+/* draw a colored cube */ -+static void -+draw_object(void) -+{ -+ glPushMatrix(); -+ glScalef(0.75, 0.75, 0.75); -+ -+ glColor3f(1, 0, 0); -+ -+ if (Texture) { -+ glBindTexture(GL_TEXTURE_2D, TexObj); -+ glEnable(GL_TEXTURE_2D); -+ } -+ else { -+ glDisable(GL_TEXTURE_2D); -+ } -+ -+ glBegin(GL_QUADS); -+ -+ /* -X */ -+ glColor3f(0, 1, 1); -+ glTexCoord2f(0, 0); glVertex3f(-1, -1, -1); -+ glTexCoord2f(1, 0); glVertex3f(-1, 1, -1); -+ glTexCoord2f(1, 1); glVertex3f(-1, 1, 1); -+ glTexCoord2f(0, 1); glVertex3f(-1, -1, 1); -+ -+ /* +X */ -+ glColor3f(1, 0, 0); -+ glTexCoord2f(0, 0); glVertex3f(1, -1, -1); -+ glTexCoord2f(1, 0); glVertex3f(1, 1, -1); -+ glTexCoord2f(1, 1); glVertex3f(1, 1, 1); -+ glTexCoord2f(0, 1); glVertex3f(1, -1, 1); -+ -+ /* -Y */ -+ glColor3f(1, 0, 1); -+ glTexCoord2f(0, 0); glVertex3f(-1, -1, -1); -+ glTexCoord2f(1, 0); glVertex3f( 1, -1, -1); -+ glTexCoord2f(1, 1); glVertex3f( 1, -1, 1); -+ glTexCoord2f(0, 1); glVertex3f(-1, -1, 1); -+ -+ /* +Y */ -+ glColor3f(0, 1, 0); -+ glTexCoord2f(0, 0); glVertex3f(-1, 1, -1); -+ glTexCoord2f(1, 0); glVertex3f( 1, 1, -1); -+ glTexCoord2f(1, 1); glVertex3f( 1, 1, 1); -+ glTexCoord2f(0, 1); glVertex3f(-1, 1, 1); -+ -+ /* -Z */ -+ glColor3f(1, 1, 0); -+ glTexCoord2f(0, 0); glVertex3f(-1, -1, -1); -+ glTexCoord2f(1, 0); glVertex3f( 1, -1, -1); -+ glTexCoord2f(1, 1); glVertex3f( 1, 1, -1); -+ glTexCoord2f(0, 1); glVertex3f(-1, 1, -1); -+ -+ /* +Y */ -+ glColor3f(0, 0, 1); -+ glTexCoord2f(0, 0); glVertex3f(-1, -1, 1); -+ glTexCoord2f(1, 0); glVertex3f( 1, -1, 1); -+ glTexCoord2f(1, 1); glVertex3f( 1, 1, 1); -+ glTexCoord2f(0, 1); glVertex3f(-1, 1, 1); -+ -+ glEnd(); -+ -+ glPopMatrix(); -+} -+ -+ -+/* signal resize of given window */ -+static void -+resize(struct winthread *wt, int w, int h) -+{ -+ wt->NewSize = GL_TRUE; -+ wt->WinWidth = w; -+ wt->WinHeight = h; -+ if (!Animate) -+ signal_redraw(); -+} -+ -+ -+/* -+ * We have an instance of this for each thread. -+ */ -+static void -+draw_loop(struct winthread *wt) -+{ -+ while (!ExitFlag) { -+ -+ if (Locking) -+ pthread_mutex_lock(&Mutex); -+ -+ glXMakeCurrent(wt->Dpy, wt->Win, wt->Context); -+ if (!wt->Initialized) { -+ printf("glthreads: %d: GL_RENDERER = %s\n", wt->Index, -+ (char *) glGetString(GL_RENDERER)); -+ if (Texture /*&& wt->Index == 0*/) { -+ MakeNewTexture(wt); -+ } -+ wt->Initialized = GL_TRUE; -+ } -+ -+ if (Locking) -+ pthread_mutex_unlock(&Mutex); -+ -+ glEnable(GL_DEPTH_TEST); -+ -+ if (wt->NewSize) { -+ GLfloat w = (float) wt->WinWidth / (float) wt->WinHeight; -+ glViewport(0, 0, wt->WinWidth, wt->WinHeight); -+ glMatrixMode(GL_PROJECTION); -+ glLoadIdentity(); -+ glFrustum(-w, w, -1.0, 1.0, 1.5, 10); -+ glMatrixMode(GL_MODELVIEW); -+ glLoadIdentity(); -+ glTranslatef(0, 0, -2.5); -+ wt->NewSize = GL_FALSE; -+ } -+ -+ if (wt->MakeNewTexture) { -+ MakeNewTexture(wt); -+ wt->MakeNewTexture = GL_FALSE; -+ } -+ -+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -+ -+ glPushMatrix(); -+ glRotatef(wt->Angle, 0, 1, 0); -+ glRotatef(wt->Angle, 1, 0, 0); -+ glScalef(0.7, 0.7, 0.7); -+ draw_object(); -+ glPopMatrix(); -+ -+ if (Locking) -+ pthread_mutex_lock(&Mutex); -+ -+ glXSwapBuffers(wt->Dpy, wt->Win); -+ -+ if (Locking) -+ pthread_mutex_unlock(&Mutex); -+ -+ if (Animate) { -+ usleep(5000); -+ } -+ else { -+ /* wait for signal to draw */ -+ pthread_mutex_lock(&CondMutex); -+ pthread_cond_wait(&CondVar, &CondMutex); -+ pthread_mutex_unlock(&CondMutex); -+ } -+ wt->Angle += 1.0; -+ } -+} -+ -+ -+static void -+keypress(XEvent *event, struct winthread *wt) -+{ -+ char buf[100]; -+ KeySym keySym; -+ XComposeStatus stat; -+ -+ XLookupString(&event->xkey, buf, sizeof(buf), &keySym, &stat); -+ -+ switch (keySym) { -+ case XK_Escape: -+ /* tell all threads to exit */ -+ if (!Animate) { -+ signal_redraw(); -+ } -+ ExitFlag = GL_TRUE; -+ /*printf("exit draw_loop %d\n", wt->Index);*/ -+ return; -+ case XK_t: -+ case XK_T: -+ if (Texture) { -+ wt->MakeNewTexture = GL_TRUE; -+ if (!Animate) -+ signal_redraw(); -+ } -+ break; -+ case XK_a: -+ case XK_A: -+ Animate = !Animate; -+ if (Animate) /* yes, prev Animate state! */ -+ signal_redraw(); -+ break; -+ case XK_s: -+ case XK_S: -+ if (!Animate) -+ signal_redraw(); -+ break; -+ default: -+ ; /* nop */ -+ } -+} -+ -+ -+/* -+ * The main process thread runs this loop. -+ * Single display connection for all threads. -+ */ -+static void -+event_loop(Display *dpy) -+{ -+ XEvent event; -+ int i; -+ -+ assert(!MultiDisplays); -+ -+ while (!ExitFlag) { -+ -+ if (Locking) { -+ while (1) { -+ int k; -+ pthread_mutex_lock(&Mutex); -+ k = XPending(dpy); -+ if (k) { -+ XNextEvent(dpy, &event); -+ pthread_mutex_unlock(&Mutex); -+ break; -+ } -+ pthread_mutex_unlock(&Mutex); -+ usleep(5000); -+ } -+ } -+ else { -+ XNextEvent(dpy, &event); -+ } -+ -+ switch (event.type) { -+ case ConfigureNotify: -+ /* Find winthread for this event's window */ -+ for (i = 0; i < NumWinThreads; i++) { -+ struct winthread *wt = &WinThreads[i]; -+ if (event.xconfigure.window == wt->Win) { -+ resize(wt, event.xconfigure.width, -+ event.xconfigure.height); -+ break; -+ } -+ } -+ break; -+ case KeyPress: -+ for (i = 0; i < NumWinThreads; i++) { -+ struct winthread *wt = &WinThreads[i]; -+ if (event.xkey.window == wt->Win) { -+ keypress(&event, wt); -+ break; -+ } -+ } -+ break; -+ default: -+ /*no-op*/ ; -+ } -+ } -+} -+ -+ -+/* -+ * Separate display connection for each thread. -+ */ -+static void -+event_loop_multi(void) -+{ -+ XEvent event; -+ int w = 0; -+ -+ assert(MultiDisplays); -+ -+ while (!ExitFlag) { -+ struct winthread *wt = &WinThreads[w]; -+ if (XPending(wt->Dpy)) { -+ XNextEvent(wt->Dpy, &event); -+ switch (event.type) { -+ case ConfigureNotify: -+ resize(wt, event.xconfigure.width, event.xconfigure.height); -+ break; -+ case KeyPress: -+ keypress(&event, wt); -+ break; -+ default: -+ ; /* nop */ -+ } -+ } -+ w = (w + 1) % NumWinThreads; -+ usleep(5000); -+ } -+} -+ -+ -+ -+/* -+ * we'll call this once for each thread, before the threads are created. -+ */ -+static void -+create_window(struct winthread *wt, GLXContext shareCtx) -+{ -+ Window win; -+ GLXContext ctx; -+ int attrib[] = { GLX_RGBA, -+ GLX_RED_SIZE, 1, -+ GLX_GREEN_SIZE, 1, -+ GLX_BLUE_SIZE, 1, -+ GLX_DEPTH_SIZE, 1, -+ GLX_DOUBLEBUFFER, -+ None }; -+ int scrnum; -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root; -+ XVisualInfo *visinfo; -+ int width = 160, height = 160; -+ int xpos = (wt->Index % 8) * (width + 10); -+ int ypos = (wt->Index / 8) * (width + 20); -+ -+ scrnum = DefaultScreen(wt->Dpy); -+ root = RootWindow(wt->Dpy, scrnum); -+ -+ visinfo = glXChooseVisual(wt->Dpy, scrnum, attrib); -+ if (!visinfo) { -+ Error("Unable to find RGB, Z, double-buffered visual"); -+ } -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap(wt->Dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -+ -+ win = XCreateWindow(wt->Dpy, root, xpos, ypos, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr); -+ if (!win) { -+ Error("Couldn't create window"); -+ } -+ -+ { -+ XSizeHints sizehints; -+ sizehints.x = xpos; -+ sizehints.y = ypos; -+ sizehints.width = width; -+ sizehints.height = height; -+ sizehints.flags = USSize | USPosition; -+ XSetNormalHints(wt->Dpy, win, &sizehints); -+ XSetStandardProperties(wt->Dpy, win, "glthreads", "glthreads", -+ None, (char **)NULL, 0, &sizehints); -+ } -+ -+ -+ ctx = glXCreateContext(wt->Dpy, visinfo, shareCtx, True); -+ if (!ctx) { -+ Error("Couldn't create GLX context"); -+ } -+ -+ XMapWindow(wt->Dpy, win); -+ XSync(wt->Dpy, 0); -+ -+ /* save the info for this window/context */ -+ wt->Win = win; -+ wt->Context = ctx; -+ wt->Angle = 0.0; -+ wt->WinWidth = width; -+ wt->WinHeight = height; -+ wt->NewSize = GL_TRUE; -+} -+ -+ -+/* -+ * Called by pthread_create() -+ */ -+static void * -+thread_function(void *p) -+{ -+ struct winthread *wt = (struct winthread *) p; -+ draw_loop(wt); -+ return NULL; -+} -+ -+ -+/* -+ * called before exit to wait for all threads to finish -+ */ -+static void -+clean_up(void) -+{ -+ int i; -+ -+ /* wait for threads to finish */ -+ for (i = 0; i < NumWinThreads; i++) { -+ pthread_join(WinThreads[i].Thread, NULL); -+ } -+ -+ for (i = 0; i < NumWinThreads; i++) { -+ glXDestroyContext(WinThreads[i].Dpy, WinThreads[i].Context); -+ XDestroyWindow(WinThreads[i].Dpy, WinThreads[i].Win); -+ } -+} -+ -+ -+static void -+usage(void) -+{ -+ printf("glthreads: test of GL thread safety (any key = exit)\n"); -+ printf("Usage:\n"); -+ printf(" glthreads [options]\n"); -+ printf("Options:\n"); -+ printf(" -display DISPLAYNAME Specify display string\n"); -+ printf(" -n NUMTHREADS Number of threads to create\n"); -+ printf(" -p Use a separate display connection for each thread\n"); -+ printf(" -l Use application-side locking\n"); -+ printf(" -t Enable texturing\n"); -+ printf("Keyboard:\n"); -+ printf(" Esc Exit\n"); -+ printf(" t Change texture image (requires -t option)\n"); -+ printf(" a Toggle animation\n"); -+ printf(" s Step rotation (when not animating)\n"); -+} -+ -+ -+int -+main(int argc, char *argv[]) -+{ -+ char *displayName = NULL; -+ int numThreads = 2; -+ Display *dpy = NULL; -+ int i; -+ Status threadStat; -+ -+ if (argc == 1) { -+ usage(); -+ } -+ else { -+ int i; -+ for (i = 1; i < argc; i++) { -+ if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) { -+ displayName = argv[i + 1]; -+ i++; -+ } -+ else if (strcmp(argv[i], "-p") == 0) { -+ MultiDisplays = 1; -+ } -+ else if (strcmp(argv[i], "-l") == 0) { -+ Locking = 1; -+ } -+ else if (strcmp(argv[i], "-t") == 0) { -+ Texture = 1; -+ } -+ else if (strcmp(argv[i], "-n") == 0 && i + 1 < argc) { -+ numThreads = atoi(argv[i + 1]); -+ if (numThreads < 1) -+ numThreads = 1; -+ else if (numThreads > MAX_WINTHREADS) -+ numThreads = MAX_WINTHREADS; -+ i++; -+ } -+ else { -+ usage(); -+ exit(1); -+ } -+ } -+ } -+ -+ if (Locking) -+ printf("glthreads: Using explicit locks around Xlib calls.\n"); -+ else -+ printf("glthreads: No explict locking.\n"); -+ -+ if (MultiDisplays) -+ printf("glthreads: Per-thread display connections.\n"); -+ else -+ printf("glthreads: Single display connection.\n"); -+ -+ /* -+ * VERY IMPORTANT: call XInitThreads() before any other Xlib functions. -+ */ -+ if (!MultiDisplays) { -+ if (!Locking) { -+ threadStat = XInitThreads(); -+ if (threadStat) { -+ printf("XInitThreads() returned %d (success)\n", (int) threadStat); -+ } -+ else { -+ printf("XInitThreads() returned 0 (failure- this program may fail)\n"); -+ } -+ } -+ -+ dpy = XOpenDisplay(displayName); -+ if (!dpy) { -+ fprintf(stderr, "Unable to open display %s\n", XDisplayName(displayName)); -+ return -1; -+ } -+ } -+ -+ pthread_mutex_init(&Mutex, NULL); -+ pthread_mutex_init(&CondMutex, NULL); -+ pthread_cond_init(&CondVar, NULL); -+ -+ printf("glthreads: creating windows\n"); -+ -+ NumWinThreads = numThreads; -+ -+ /* Create the GLX windows and contexts */ -+ for (i = 0; i < numThreads; i++) { -+ GLXContext share; -+ -+ if (MultiDisplays) { -+ WinThreads[i].Dpy = XOpenDisplay(displayName); -+ assert(WinThreads[i].Dpy); -+ } -+ else { -+ WinThreads[i].Dpy = dpy; -+ } -+ WinThreads[i].Index = i; -+ WinThreads[i].Initialized = GL_FALSE; -+ -+ share = (Texture && i > 0) ? WinThreads[0].Context : 0; -+ -+ create_window(&WinThreads[i], share); -+ } -+ -+ printf("glthreads: creating threads\n"); -+ -+ /* Create the threads */ -+ for (i = 0; i < numThreads; i++) { -+ pthread_create(&WinThreads[i].Thread, NULL, thread_function, -+ (void*) &WinThreads[i]); -+ printf("glthreads: Created thread %p\n", (void *) WinThreads[i].Thread); -+ } -+ -+ if (MultiDisplays) -+ event_loop_multi(); -+ else -+ event_loop(dpy); -+ -+ clean_up(); -+ -+ if (MultiDisplays) { -+ for (i = 0; i < numThreads; i++) { -+ XCloseDisplay(WinThreads[i].Dpy); -+ } -+ } -+ else { -+ XCloseDisplay(dpy); -+ } -+ -+ return 0; -+} -+ -+ -+#else /* PTHREADS */ -+ -+ -+#include -+ -+int -+main(int argc, char *argv[]) -+{ -+ printf("Sorry, this program wasn't compiled with PTHREADS defined.\n"); -+ return 0; -+} -+ -+ -+#endif /* PTHREADS */ -diff -Naurp Mesa-7.8.1/progs/xdemos/glxcontexts.c Mesa-7.8.1.patched/progs/xdemos/glxcontexts.c ---- Mesa-7.8.1/progs/xdemos/glxcontexts.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/glxcontexts.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,548 @@ -+/* -+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included -+ * in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+/* -+ * 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 -+ * -+ */ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+#define BENCHMARK -+ -+#ifdef BENCHMARK -+ -+/* XXX this probably isn't very portable */ -+ -+#include -+#include -+ -+/* return current time (in seconds) */ -+static double -+current_time(void) -+{ -+ struct timeval tv; -+#ifdef __VMS -+ (void) gettimeofday(&tv, NULL ); -+#else -+ struct timezone tz; -+ (void) gettimeofday(&tv, &tz); -+#endif -+ return (double) tv.tv_sec + tv.tv_usec / 1000000.0; -+} -+ -+#else /*BENCHMARK*/ -+ -+/* dummy */ -+static double -+current_time(void) -+{ -+ /* update this function for other platforms! */ -+ static double t = 0.0; -+ static int warn = 1; -+ if (warn) { -+ fprintf(stderr, "Warning: current_time() not implemented!!\n"); -+ warn = 0; -+ } -+ return t += 1.0; -+} -+ -+#endif /*BENCHMARK*/ -+ -+ -+ -+#ifndef M_PI -+#define M_PI 3.14159265 -+#endif -+ -+ -+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 XVisualInfo *visinfo = NULL; -+static int WinWidth = 300, WinHeight = 300; -+ -+ -+/* -+ * -+ * Draw a gear wheel. You'll probably want to call this function when -+ * building a display list since we do a lot of trig here. -+ * -+ * Input: inner_radius - radius of hole at center -+ * outer_radius - radius at center of teeth -+ * width - width of gear -+ * teeth - number of teeth -+ * tooth_depth - depth of tooth -+ */ -+static void -+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, -+ GLint teeth, GLfloat tooth_depth) -+{ -+ GLint i; -+ GLfloat r0, r1, r2; -+ GLfloat angle, da; -+ GLfloat u, v, len; -+ -+ r0 = inner_radius; -+ r1 = outer_radius - tooth_depth / 2.0; -+ r2 = outer_radius + tooth_depth / 2.0; -+ -+ da = 2.0 * M_PI / teeth / 4.0; -+ -+ glShadeModel(GL_FLAT); -+ -+ glNormal3f(0.0, 0.0, 1.0); -+ -+ /* draw front face */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i <= teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); -+ if (i < teeth) { -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ width * 0.5); -+ } -+ } -+ glEnd(); -+ -+ /* draw front sides of teeth */ -+ glBegin(GL_QUADS); -+ da = 2.0 * M_PI / teeth / 4.0; -+ for (i = 0; i < teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); -+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); -+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -+ width * 0.5); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ width * 0.5); -+ } -+ glEnd(); -+ -+ glNormal3f(0.0, 0.0, -1.0); -+ -+ /* draw back face */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i <= teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); -+ if (i < teeth) { -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ -width * 0.5); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); -+ } -+ } -+ glEnd(); -+ -+ /* draw back sides of teeth */ -+ glBegin(GL_QUADS); -+ da = 2.0 * M_PI / teeth / 4.0; -+ for (i = 0; i < teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ -width * 0.5); -+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -+ -width * 0.5); -+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); -+ } -+ glEnd(); -+ -+ /* draw outward faces of teeth */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i < teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); -+ u = r2 * cos(angle + da) - r1 * cos(angle); -+ v = r2 * sin(angle + da) - r1 * sin(angle); -+ len = sqrt(u * u + v * v); -+ u /= len; -+ v /= len; -+ glNormal3f(v, -u, 0.0); -+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); -+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); -+ glNormal3f(cos(angle), sin(angle), 0.0); -+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -+ width * 0.5); -+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -+ -width * 0.5); -+ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); -+ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); -+ glNormal3f(v, -u, 0.0); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ width * 0.5); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ -width * 0.5); -+ glNormal3f(cos(angle), sin(angle), 0.0); -+ } -+ -+ glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); -+ glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); -+ -+ glEnd(); -+ -+ glShadeModel(GL_SMOOTH); -+ -+ /* draw inside radius cylinder */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i <= teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ glNormal3f(-cos(angle), -sin(angle), 0.0); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); -+ } -+ glEnd(); -+} -+ -+ -+static void -+do_draw(void) -+{ -+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -+ -+ glPushMatrix(); -+ glRotatef(view_rotx, 1.0, 0.0, 0.0); -+ glRotatef(view_roty, 0.0, 1.0, 0.0); -+ glRotatef(view_rotz, 0.0, 0.0, 1.0); -+ -+ glPushMatrix(); -+ glTranslatef(-3.0, -2.0, 0.0); -+ glRotatef(angle, 0.0, 0.0, 1.0); -+ glCallList(gear1); -+ glPopMatrix(); -+ -+ glPushMatrix(); -+ glTranslatef(3.1, -2.0, 0.0); -+ glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0); -+ glCallList(gear2); -+ glPopMatrix(); -+ -+ glPushMatrix(); -+ glTranslatef(-3.1, 4.2, 0.0); -+ glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0); -+ glCallList(gear3); -+ glPopMatrix(); -+ -+ glPopMatrix(); -+} -+ -+ -+/* new window size or exposure */ -+static void -+reshape(int width, int height) -+{ -+ glViewport(0, 0, (GLint) width, (GLint) height); -+ -+ { -+ GLfloat h = (GLfloat) height / (GLfloat) width; -+ -+ glMatrixMode(GL_PROJECTION); -+ glLoadIdentity(); -+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); -+ } -+ -+ glMatrixMode(GL_MODELVIEW); -+ glLoadIdentity(); -+ glTranslatef(0.0, 0.0, -40.0); -+} -+ -+ -+static void -+init(void) -+{ -+ static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; -+ static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; -+ static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; -+ static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; -+ -+ glLightfv(GL_LIGHT0, GL_POSITION, pos); -+ glEnable(GL_CULL_FACE); -+ glEnable(GL_LIGHTING); -+ glEnable(GL_LIGHT0); -+ glEnable(GL_DEPTH_TEST); -+ -+ /* make the gears */ -+ gear1 = glGenLists(1); -+ glNewList(gear1, GL_COMPILE); -+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); -+ gear(1.0, 4.0, 1.0, 20, 0.7); -+ glEndList(); -+ -+ gear2 = glGenLists(1); -+ glNewList(gear2, GL_COMPILE); -+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); -+ gear(0.5, 2.0, 2.0, 10, 0.7); -+ glEndList(); -+ -+ gear3 = glGenLists(1); -+ glNewList(gear3, GL_COMPILE); -+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); -+ gear(1.3, 2.0, 0.5, 10, 0.7); -+ glEndList(); -+ -+ glEnable(GL_NORMALIZE); -+} -+ -+ -+static void -+draw( Display *dpy, Window win ) -+{ -+ GLXContext ctx; -+ -+ ctx = glXCreateContext( dpy, visinfo, NULL, True ); -+ if (!ctx) { -+ printf("Error: glXCreateContext failed\n"); -+ exit(1); -+ } -+ -+ glXMakeCurrent(dpy, win, ctx); -+ -+ init(); -+ -+ reshape(WinWidth, WinHeight); -+ -+ do_draw(); -+ -+ glDeleteLists(gear1, 1); -+ glDeleteLists(gear2, 1); -+ glDeleteLists(gear3, 1); -+ -+ glXSwapBuffers(dpy, win); -+ glXDestroyContext(dpy, ctx); -+} -+ -+ -+/* -+ * Create an RGB, double-buffered window. -+ * Return the window and context handles. -+ */ -+static void -+make_window( Display *dpy, const char *name, -+ int x, int y, int width, int height, -+ Window *winRet) -+{ -+ int attribs[] = { GLX_RGBA, -+ GLX_RED_SIZE, 1, -+ GLX_GREEN_SIZE, 1, -+ GLX_BLUE_SIZE, 1, -+ GLX_DOUBLEBUFFER, -+ GLX_DEPTH_SIZE, 1, -+ None }; -+ int scrnum; -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root; -+ Window win; -+ -+ scrnum = DefaultScreen( dpy ); -+ root = RootWindow( dpy, scrnum ); -+ -+ if (visinfo) -+ XFree(visinfo); -+ -+ visinfo = glXChooseVisual( dpy, scrnum, attribs ); -+ if (!visinfo) { -+ printf("Error: couldn't get an RGB, Double-buffered visual\n"); -+ exit(1); -+ } -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ attr.override_redirect = 0; -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect; -+ -+ win = XCreateWindow( dpy, root, x, y, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr ); -+ -+ /* set hints and properties */ -+ { -+ XSizeHints sizehints; -+ sizehints.x = x; -+ sizehints.y = y; -+ sizehints.width = width; -+ sizehints.height = height; -+ sizehints.flags = USSize | USPosition; -+ XSetNormalHints(dpy, win, &sizehints); -+ XSetStandardProperties(dpy, win, name, name, -+ None, (char **)NULL, 0, &sizehints); -+ } -+ -+ *winRet = win; -+} -+ -+ -+static void -+event_loop(Display *dpy) -+{ -+ Window win; -+ make_window(dpy, "glxgears", 0, 0, WinWidth, WinHeight, &win); -+ XMapWindow(dpy, win); -+ -+ while (1) { -+ while (XPending(dpy) > 0) { -+ XEvent event; -+ XNextEvent(dpy, &event); -+ switch (event.type) { -+ case Expose: -+ /* we'll redraw below */ -+ break; -+ case ConfigureNotify: -+ 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; -+ } -+ } -+ } -+ } -+ } -+ -+ { -+ static int frames = 0; -+ static double tRot0 = -1.0, tRate0 = -1.0; -+ double dt, t = current_time(); -+ if (tRot0 < 0.0) -+ tRot0 = t; -+ dt = t - tRot0; -+ tRot0 = t; -+ -+ /* advance rotation for next frame */ -+ angle += 70.0 * dt; /* 70 degrees per second */ -+ if (angle > 3600.0) -+ angle -= 3600.0; -+ -+ draw( dpy, win ); -+ -+ frames++; -+ -+ if (tRate0 < 0.0) -+ tRate0 = t; -+ -+ if (t - tRate0 >= 1.0) { -+ GLfloat seconds = t - tRate0; -+ GLfloat fps = frames / seconds; -+ 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, /* x,y */ -+ WinWidth, WinHeight, &win); -+ XMapWindow(dpy, win); -+ -+ frames = 0; -+ } -+ } -+ } -+} -+ -+ -+int -+main(int argc, char *argv[]) -+{ -+ Display *dpy; -+ char *dpyName = NULL; -+ GLboolean printInfo = GL_FALSE; -+ int i; -+ -+ for (i = 1; i < argc; i++) { -+ if (strcmp(argv[i], "-display") == 0) { -+ dpyName = argv[i+1]; -+ i++; -+ } -+ else if (strcmp(argv[i], "-info") == 0) { -+ printInfo = GL_TRUE; -+ } -+ else -+ printf("Warrning: unknown parameter: %s\n", argv[i]); -+ } -+ -+ dpy = XOpenDisplay(dpyName); -+ if (!dpy) { -+ fprintf(stderr, "Error: couldn't open display %s\n", -+ XDisplayName(dpyName)); -+ return -1; -+ } -+ -+ if (printInfo) { -+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); -+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); -+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); -+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); -+ } -+ -+ event_loop(dpy); -+ -+ XCloseDisplay(dpy); -+ -+ return 0; -+} -diff -Naurp Mesa-7.8.1/progs/xdemos/glxdemo.c Mesa-7.8.1.patched/progs/xdemos/glxdemo.c ---- Mesa-7.8.1/progs/xdemos/glxdemo.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/glxdemo.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,127 @@ -+ -+ -+/* -+ * A demonstration of using the GLX functions. This program is in the -+ * public domain. -+ * -+ * Brian Paul -+ */ -+ -+#include -+#include -+#include -+#include -+ -+ -+ -+static void redraw( Display *dpy, Window w ) -+{ -+ printf("Redraw event\n"); -+ -+ glClear( GL_COLOR_BUFFER_BIT ); -+ -+ glColor3f( 1.0, 1.0, 0.0 ); -+ glRectf( -0.8, -0.8, 0.8, 0.8 ); -+ -+ glXSwapBuffers( dpy, w ); -+} -+ -+ -+ -+static void resize( unsigned int width, unsigned int height ) -+{ -+ printf("Resize event\n"); -+ glViewport( 0, 0, width, height ); -+ glMatrixMode( GL_PROJECTION ); -+ glLoadIdentity(); -+ glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); -+} -+ -+ -+ -+static Window make_rgb_db_window( Display *dpy, -+ unsigned int width, unsigned int height ) -+{ -+ int attrib[] = { GLX_RGBA, -+ GLX_RED_SIZE, 1, -+ GLX_GREEN_SIZE, 1, -+ GLX_BLUE_SIZE, 1, -+ GLX_DOUBLEBUFFER, -+ None }; -+ int scrnum; -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root; -+ Window win; -+ GLXContext ctx; -+ XVisualInfo *visinfo; -+ -+ scrnum = DefaultScreen( dpy ); -+ root = RootWindow( dpy, scrnum ); -+ -+ visinfo = glXChooseVisual( dpy, scrnum, attrib ); -+ if (!visinfo) { -+ printf("Error: couldn't get an RGB, Double-buffered visual\n"); -+ exit(1); -+ } -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask; -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -+ -+ win = XCreateWindow( dpy, root, 0, 0, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr ); -+ -+ ctx = glXCreateContext( dpy, visinfo, NULL, True ); -+ if (!ctx) { -+ printf("Error: glXCreateContext failed\n"); -+ exit(1); -+ } -+ -+ glXMakeCurrent( dpy, win, ctx ); -+ -+ return win; -+} -+ -+ -+static void event_loop( Display *dpy ) -+{ -+ XEvent event; -+ -+ while (1) { -+ XNextEvent( dpy, &event ); -+ -+ switch (event.type) { -+ case Expose: -+ redraw( dpy, event.xany.window ); -+ break; -+ case ConfigureNotify: -+ resize( event.xconfigure.width, event.xconfigure.height ); -+ break; -+ } -+ } -+} -+ -+ -+ -+int main( int argc, char *argv[] ) -+{ -+ Display *dpy; -+ Window win; -+ -+ dpy = XOpenDisplay(NULL); -+ -+ win = make_rgb_db_window( dpy, 300, 300 ); -+ -+ glShadeModel( GL_FLAT ); -+ glClearColor( 0.5, 0.5, 0.5, 1.0 ); -+ -+ XMapWindow( dpy, win ); -+ -+ event_loop( dpy ); -+ return 0; -+} -diff -Naurp Mesa-7.8.1/progs/xdemos/glxgears.c Mesa-7.8.1.patched/progs/xdemos/glxgears.c ---- Mesa-7.8.1/progs/xdemos/glxgears.c 1970-01-01 01:00:00.000000000 +0100 -+++ Mesa-7.8.1.patched/progs/xdemos/glxgears.c 2010-06-13 13:45:06.789793146 +0200 -@@ -0,0 +1,787 @@ -+/* -+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included -+ * in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+/* -+ * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT) -+ * Port by Brian Paul 23 March 2001 -+ * -+ * See usage() below for command line options. -+ */ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifndef GLX_MESA_swap_control -+#define GLX_MESA_swap_control 1 -+typedef int (*PFNGLXGETSWAPINTERVALMESAPROC)(void); -+#endif -+ -+ -+#define BENCHMARK -+ -+#ifdef BENCHMARK -+ -+/* XXX this probably isn't very portable */ -+ -+#include -+#include -+ -+/* return current time (in seconds) */ -+static double -+current_time(void) -+{ -+ struct timeval tv; -+#ifdef __VMS -+ (void) gettimeofday(&tv, NULL ); -+#else -+ struct timezone tz; -+ (void) gettimeofday(&tv, &tz); -+#endif -+ return (double) tv.tv_sec + tv.tv_usec / 1000000.0; -+} -+ -+#else /*BENCHMARK*/ -+ -+/* dummy */ -+static double -+current_time(void) -+{ -+ /* update this function for other platforms! */ -+ static double t = 0.0; -+ static int warn = 1; -+ if (warn) { -+ fprintf(stderr, "Warning: current_time() not implemented!!\n"); -+ warn = 0; -+ } -+ return t += 1.0; -+} -+ -+#endif /*BENCHMARK*/ -+ -+ -+ -+#ifndef M_PI -+#define M_PI 3.14159265 -+#endif -+ -+ -+/** Event handler results: */ -+#define NOP 0 -+#define EXIT 1 -+#define DRAW 2 -+ -+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 GLboolean animate = GL_TRUE; /* Animation */ -+static GLfloat eyesep = 5.0; /* Eye separation. */ -+static GLfloat fix_point = 40.0; /* Fixation point distance. */ -+static GLfloat left, right, asp; /* Stereo frustum params. */ -+ -+ -+/* -+ * -+ * Draw a gear wheel. You'll probably want to call this function when -+ * building a display list since we do a lot of trig here. -+ * -+ * Input: inner_radius - radius of hole at center -+ * outer_radius - radius at center of teeth -+ * width - width of gear -+ * teeth - number of teeth -+ * tooth_depth - depth of tooth -+ */ -+static void -+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, -+ GLint teeth, GLfloat tooth_depth) -+{ -+ GLint i; -+ GLfloat r0, r1, r2; -+ GLfloat angle, da; -+ GLfloat u, v, len; -+ -+ r0 = inner_radius; -+ r1 = outer_radius - tooth_depth / 2.0; -+ r2 = outer_radius + tooth_depth / 2.0; -+ -+ da = 2.0 * M_PI / teeth / 4.0; -+ -+ glShadeModel(GL_FLAT); -+ -+ glNormal3f(0.0, 0.0, 1.0); -+ -+ /* draw front face */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i <= teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); -+ if (i < teeth) { -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ width * 0.5); -+ } -+ } -+ glEnd(); -+ -+ /* draw front sides of teeth */ -+ glBegin(GL_QUADS); -+ da = 2.0 * M_PI / teeth / 4.0; -+ for (i = 0; i < teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); -+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); -+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -+ width * 0.5); -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ width * 0.5); -+ } -+ glEnd(); -+ -+ glNormal3f(0.0, 0.0, -1.0); -+ -+ /* draw back face */ -+ glBegin(GL_QUAD_STRIP); -+ for (i = 0; i <= teeth; i++) { -+ angle = i * 2.0 * M_PI / teeth; -+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); -+ if (i < teeth) { -+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -+ -width * 0.5); -+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); -+ }