diff options
Diffstat (limited to 'progs/xdemos')
40 files changed, 0 insertions, 14725 deletions
diff --git a/progs/xdemos/.gitignore b/progs/xdemos/.gitignore deleted file mode 100644 index 2f5e909079a..00000000000 --- a/progs/xdemos/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -corender -glsync -glthreads -glxcontexts -glxdemo -glxgears -glxgears_fbconfig -glxgears_pixmap -glxheads -glxinfo -glxpbdemo -glxpixmap -glxsnoop -glxswapcontrol -manywin -msctest -multictx -offset -omlsync -overlay -pbinfo -pbdemo -shape -sharedtex -sharedtex_mt -texture_from_pixmap -wincopy -xdemo -xfont -xrotfontdemo -yuvrect_client diff --git a/progs/xdemos/Makefile b/progs/xdemos/Makefile deleted file mode 100644 index 2663015b2c7..00000000000 --- a/progs/xdemos/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -# progs/xdemos/Makefile - -TOP = ../.. -include $(TOP)/configs/current - - -INCDIR = $(TOP)/include - -LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) - -# Add X11 and pthread libs to satisfy GNU gold. -APP_LIB_DEPS += $(X11_LIBS) -lpthread - -LIBS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) $(APP_LIB_DEPS) - -PROGS = \ - corender \ - glsync \ - glthreads \ - glxdemo \ - glxgears \ - glxgears_fbconfig \ - glxgears_pixmap \ - glxcontexts \ - glxheads \ - glxinfo \ - glxpixmap \ - glxpbdemo \ - glxsnoop \ - glxswapcontrol \ - manywin \ - msctest \ - multictx \ - offset \ - omlsync \ - overlay \ - pbinfo \ - pbdemo \ - sharedtex \ - sharedtex_mt \ - texture_from_pixmap \ - wincopy \ - xfont \ - xrotfontdemo - -# Don't build these by default because of extra library dependencies -EXTRA_PROGS = \ - shape \ - yuvrect_client \ - xdemo - - - -##### RULES ##### - -.o: $(LIB_DEP) - $(APP_CC) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@ - -.c.o: - $(APP_CC) -I$(INCDIR) $(X11_INCLUDES) $(CFLAGS) $< -c -o $@ - - -##### TARGETS ##### - -default: $(PROGS) - -$(PROGS): $(PROGS:%=%.o) - -extra: $(EXTRA_PROGS) - - -clean: - -rm -f $(PROGS) $(EXTRA_PROGS) - -rm -f *.o *~ - - -# special cases -pbutil.o: pbutil.h -pbinfo.o: pbutil.h -pbinfo: pbinfo.o pbutil.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) pbinfo.o pbutil.o $(LIBS) -o $@ - -pbdemo.o: pbutil.h -pbdemo: pbdemo.o pbutil.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) pbdemo.o pbutil.o $(LIBS) -o $@ - -glxgears_fbconfig.o: pbutil.h -glxgears_fbconfig: glxgears_fbconfig.o pbutil.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) glxgears_fbconfig.o pbutil.o $(LIBS) -o $@ - -xuserotfont.o: xuserotfont.h -xrotfontdemo.o: xuserotfont.h -xrotfontdemo: xrotfontdemo.o xuserotfont.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) xrotfontdemo.o xuserotfont.o $(LIBS) -o $@ - -ipc.o: ipc.h -corender.o: ipc.h -corender: corender.o ipc.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) corender.o ipc.o $(LIBS) -o $@ - -yuvrect_client: yuvrect_client.o - $(APP_CC) $(CFLAGS) $< $(LDFLAGS) $(LIBS) -l$(GLU_LIB) -o $@ - diff --git a/progs/xdemos/corender.c b/progs/xdemos/corender.c deleted file mode 100644 index e706f4b3da5..00000000000 --- a/progs/xdemos/corender.c +++ /dev/null @@ -1,400 +0,0 @@ -/** - * 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 <GL/gl.h> -#include <GL/glx.h> -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <X11/keysym.h> -#include <unistd.h> -#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 --git a/progs/xdemos/glsync.c b/progs/xdemos/glsync.c deleted file mode 100644 index 3751373e23b..00000000000 --- a/progs/xdemos/glsync.c +++ /dev/null @@ -1,295 +0,0 @@ -/* - * 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 <[email protected]> - * - */ - -/** @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 <width>' and '-h <height' to set the - * window size. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glx.h> -#include <GL/glxext.h> -#include <X11/X.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> - -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 <width>] [-h <height>] [-s<sync method>] " - "[-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); -} - -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 --git a/progs/xdemos/glthreads.c b/progs/xdemos/glthreads.c deleted file mode 100644 index ea5474870bd..00000000000 --- a/progs/xdemos/glthreads.c +++ /dev/null @@ -1,716 +0,0 @@ -/* - * 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 <num threads> Number of threads to create (default is 2) - * -display <display name> 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 <assert.h> -#include <GL/gl.h> -#include <GL/glx.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <pthread.h> - - -/* - * 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 <stdio.h> - -int -main(int argc, char *argv[]) -{ - printf("Sorry, this program wasn't compiled with PTHREADS defined.\n"); - return 0; -} - - -#endif /* PTHREADS */ diff --git a/progs/xdemos/glxcontexts.c b/progs/xdemos/glxcontexts.c deleted file mode 100644 index 9f83679acd3..00000000000 --- a/progs/xdemos/glxcontexts.c +++ /dev/null @@ -1,548 +0,0 @@ -/* - * 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 <assert.h> -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <GL/gl.h> -#include <GL/glx.h> - - -#define BENCHMARK - -#ifdef BENCHMARK - -/* XXX this probably isn't very portable */ - -#include <sys/time.h> -#include <unistd.h> - -/* 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 --git a/progs/xdemos/glxdemo.c b/progs/xdemos/glxdemo.c deleted file mode 100644 index 37df64ebee8..00000000000 --- a/progs/xdemos/glxdemo.c +++ /dev/null @@ -1,127 +0,0 @@ - - -/* - * A demonstration of using the GLX functions. This program is in the - * public domain. - * - * Brian Paul - */ - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> - - - -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 --git a/progs/xdemos/glxgears.c b/progs/xdemos/glxgears.c deleted file mode 100644 index 92c75caa5e6..00000000000 --- a/progs/xdemos/glxgears.c +++ /dev/null @@ -1,787 +0,0 @@ -/* - * 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 <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <GL/gl.h> -#include <GL/glx.h> -#include <GL/glxext.h> - -#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 <sys/time.h> -#include <unistd.h> - -/* 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); - } - } - 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 -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(); -} - - -static void -draw_gears(void) -{ - if (stereo) { - /* First left eye. */ - glDrawBuffer(GL_BACK_LEFT); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(left, right, -asp, asp, 5.0, 60.0); - - glMatrixMode(GL_MODELVIEW); - - glPushMatrix(); - glTranslated(+0.5 * eyesep, 0.0, 0.0); - 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); - draw(); - glPopMatrix(); - } - else { - draw(); - } -} - - -/** Draw single frame, do SwapBuffers, compute FPS */ -static void -draw_frame(Display *dpy, Window win) -{ - 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; - - if (animate) { - /* advance rotation for next frame */ - angle += 70.0 * dt; /* 70 degrees per second */ - if (angle > 3600.0) - angle -= 3600.0; - } - - draw_gears(); - glXSwapBuffers(dpy, win); - - frames++; - - if (tRate0 < 0.0) - tRate0 = t; - if (t - tRate0 >= 5.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; - frames = 0; - } -} - - -/* 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); - 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); -} - - -/** - * Remove window border/decorations. - */ -static void -no_border( Display *dpy, Window w) -{ - static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); - static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; - - typedef struct - { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long inputMode; - unsigned long status; - } PropMotifWmHints; - - PropMotifWmHints motif_hints; - Atom prop, proptype; - unsigned long flags = 0; - - /* setup the property */ - motif_hints.flags = MWM_HINTS_DECORATIONS; - motif_hints.decorations = flags; - - /* get the atom for the property */ - prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True ); - if (!prop) { - /* something went wrong! */ - return; - } - - /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ - proptype = prop; - - XChangeProperty( dpy, w, /* display, window */ - prop, proptype, /* property, type */ - 32, /* format: 32-bit datums */ - PropModeReplace, /* mode */ - (unsigned char *) &motif_hints, /* data */ - PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ - ); -} - - -/* - * 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, GLXContext *ctxRet) -{ - int attribs[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - 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; - Window root; - Window win; - GLXContext ctx; - XVisualInfo *visinfo; - - 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 ); - 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"); - 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; - /* XXX this is a bad way to get a borderless window! */ - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow( dpy, root, x, y, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr ); - - if (fullscreen) - no_border(dpy, win); - - /* 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); - } - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - if (!ctx) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - XFree(visinfo); - - *winRet = win; - *ctxRet = ctx; -} - - -/** - * Determine whether or not a GLX extension is supported. - */ -static int -is_glx_extension_supported(Display *dpy, const char *query) -{ - const int scrnum = DefaultScreen(dpy); - const char *glx_extensions = NULL; - const size_t len = strlen(query); - const char *ptr; - - if (glx_extensions == NULL) { - glx_extensions = glXQueryExtensionsString(dpy, scrnum); - } - - ptr = strstr(glx_extensions, query); - return ((ptr != NULL) && ((ptr[len] == ' ') || (ptr[len] == '\0'))); -} - - -/** - * Attempt to determine whether or not the display is synched to vblank. - */ -static void -query_vsync(Display *dpy, GLXDrawable drawable) -{ - int interval = 0; - -#if defined(GLX_EXT_swap_control) - if (is_glx_extension_supported(dpy, "GLX_EXT_swap_control")) { - unsigned int tmp = -1; - glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &tmp); - interval = tmp; - } else -#endif - if (is_glx_extension_supported(dpy, "GLX_MESA_swap_control")) { - PFNGLXGETSWAPINTERVALMESAPROC pglXGetSwapIntervalMESA = - (PFNGLXGETSWAPINTERVALMESAPROC) - glXGetProcAddressARB((const GLubyte *) "glXGetSwapIntervalMESA"); - - interval = (*pglXGetSwapIntervalMESA)(); - } else if (is_glx_extension_supported(dpy, "GLX_SGI_swap_control")) { - /* The default swap interval with this extension is 1. Assume that it - * is set to the default. - * - * Many Mesa-based drivers default to 0, but all of these drivers also - * export GLX_MESA_swap_control. In that case, this branch will never - * be taken, and the correct result should be reported. - */ - interval = 1; - } - - - if (interval > 0) { - printf("Running synchronized to the vertical refresh. The framerate should be\n"); - if (interval == 1) { - printf("approximately the same as the monitor refresh rate.\n"); - } else if (interval > 1) { - printf("approximately 1/%d the monitor refresh rate.\n", - interval); - } - } -} - -/** - * Handle one X event. - * \return NOP, EXIT or DRAW - */ -static int -handle_event(Display *dpy, Window win, XEvent *event) -{ - (void) dpy; - (void) win; - - switch (event->type) { - case Expose: - return DRAW; - case ConfigureNotify: - reshape(event->xconfigure.width, 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 EXIT; - } - else if (buffer[0] == 'a' || buffer[0] == 'A') { - animate = !animate; - } - } - return DRAW; - } - } - return NOP; -} - - -static void -event_loop(Display *dpy, Window win) -{ - while (1) { - int op; - while (!animate || XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - op = handle_event(dpy, win, &event); - if (op == EXIT) - return; - else if (op == DRAW) - break; - } - - draw_frame(dpy, win); - } -} - - -static void -usage(void) -{ - printf("Usage:\n"); - printf(" -display <displayname> set the display to run on\n"); - printf(" -stereo run in stereo mode\n"); - printf(" -fullscreen run in fullscreen mode\n"); - printf(" -info display OpenGL renderer info\n"); - printf(" -geometry WxH+X+Y window geometry\n"); -} - - -int -main(int argc, char *argv[]) -{ - unsigned int winWidth = 300, winHeight = 300; - int x = 0, y = 0; - Display *dpy; - Window win; - GLXContext ctx; - 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 if (strcmp(argv[i], "-stereo") == 0) { - stereo = GL_TRUE; - } - else if (strcmp(argv[i], "-fullscreen") == 0) { - fullscreen = GL_TRUE; - } - else if (i < argc-1 && strcmp(argv[i], "-geometry") == 0) { - XParseGeometry(argv[i+1], &x, &y, &winWidth, &winHeight); - i++; - } - else { - usage(); - return -1; - } - } - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", - dpyName ? dpyName : getenv("DISPLAY")); - return -1; - } - - make_window(dpy, "glxgears", x, y, winWidth, winHeight, &win, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, win, ctx); - query_vsync(dpy, win); - - 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)); - } - - init(); - - /* Set initial projection/viewing transformation. - * We can't be sure we'll get a ConfigureNotify event when the window - * first appears. - */ - reshape(winWidth, winHeight); - - event_loop(dpy, win); - - glDeleteLists(gear1, 1); - glDeleteLists(gear2, 1); - glDeleteLists(gear3, 1); - glXMakeCurrent(dpy, None, NULL); - glXDestroyContext(dpy, ctx); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/glxgears_fbconfig.c b/progs/xdemos/glxgears_fbconfig.c deleted file mode 100644 index 36bf73138c9..00000000000 --- a/progs/xdemos/glxgears_fbconfig.c +++ /dev/null @@ -1,632 +0,0 @@ -/* - * 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. - */ - -/** - * \file glxgears_fbconfig.c - * Yet-another-version of gears. Originally ported to GLX by Brian Paul on - * 23 March 2001. Modified to use fbconfigs by Ian Romanick on 10 Feb 2004. - * - * Command line options: - * -info print GL implementation information - * - * \author Brian Paul - * \author Ian Romanick <[email protected]> - */ - - -#define GLX_GLXEXT_PROTOTYPES - -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <GL/gl.h> -#include <GL/glx.h> -#include <GL/glxext.h> -#include <assert.h> -#include "pbutil.h" - -static PFNGLXCHOOSEFBCONFIGPROC choose_fbconfig = NULL; -static PFNGLXGETVISUALFROMFBCONFIGPROC get_visual_from_fbconfig = NULL; -static PFNGLXCREATENEWCONTEXTPROC create_new_context = NULL; -static PFNGLXCREATEWINDOWPROC create_window = NULL; -static PFNGLXDESTROYWINDOWPROC destroy_window = NULL; - -#define BENCHMARK - -#ifdef BENCHMARK - -/* XXX this probably isn't very portable */ - -#include <sys/time.h> -#include <unistd.h> - -/* return current time (in seconds) */ -static int -current_time(void) -{ - struct timeval tv; -#ifdef __VMS - (void) gettimeofday(&tv, NULL ); -#else - struct timezone tz; - (void) gettimeofday(&tv, &tz); -#endif - return (int) tv.tv_sec; -} - -#else /*BENCHMARK*/ - -/* dummy */ -static int -current_time(void) -{ - return 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; - - -/* - * - * 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 -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) -{ - GLfloat h = (GLfloat) height / (GLfloat) width; - - glViewport(0, 0, (GLint) width, (GLint) height); - 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 GLXWindow -dummy_create_window(Display *dpy, GLXFBConfig config, Window win, - const int *attrib_list) -{ - (void) dpy; - (void) config; - (void) attrib_list; - - return (GLXWindow) win; -} - - -static void -dummy_destroy_window(Display *dpy, GLXWindow win) -{ - (void) dpy; - (void) win; -} - - -/** - * Initialize fbconfig related function pointers. - */ -static void -init_fbconfig_functions(Display *dpy, int scrnum) -{ - const char * glx_extensions; - const char * match; - static const char ext_name[] = "GLX_SGIX_fbconfig"; - const size_t len = strlen( ext_name ); - int major; - int minor; - GLboolean ext_version_supported; - GLboolean glx_1_3_supported; - - - /* Determine if GLX 1.3 or greater is supported. - */ - glXQueryVersion(dpy, & major, & minor); - glx_1_3_supported = (major == 1) && (minor >= 3); - - /* Determine if GLX_SGIX_fbconfig is supported. - */ - glx_extensions = glXQueryExtensionsString(dpy, scrnum); - match = strstr( glx_extensions, ext_name ); - - ext_version_supported = (match != NULL) - && ((match[len] == '\0') || (match[len] == ' ')); - - printf( "GLX 1.3 is %ssupported.\n", - (glx_1_3_supported) ? "" : "not " ); - printf( "%s is %ssupported.\n", - ext_name, (ext_version_supported) ? "" : "not " ); - - if ( glx_1_3_supported ) { - choose_fbconfig = (PFNGLXCHOOSEFBCONFIGPROC) - glXGetProcAddressARB((GLubyte *) "glXChooseFBConfig"); - get_visual_from_fbconfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) - glXGetProcAddressARB((GLubyte *) "glXGetVisualFromFBConfig"); - create_new_context = (PFNGLXCREATENEWCONTEXTPROC) - glXGetProcAddressARB((GLubyte *) "glXCreateNewContext"); - create_window = (PFNGLXCREATEWINDOWPROC) - glXGetProcAddressARB((GLubyte *) "glXCreateWindow"); - destroy_window = (PFNGLXDESTROYWINDOWPROC) - glXGetProcAddressARB((GLubyte *) "glXDestroyWindow"); - } - else if ( ext_version_supported ) { - choose_fbconfig = (PFNGLXCHOOSEFBCONFIGPROC) - glXGetProcAddressARB((GLubyte *) "glXChooseFBConfigSGIX"); - get_visual_from_fbconfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) - glXGetProcAddressARB((GLubyte *) "glXGetVisualFromFBConfigSGIX"); - create_new_context = (PFNGLXCREATENEWCONTEXTPROC) - glXGetProcAddressARB((GLubyte *) "glXCreateContextWithConfigSGIX"); - create_window = dummy_create_window; - destroy_window = dummy_destroy_window; - } - else { - printf( "This demo requires either GLX 1.3 or %s be supported.\n", - ext_name ); - exit(1); - } - - if ( choose_fbconfig == NULL ) { - printf( "glXChooseFBConfig not found!\n" ); - exit(1); - } - - if ( get_visual_from_fbconfig == NULL ) { - printf( "glXGetVisualFromFBConfig not found!\n" ); - exit(1); - } - - if ( create_new_context == NULL ) { - printf( "glXCreateNewContext not found!\n" ); - exit(1); - } -} - - -/* - * 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, GLXWindow *glxWinRet, GLXContext *ctxRet) -{ - int attrib[] = { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, GL_TRUE, - GLX_DEPTH_SIZE, 1, - None }; - GLXFBConfig * fbconfig; - int num_configs; - int scrnum; - int i; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - Window win; - GLXWindow glxWin; - GLXContext ctx; - XVisualInfo *visinfo; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - init_fbconfig_functions(dpy, scrnum); - fbconfig = (*choose_fbconfig)(dpy, scrnum, attrib, & num_configs); - if (fbconfig == NULL) { - printf("Error: couldn't get an RGB, Double-buffered visual\n"); - exit(1); - } - - printf("\nThe following fbconfigs meet the requirements. The first one " - "will be used.\n\n"); - for ( i = 0 ; i < num_configs ; i++ ) { - PrintFBConfigInfo(dpy, scrnum, fbconfig[i], GL_TRUE); - } - - /* window attributes */ - visinfo = (*get_visual_from_fbconfig)(dpy, fbconfig[0]); - assert(visinfo != NULL); - 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, 0, 0, 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); - } - - glxWin = (*create_window)(dpy, fbconfig[0], win, NULL); - - ctx = (*create_new_context)(dpy, fbconfig[0], GLX_RGBA_TYPE, NULL, GL_TRUE); - if (!ctx) { - printf("Error: glXCreateNewContext failed\n"); - exit(1); - } - - XFree(fbconfig); - - *glxWinRet = glxWin; - *winRet = win; - *ctxRet = ctx; -} - - -static void -event_loop(Display *dpy, GLXWindow win) -{ - while (1) { - while (XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - switch (event.type) { - case Expose: - /* we'll redraw below */ - break; - case ConfigureNotify: - reshape(event.xconfigure.width, 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; - } - } - } - } - } - - /* next frame */ - angle += 2.0; - - draw(); - glXSwapBuffers(dpy, win); - - /* calc framerate */ - { - static int t0 = -1; - static int frames = 0; - int t = current_time(); - - if (t0 < 0) - t0 = t; - - frames++; - - if (t - t0 >= 5.0) { - GLfloat seconds = t - t0; - GLfloat fps = frames / seconds; - printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, - fps); - t0 = t; - frames = 0; - } - } - } -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - Window win; - GLXWindow glxWin; - GLXContext ctx; - const 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; - } - } - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); - return -1; - } - - make_window(dpy, "glxgears", 0, 0, 300, 300, &win, &glxWin, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, glxWin, ctx); - - 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)); - } - - init(); - - event_loop(dpy, glxWin); - - glXDestroyContext(dpy, ctx); - destroy_window(dpy, glxWin); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/glxgears_pixmap.c b/progs/xdemos/glxgears_pixmap.c deleted file mode 100644 index 661d130e41c..00000000000 --- a/progs/xdemos/glxgears_pixmap.c +++ /dev/null @@ -1,547 +0,0 @@ -/* - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. - * Copyright (C) 2008 Red Hat, Inc 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. - */ - -/** - * \file glxgears_pixmap.c - * Yet-another-version of gears. Originally ported to GLX by Brian Paul on - * 23 March 2001. Modified to use fbconfigs by Ian Romanick on 10 Feb 2004. - * - * Command line options: - * -info print GL implementation information - * - * \author Brian Paul - * \author Ian Romanick <[email protected]> - * \author Kristian Hoegsberg <[email protected]> - */ - - -#define GLX_GLXEXT_PROTOTYPES - -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <GL/gl.h> -#include <GL/glx.h> -#include <GL/glxext.h> -#include <assert.h> -#include "pbutil.h" - -#define BENCHMARK - -#ifdef BENCHMARK - -/* XXX this probably isn't very portable */ - -#include <sys/time.h> -#include <unistd.h> - -/* return current time (in seconds) */ -static int -current_time(void) -{ - struct timeval tv; -#ifdef __VMS - (void) gettimeofday(&tv, NULL ); -#else - struct timezone tz; - (void) gettimeofday(&tv, &tz); -#endif - return (int) tv.tv_sec; -} - -#else /*BENCHMARK*/ - -/* dummy */ -static int -current_time(void) -{ - return 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; - - -/* - * - * 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 -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(); -} - - -struct gears { - Window win; - GLXContext ctx; - Pixmap pixmap; - GLXPixmap glxpixmap; - GC gc; - int width, height; -}; - - -/* new window size or exposure */ -static void -reshape(struct gears *gears, int width, int height) -{ - gears->width = width; - gears->height = height; -} - - -static void -init(int width, int height) -{ - 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 }; - GLfloat h = (GLfloat) height / (GLfloat) width; - - 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); - - glViewport(0, 0, (GLint) width, (GLint) height); - 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); -} - -/* - * 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, struct gears *gears) -{ - int attrib[] = { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, GL_FALSE, - GLX_DEPTH_SIZE, 1, - None }; - GLXFBConfig * fbconfig; - int num_configs; - int scrnum; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - XVisualInfo *visinfo; - - gears->width = width; - gears->height = height; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - fbconfig = glXChooseFBConfig(dpy, scrnum, attrib, & num_configs); - if (fbconfig == NULL) { - printf("Error: couldn't get an RGB, Double-buffered visual\n"); - exit(1); - } - - /* window attributes */ - visinfo = glXGetVisualFromFBConfig(dpy, fbconfig[0]); - assert(visinfo != NULL); - 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; - - gears->win = XCreateWindow( dpy, root, 0, 0, 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, gears->win, &sizehints); - XSetStandardProperties(dpy, gears->win, name, name, - None, (char **)NULL, 0, &sizehints); - } - - gears->gc = XCreateGC(dpy, gears->win, 0, NULL); - - gears->pixmap = XCreatePixmap(dpy, gears->win, - width, height, visinfo->depth); - if (!gears->pixmap) { - printf("Error: XCreatePixmap failed\n"); - exit(-1); - } - - gears->glxpixmap = glXCreatePixmap(dpy, fbconfig[0], gears->pixmap, NULL); - if (!gears->glxpixmap) { - printf("Error: glXCreatePixmap failed\n"); - exit(-1); - } - - gears->ctx = glXCreateNewContext(dpy, fbconfig[0], - GLX_RGBA_TYPE, NULL, GL_TRUE); - if (!gears->ctx) { - printf("Error: glXCreateNewContext failed\n"); - exit(1); - } - - XFree(fbconfig); -} - - -static void -event_loop(Display *dpy, struct gears *gears) -{ - int x, y; - - while (1) { - while (XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - switch (event.type) { - case Expose: - /* we'll redraw below */ - break; - case ConfigureNotify: - reshape(gears, event.xconfigure.width, 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; - } - } - } - } - } - - /* next frame */ - angle += 2.0; - - draw(); - glFinish(); - - for (x = 0; x < gears->width; x += 100) - for (y = 0; y < gears->width; y += 100) - XCopyArea(dpy, gears->pixmap, gears->win, gears->gc, - 50, 50, 100, 100, x, y); - - /* calc framerate */ - { - static int t0 = -1; - static int frames = 0; - int t = current_time(); - - if (t0 < 0) - t0 = t; - - frames++; - - if (t - t0 >= 5.0) { - GLfloat seconds = t - t0; - GLfloat fps = frames / seconds; - printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, - fps); - t0 = t; - frames = 0; - } - } - } -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - const char *dpyName = NULL; - GLboolean printInfo = GL_FALSE; - struct gears gears; - int i, width = 200, height = 200; - - 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; - } - } - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); - return -1; - } - - make_window(dpy, "glxgears", 0, 0, width, height, &gears); - XMapWindow(dpy, gears.win); - glXMakeCurrent(dpy, gears.glxpixmap, gears.ctx); - - 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)); - } - - init(width, height); - - event_loop(dpy, &gears); - - glXDestroyContext(dpy, gears.ctx); - XDestroyWindow(dpy, gears.win); - glXDestroyPixmap(dpy, gears.pixmap); - XFreePixmap(dpy, gears.pixmap); - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/glxheads.c b/progs/xdemos/glxheads.c deleted file mode 100644 index edae0a3ef73..00000000000 --- a/progs/xdemos/glxheads.c +++ /dev/null @@ -1,313 +0,0 @@ - -/* - * Exercise multiple GLX connections on multiple X displays. - * Direct GLX contexts are attempted first, then indirect. - * Each window will display a spinning green triangle. - * - * 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. - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - - -/* - * Each display/window/context: - */ -struct head { - char DisplayName[1000]; - Display *Dpy; - Window Win; - GLXContext Context; - float Angle; - char Renderer[1000]; - char Vendor[1000]; - char Version[1000]; -}; - - -#define MAX_HEADS 20 -static struct head Heads[MAX_HEADS]; -static int NumHeads = 0; - - -static void -Error(const char *display, const char *msg) -{ - fprintf(stderr, "Error on display %s - %s\n", XDisplayName(display), msg); - exit(1); -} - - -static struct head * -AddHead(const char *displayName) -{ - Display *dpy; - Window win; - GLXContext ctx; - 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; - XVisualInfo *visinfo; - int width = 300, height = 300; - int xpos = 10, ypos = 10; - - if (NumHeads >= MAX_HEADS) - return NULL; - - dpy = XOpenDisplay(displayName); - if (!dpy) { - Error(displayName, "Unable to open display"); - return NULL; - } - - scrnum = DefaultScreen(dpy); - root = RootWindow(dpy, scrnum); - - visinfo = glXChooseVisual(dpy, scrnum, attrib); - if (!visinfo) { - Error(displayName, "Unable to find RGB, double-buffered visual"); - return NULL; - } - - /* 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, 0, 0, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - if (!win) { - Error(displayName, "Couldn't create window"); - return NULL; - } - - { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, displayName, displayName, - None, (char **)NULL, 0, &sizehints); - } - - - ctx = glXCreateContext(dpy, visinfo, NULL, True); - if (!ctx) { - Error(displayName, "Couldn't create GLX context"); - return NULL; - } - - XMapWindow(dpy, win); - - if (!glXMakeCurrent(dpy, win, ctx)) { - Error(displayName, "glXMakeCurrent failed"); - printf("glXMakeCurrent failed in Redraw()\n"); - return NULL; - } - - /* save the info for this head */ - { - struct head *h = &Heads[NumHeads]; - const char * tmp; - - if (strlen(displayName) + 1 > sizeof(h->DisplayName)) { - Error(displayName, "displayName string length overflow"); - return NULL; - } - strcpy(h->DisplayName, displayName); - - h->Dpy = dpy; - h->Win = win; - h->Context = ctx; - h->Angle = 0.0; - - tmp = (char *) glGetString(GL_VERSION); - if (strlen(tmp) + 1 > sizeof(h->Version)) { - Error(displayName, "GL_VERSION string length overflow"); - return NULL; - } - strcpy(h->Version, tmp); - - tmp = (char *) glGetString(GL_VENDOR); - if (strlen(tmp) + 1 > sizeof(h->Vendor)) { - Error(displayName, "GL_VENDOR string length overflow"); - return NULL; - } - strcpy(h->Vendor, tmp); - - tmp = (char *) glGetString(GL_RENDERER); - if (strlen(tmp) + 1 > sizeof(h->Renderer)) { - Error(displayName, "GL_RENDERER string length overflow"); - return NULL; - } - strcpy(h->Renderer, tmp); - - NumHeads++; - return &Heads[NumHeads-1]; - } - -} - - -static void -Redraw(struct head *h) -{ - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed"); - printf("glXMakeCurrent failed in Redraw()\n"); - return; - } - - h->Angle += 1.0; - - glShadeModel(GL_FLAT); - glClearColor(0.5, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* draw green triangle */ - glColor3f(0.0, 1.0, 0.0); - glPushMatrix(); - glRotatef(h->Angle, 0, 0, 1); - glBegin(GL_TRIANGLES); - glVertex2f(0, 0.8); - glVertex2f(-0.8, -0.7); - glVertex2f(0.8, -0.7); - glEnd(); - glPopMatrix(); - - glXSwapBuffers(h->Dpy, h->Win); -} - - - -static void -Resize(const struct head *h, unsigned int width, unsigned int height) -{ - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed in Resize()"); - return; - } - glFlush(); - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); -} - - - -static void -EventLoop(void) -{ - while (1) { - int i; - for (i = 0; i < NumHeads; i++) { - struct head *h = &Heads[i]; - while (XPending(h->Dpy) > 0) { - XEvent event; - XNextEvent(h->Dpy, &event); - if (event.xany.window == h->Win) { - switch (event.type) { - case Expose: - Redraw(h); - break; - case ConfigureNotify: - Resize(h, event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - return; - default: - /*no-op*/ ; - } - } - else { - printf("window mismatch\n"); - } - } - Redraw(h); - } - usleep(1); - } -} - - - -static void -PrintInfo(const struct head *h) -{ - printf("Name: %s\n", h->DisplayName); - printf(" Display: %p\n", (void *) h->Dpy); - printf(" Window: 0x%x\n", (int) h->Win); - printf(" Context: 0x%lx\n", (long) h->Context); - printf(" GL_VERSION: %s\n", h->Version); - printf(" GL_VENDOR: %s\n", h->Vendor); - printf(" GL_RENDERER: %s\n", h->Renderer); -} - - -int -main(int argc, char *argv[]) -{ - int i; - if (argc == 1) { - struct head *h; - printf("glxheads: exercise multiple GLX connections (any key = exit)\n"); - printf("Usage:\n"); - printf(" glxheads xdisplayname ...\n"); - printf("Example:\n"); - printf(" glxheads :0 mars:0 venus:1\n"); - - h = AddHead(XDisplayName(NULL)); - if (h) - PrintInfo(h); - } - else { - for (i = 1; i < argc; i++) { - const char *name = argv[i]; - struct head *h = AddHead(name); - if (h) { - PrintInfo(h); - } - } - } - - EventLoop(); - return 0; -} diff --git a/progs/xdemos/glxinfo.c b/progs/xdemos/glxinfo.c deleted file mode 100644 index b774f504aec..00000000000 --- a/progs/xdemos/glxinfo.c +++ /dev/null @@ -1,1269 +0,0 @@ -/* - * Copyright (C) 1999-2006 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 is a work-alike of the IRIX glxinfo program. - * Command line options: - * -t print wide table - * -v print verbose information - * -display DisplayName specify the X display to interogate - * -b only print ID of "best" visual on screen 0 - * -i use indirect rendering connection only - * -l print interesting OpenGL limits (added 5 Sep 2002) - * - * Brian Paul 26 January 2000 - */ - -#define GLX_GLXEXT_PROTOTYPES - -#include <assert.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - - -#ifndef GLX_NONE_EXT -#define GLX_NONE_EXT 0x8000 -#endif - -#ifndef GLX_TRANSPARENT_RGB -#define GLX_TRANSPARENT_RGB 0x8008 -#endif - -#ifndef GLX_RGBA_BIT -#define GLX_RGBA_BIT 0x00000001 -#endif - -#ifndef GLX_COLOR_INDEX_BIT -#define GLX_COLOR_INDEX_BIT 0x00000002 -#endif - -typedef enum -{ - Normal, - Wide, - Verbose -} InfoMode; - - -struct visual_attribs -{ - /* X visual attribs */ - int id; - int klass; - int depth; - int redMask, greenMask, blueMask; - int colormapSize; - int bitsPerRGB; - - /* GL visual attribs */ - int supportsGL; - int drawableType; - int transparentType; - int transparentRedValue; - int transparentGreenValue; - int transparentBlueValue; - int transparentAlphaValue; - int transparentIndexValue; - int bufferSize; - int level; - int render_type; - int doubleBuffer; - int stereo; - int auxBuffers; - int redSize, greenSize, blueSize, alphaSize; - int depthSize; - int stencilSize; - int accumRedSize, accumGreenSize, accumBlueSize, accumAlphaSize; - int numSamples, numMultisample; - int visualCaveat; - int floatComponents; - int srgb; -}; - - -/* - * Print a list of extensions, with word-wrapping. - */ -static void -print_extension_list(const char *ext) -{ - const char *indentString = " "; - const int indent = 4; - const int max = 79; - int width, i, j; - - if (!ext || !ext[0]) - return; - - width = indent; - printf("%s", indentString); - i = j = 0; - while (1) { - if (ext[j] == ' ' || ext[j] == 0) { - /* found end of an extension name */ - const int len = j - i; - if (width + len > max) { - /* start a new line */ - printf("\n"); - width = indent; - printf("%s", indentString); - } - /* print the extension name between ext[i] and ext[j] */ - while (i < j) { - printf("%c", ext[i]); - i++; - } - /* either we're all done, or we'll continue with next extension */ - width += len + 1; - if (ext[j] == 0) { - break; - } - else { - i++; - j++; - if (ext[j] == 0) - break; - printf(", "); - width += 2; - } - } - j++; - } - printf("\n"); -} - - -static void -print_display_info(Display *dpy) -{ - printf("name of display: %s\n", DisplayString(dpy)); -} - - -/** - * Print interesting limits for vertex/fragment programs. - */ -static void -print_program_limits(GLenum target) -{ -#if defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program) - struct token_name { - GLenum token; - const char *name; - }; - static const struct token_name common_limits[] = { - { GL_MAX_PROGRAM_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_TEMPORARIES_ARB, "GL_MAX_PROGRAM_TEMPORARIES_ARB" }, - { GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" }, - { GL_MAX_PROGRAM_PARAMETERS_ARB, "GL_MAX_PROGRAM_PARAMETERS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" }, - { GL_MAX_PROGRAM_ATTRIBS_ARB, "GL_MAX_PROGRAM_ATTRIBS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" }, - { GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, - { GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" }, - { GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" }, - { (GLenum) 0, NULL } - }; - static const struct token_name fragment_limits[] = { - { GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, - { GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, - { (GLenum) 0, NULL } - }; - - PFNGLGETPROGRAMIVARBPROC GetProgramivARB_func = (PFNGLGETPROGRAMIVARBPROC) - glXGetProcAddressARB((GLubyte *) "glGetProgramivARB"); - - GLint max[1]; - int i; - - if (target == GL_VERTEX_PROGRAM_ARB) { - printf(" GL_VERTEX_PROGRAM_ARB:\n"); - } - else if (target == GL_FRAGMENT_PROGRAM_ARB) { - printf(" GL_FRAGMENT_PROGRAM_ARB:\n"); - } - else { - return; /* something's wrong */ - } - - for (i = 0; common_limits[i].token; i++) { - GetProgramivARB_func(target, common_limits[i].token, max); - if (glGetError() == GL_NO_ERROR) { - printf(" %s = %d\n", common_limits[i].name, max[0]); - } - } - if (target == GL_FRAGMENT_PROGRAM_ARB) { - for (i = 0; fragment_limits[i].token; i++) { - GetProgramivARB_func(target, fragment_limits[i].token, max); - if (glGetError() == GL_NO_ERROR) { - printf(" %s = %d\n", fragment_limits[i].name, max[0]); - } - } - } -#endif /* GL_ARB_vertex_program / GL_ARB_fragment_program */ -} - - -/** - * Print interesting limits for vertex/fragment shaders. - */ -static void -print_shader_limits(GLenum target) -{ - struct token_name { - GLenum token; - const char *name; - }; -#if defined(GL_ARB_vertex_shader) - static const struct token_name vertex_limits[] = { - { GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" }, - { GL_MAX_VARYING_FLOATS_ARB, "GL_MAX_VARYING_FLOATS_ARB" }, - { GL_MAX_VERTEX_ATTRIBS_ARB, "GL_MAX_VERTEX_ATTRIBS_ARB" }, - { GL_MAX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, - { GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" }, - { GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" }, - { GL_MAX_TEXTURE_COORDS_ARB, "GL_MAX_TEXTURE_COORDS_ARB" }, - { (GLenum) 0, NULL } - }; -#endif -#if defined(GL_ARB_fragment_shader) - static const struct token_name fragment_limits[] = { - { GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" }, - { GL_MAX_TEXTURE_COORDS_ARB, "GL_MAX_TEXTURE_COORDS_ARB" }, - { GL_MAX_TEXTURE_IMAGE_UNITS_ARB, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, - { (GLenum) 0, NULL } - }; -#endif - GLint max[1]; - int i; - -#if defined(GL_ARB_vertex_shader) - if (target == GL_VERTEX_SHADER_ARB) { - printf(" GL_VERTEX_SHADER_ARB:\n"); - for (i = 0; vertex_limits[i].token; i++) { - glGetIntegerv(vertex_limits[i].token, max); - if (glGetError() == GL_NO_ERROR) { - printf(" %s = %d\n", vertex_limits[i].name, max[0]); - } - } - } -#endif -#if defined(GL_ARB_fragment_shader) - if (target == GL_FRAGMENT_SHADER_ARB) { - printf(" GL_FRAGMENT_SHADER_ARB:\n"); - for (i = 0; fragment_limits[i].token; i++) { - glGetIntegerv(fragment_limits[i].token, max); - if (glGetError() == GL_NO_ERROR) { - printf(" %s = %d\n", fragment_limits[i].name, max[0]); - } - } - } -#endif -} - - -/** - * Print interesting OpenGL implementation limits. - */ -static void -print_limits(const char *extensions) -{ - struct token_name { - GLuint count; - GLenum token; - const char *name; - }; - static const struct token_name limits[] = { - { 1, GL_MAX_ATTRIB_STACK_DEPTH, "GL_MAX_ATTRIB_STACK_DEPTH" }, - { 1, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH" }, - { 1, GL_MAX_CLIP_PLANES, "GL_MAX_CLIP_PLANES" }, - { 1, GL_MAX_COLOR_MATRIX_STACK_DEPTH, "GL_MAX_COLOR_MATRIX_STACK_DEPTH" }, - { 1, GL_MAX_ELEMENTS_VERTICES, "GL_MAX_ELEMENTS_VERTICES" }, - { 1, GL_MAX_ELEMENTS_INDICES, "GL_MAX_ELEMENTS_INDICES" }, - { 1, GL_MAX_EVAL_ORDER, "GL_MAX_EVAL_ORDER" }, - { 1, GL_MAX_LIGHTS, "GL_MAX_LIGHTS" }, - { 1, GL_MAX_LIST_NESTING, "GL_MAX_LIST_NESTING" }, - { 1, GL_MAX_MODELVIEW_STACK_DEPTH, "GL_MAX_MODELVIEW_STACK_DEPTH" }, - { 1, GL_MAX_NAME_STACK_DEPTH, "GL_MAX_NAME_STACK_DEPTH" }, - { 1, GL_MAX_PIXEL_MAP_TABLE, "GL_MAX_PIXEL_MAP_TABLE" }, - { 1, GL_MAX_PROJECTION_STACK_DEPTH, "GL_MAX_PROJECTION_STACK_DEPTH" }, - { 1, GL_MAX_TEXTURE_STACK_DEPTH, "GL_MAX_TEXTURE_STACK_DEPTH" }, - { 1, GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE" }, - { 1, GL_MAX_3D_TEXTURE_SIZE, "GL_MAX_3D_TEXTURE_SIZE" }, - { 2, GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS" }, - { 2, GL_ALIASED_LINE_WIDTH_RANGE, "GL_ALIASED_LINE_WIDTH_RANGE" }, - { 2, GL_SMOOTH_LINE_WIDTH_RANGE, "GL_SMOOTH_LINE_WIDTH_RANGE" }, - { 2, GL_ALIASED_POINT_SIZE_RANGE, "GL_ALIASED_POINT_SIZE_RANGE" }, - { 2, GL_SMOOTH_POINT_SIZE_RANGE, "GL_SMOOTH_POINT_SIZE_RANGE" }, -#if defined(GL_ARB_texture_cube_map) - { 1, GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, "GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB" }, -#endif -#if defined(GLX_NV_texture_rectangle) - { 1, GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, "GL_MAX_RECTANGLE_TEXTURE_SIZE_NV" }, -#endif -#if defined(GL_ARB_texture_compression) - { 1, GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB" }, -#endif -#if defined(GL_ARB_multitexture) - { 1, GL_MAX_TEXTURE_UNITS_ARB, "GL_MAX_TEXTURE_UNITS_ARB" }, -#endif -#if defined(GL_EXT_texture_lod_bias) - { 1, GL_MAX_TEXTURE_LOD_BIAS_EXT, "GL_MAX_TEXTURE_LOD_BIAS_EXT" }, -#endif -#if defined(GL_EXT_texture_filter_anisotropic) - { 1, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" }, -#endif -#if defined(GL_ARB_draw_buffers) - { 1, GL_MAX_DRAW_BUFFERS_ARB, "GL_MAX_DRAW_BUFFERS_ARB" }, -#endif - { 0, (GLenum) 0, NULL } - }; - GLint i, max[2]; - - printf("OpenGL limits:\n"); - for (i = 0; limits[i].count; i++) { - glGetIntegerv(limits[i].token, max); - if (glGetError() == GL_NO_ERROR) { - if (limits[i].count == 1) - printf(" %s = %d\n", limits[i].name, max[0]); - else /* XXX fix if we ever query something with more than 2 values */ - printf(" %s = %d, %d\n", limits[i].name, max[0], max[1]); - } - } - - /* these don't fit into the above mechanism, unfortunately */ - glGetConvolutionParameteriv(GL_CONVOLUTION_2D, GL_MAX_CONVOLUTION_WIDTH, max); - glGetConvolutionParameteriv(GL_CONVOLUTION_2D, GL_MAX_CONVOLUTION_HEIGHT, max+1); - if (glGetError() == GL_NONE) { - printf(" GL_MAX_CONVOLUTION_WIDTH/HEIGHT = %d, %d\n", max[0], max[1]); - } - -#if defined(GL_ARB_vertex_program) - if (strstr(extensions, "GL_ARB_vertex_program")) { - print_program_limits(GL_VERTEX_PROGRAM_ARB); - } -#endif -#if defined(GL_ARB_fragment_program) - if (strstr(extensions, "GL_ARB_fragment_program")) { - print_program_limits(GL_FRAGMENT_PROGRAM_ARB); - } -#endif -#if defined(GL_ARB_vertex_shader) - if (strstr(extensions, "GL_ARB_vertex_shader")) { - print_shader_limits(GL_VERTEX_SHADER_ARB); - } -#endif -#if defined(GL_ARB_fragment_shader) - if (strstr(extensions, "GL_ARB_fragment_shader")) { - print_shader_limits(GL_FRAGMENT_SHADER_ARB); - } -#endif -} - - -static void -print_screen_info(Display *dpy, int scrnum, Bool allowDirect, GLboolean limits) -{ - Window win; - int attribSingle[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None }; - int attribDouble[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - None }; - - XSetWindowAttributes attr; - unsigned long mask; - Window root; - GLXContext ctx = NULL; - XVisualInfo *visinfo; - int width = 100, height = 100; - - root = RootWindow(dpy, scrnum); - - /* - * Find a basic GLX visual. We'll then create a rendering context and - * query various info strings. - */ - visinfo = glXChooseVisual(dpy, scrnum, attribSingle); - if (!visinfo) - visinfo = glXChooseVisual(dpy, scrnum, attribDouble); - - if (visinfo) - ctx = glXCreateContext( dpy, visinfo, NULL, allowDirect ); - -#ifdef GLX_VERSION_1_3 - /* Try glXChooseFBConfig() if glXChooseVisual didn't work. - * XXX when would that happen? - */ - if (!visinfo) { - int fbAttribSingle[] = { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, GL_FALSE, - None }; - int fbAttribDouble[] = { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, GL_TRUE, - None }; - GLXFBConfig *configs = NULL; - int nConfigs; - - configs = glXChooseFBConfig(dpy, scrnum, fbAttribSingle, &nConfigs); - if (!configs) - configs = glXChooseFBConfig(dpy, scrnum, fbAttribDouble, &nConfigs); - - if (configs) { - visinfo = glXGetVisualFromFBConfig(dpy, configs[0]); - ctx = glXCreateNewContext(dpy, configs[0], GLX_RGBA_TYPE, NULL, allowDirect); - XFree(configs); - } - } -#endif - - if (!visinfo) { - fprintf(stderr, "Error: couldn't find RGB GLX visual or fbconfig\n"); - return; - } - - if (!ctx) { - fprintf(stderr, "Error: glXCreateContext failed\n"); - XFree(visinfo); - return; - } - - 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); - - if (glXMakeCurrent(dpy, win, ctx)) { - const char *serverVendor = glXQueryServerString(dpy, scrnum, GLX_VENDOR); - const char *serverVersion = glXQueryServerString(dpy, scrnum, GLX_VERSION); - const char *serverExtensions = glXQueryServerString(dpy, scrnum, GLX_EXTENSIONS); - const char *clientVendor = glXGetClientString(dpy, GLX_VENDOR); - const char *clientVersion = glXGetClientString(dpy, GLX_VERSION); - const char *clientExtensions = glXGetClientString(dpy, GLX_EXTENSIONS); - const char *glxExtensions = glXQueryExtensionsString(dpy, scrnum); - const char *glVendor = (const char *) glGetString(GL_VENDOR); - const char *glRenderer = (const char *) glGetString(GL_RENDERER); - const char *glVersion = (const char *) glGetString(GL_VERSION); - const char *glExtensions = (const char *) glGetString(GL_EXTENSIONS); - int glxVersionMajor; - int glxVersionMinor; - char *displayName = NULL; - char *colon = NULL, *period = NULL; - - if (! glXQueryVersion( dpy, & glxVersionMajor, & glxVersionMinor )) { - fprintf(stderr, "Error: glXQueryVersion failed\n"); - exit(1); - } - - /* Strip the screen number from the display name, if present. */ - if (!(displayName = (char *) malloc(strlen(DisplayString(dpy)) + 1))) { - fprintf(stderr, "Error: malloc() failed\n"); - exit(1); - } - strcpy(displayName, DisplayString(dpy)); - colon = strrchr(displayName, ':'); - if (colon) { - period = strchr(colon, '.'); - if (period) - *period = '\0'; - } - printf("display: %s screen: %d\n", displayName, scrnum); - free(displayName); - printf("direct rendering: "); - if (glXIsDirect(dpy, ctx)) { - printf("Yes\n"); - } else { - if (!allowDirect) { - printf("No (-i specified)\n"); - } else if (getenv("LIBGL_ALWAYS_INDIRECT")) { - printf("No (LIBGL_ALWAYS_INDIRECT set)\n"); - } else { - printf("No (If you want to find out why, try setting " - "LIBGL_DEBUG=verbose)\n"); - } - } - printf("server glx vendor string: %s\n", serverVendor); - printf("server glx version string: %s\n", serverVersion); - printf("server glx extensions:\n"); - print_extension_list(serverExtensions); - printf("client glx vendor string: %s\n", clientVendor); - printf("client glx version string: %s\n", clientVersion); - printf("client glx extensions:\n"); - print_extension_list(clientExtensions); - printf("GLX version: %u.%u\n", glxVersionMajor, glxVersionMinor); - printf("GLX extensions:\n"); - print_extension_list(glxExtensions); - printf("OpenGL vendor string: %s\n", glVendor); - printf("OpenGL renderer string: %s\n", glRenderer); - printf("OpenGL version string: %s\n", glVersion); -#ifdef GL_VERSION_2_0 - if (glVersion[0] >= '2' && glVersion[1] == '.') { - char *v = (char *) glGetString(GL_SHADING_LANGUAGE_VERSION); - printf("OpenGL shading language version string: %s\n", v); - } -#endif - - printf("OpenGL extensions:\n"); - print_extension_list(glExtensions); - if (limits) - print_limits(glExtensions); - } - else { - fprintf(stderr, "Error: glXMakeCurrent failed\n"); - } - - glXDestroyContext(dpy, ctx); - XFree(visinfo); - XDestroyWindow(dpy, win); -} - - -static const char * -visual_class_name(int cls) -{ - switch (cls) { - case StaticColor: - return "StaticColor"; - case PseudoColor: - return "PseudoColor"; - case StaticGray: - return "StaticGray"; - case GrayScale: - return "GrayScale"; - case TrueColor: - return "TrueColor"; - case DirectColor: - return "DirectColor"; - default: - return ""; - } -} - -static const char * -visual_drawable_type(int type) -{ - static char buffer[256], *p; - const static struct { int bit; const char *name; } bits[] = { - { GLX_WINDOW_BIT, "window" }, - { GLX_PIXMAP_BIT, "pixmap" }, - { GLX_PBUFFER_BIT, "pbuffer" } - }; - int i; - - p = buffer; - for (i = 0; i < 3; i++) { - if (p > buffer) - *p++ = ','; - if (type & bits[i].bit) - strcpy(p, bits[i].name); - p += strlen(bits[i].name); - } - - return buffer; -} - -static const char * -visual_class_abbrev(int cls) -{ - switch (cls) { - case StaticColor: - return "sc"; - case PseudoColor: - return "pc"; - case StaticGray: - return "sg"; - case GrayScale: - return "gs"; - case TrueColor: - return "tc"; - case DirectColor: - return "dc"; - default: - return ""; - } -} - -static const char * -visual_render_type_name(int type) -{ - switch (type) { - case GLX_RGBA_BIT: - return "rgba"; - case GLX_COLOR_INDEX_BIT: - return "ci"; - case GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT: - return "rgba|ci"; - default: - return ""; - } -} - -static const char * -caveat_string(int caveat) -{ - switch (caveat) { -#ifdef GLX_EXT_visual_rating - case GLX_SLOW_VISUAL_EXT: - return "Slow"; - case GLX_NON_CONFORMANT_VISUAL_EXT: - return "Ncon"; - case GLX_NONE_EXT: - /* fall-through */ -#endif - case 0: - /* fall-through */ - default: - return "None"; - } -} - - -static GLboolean -get_visual_attribs(Display *dpy, XVisualInfo *vInfo, - struct visual_attribs *attribs) -{ - const char *ext = glXQueryExtensionsString(dpy, vInfo->screen); - int rgba; - - memset(attribs, 0, sizeof(struct visual_attribs)); - - attribs->id = vInfo->visualid; -#if defined(__cplusplus) || defined(c_plusplus) - attribs->klass = vInfo->c_class; -#else - attribs->klass = vInfo->class; -#endif - attribs->depth = vInfo->depth; - attribs->redMask = vInfo->red_mask; - attribs->greenMask = vInfo->green_mask; - attribs->blueMask = vInfo->blue_mask; - attribs->colormapSize = vInfo->colormap_size; - attribs->bitsPerRGB = vInfo->bits_per_rgb; - - if (glXGetConfig(dpy, vInfo, GLX_USE_GL, &attribs->supportsGL) != 0 || - !attribs->supportsGL) - return GL_FALSE; - glXGetConfig(dpy, vInfo, GLX_BUFFER_SIZE, &attribs->bufferSize); - glXGetConfig(dpy, vInfo, GLX_LEVEL, &attribs->level); - glXGetConfig(dpy, vInfo, GLX_RGBA, &rgba); - if (rgba) - attribs->render_type = GLX_RGBA_BIT; - else - attribs->render_type = GLX_COLOR_INDEX_BIT; - - glXGetConfig(dpy, vInfo, GLX_DRAWABLE_TYPE, &attribs->drawableType); - glXGetConfig(dpy, vInfo, GLX_DOUBLEBUFFER, &attribs->doubleBuffer); - glXGetConfig(dpy, vInfo, GLX_STEREO, &attribs->stereo); - glXGetConfig(dpy, vInfo, GLX_AUX_BUFFERS, &attribs->auxBuffers); - glXGetConfig(dpy, vInfo, GLX_RED_SIZE, &attribs->redSize); - glXGetConfig(dpy, vInfo, GLX_GREEN_SIZE, &attribs->greenSize); - glXGetConfig(dpy, vInfo, GLX_BLUE_SIZE, &attribs->blueSize); - glXGetConfig(dpy, vInfo, GLX_ALPHA_SIZE, &attribs->alphaSize); - glXGetConfig(dpy, vInfo, GLX_DEPTH_SIZE, &attribs->depthSize); - glXGetConfig(dpy, vInfo, GLX_STENCIL_SIZE, &attribs->stencilSize); - glXGetConfig(dpy, vInfo, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize); - glXGetConfig(dpy, vInfo, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize); - glXGetConfig(dpy, vInfo, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize); - glXGetConfig(dpy, vInfo, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize); - - /* get transparent pixel stuff */ - glXGetConfig(dpy, vInfo,GLX_TRANSPARENT_TYPE, &attribs->transparentType); - if (attribs->transparentType == GLX_TRANSPARENT_RGB) { - glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_RED_VALUE, &attribs->transparentRedValue); - glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_GREEN_VALUE, &attribs->transparentGreenValue); - glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_BLUE_VALUE, &attribs->transparentBlueValue); - glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_ALPHA_VALUE, &attribs->transparentAlphaValue); - } - else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { - glXGetConfig(dpy, vInfo, GLX_TRANSPARENT_INDEX_VALUE, &attribs->transparentIndexValue); - } - - /* multisample attribs */ -#ifdef GLX_ARB_multisample - if (ext && strstr(ext, "GLX_ARB_multisample")) { - glXGetConfig(dpy, vInfo, GLX_SAMPLE_BUFFERS_ARB, &attribs->numMultisample); - glXGetConfig(dpy, vInfo, GLX_SAMPLES_ARB, &attribs->numSamples); - } -#endif - else { - attribs->numSamples = 0; - attribs->numMultisample = 0; - } - -#if defined(GLX_EXT_visual_rating) - if (ext && strstr(ext, "GLX_EXT_visual_rating")) { - glXGetConfig(dpy, vInfo, GLX_VISUAL_CAVEAT_EXT, &attribs->visualCaveat); - } - else { - attribs->visualCaveat = GLX_NONE_EXT; - } -#else - attribs->visualCaveat = 0; -#endif - -#if defined(GLX_EXT_framebuffer_sRGB) - if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) { - glXGetConfig(dpy, vInfo, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb); - } -#endif - - return GL_TRUE; -} - -#ifdef GLX_VERSION_1_3 - -static int -glx_token_to_visual_class(int visual_type) -{ - switch (visual_type) { - case GLX_TRUE_COLOR: - return TrueColor; - case GLX_DIRECT_COLOR: - return DirectColor; - case GLX_PSEUDO_COLOR: - return PseudoColor; - case GLX_STATIC_COLOR: - return StaticColor; - case GLX_GRAY_SCALE: - return GrayScale; - case GLX_STATIC_GRAY: - return StaticGray; - case GLX_NONE: - default: - return None; - } -} - -static GLboolean -get_fbconfig_attribs(Display *dpy, GLXFBConfig fbconfig, - struct visual_attribs *attribs) -{ - const char *ext = glXQueryExtensionsString(dpy, 0); - int visual_type; - XVisualInfo *vInfo; - - memset(attribs, 0, sizeof(struct visual_attribs)); - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_FBCONFIG_ID, &attribs->id); - - vInfo = glXGetVisualFromFBConfig(dpy, fbconfig); - - if (vInfo != NULL) { - attribs->depth = vInfo->depth; - attribs->redMask = vInfo->red_mask; - attribs->greenMask = vInfo->green_mask; - attribs->blueMask = vInfo->blue_mask; - attribs->colormapSize = vInfo->colormap_size; - attribs->bitsPerRGB = vInfo->bits_per_rgb; - } - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_X_VISUAL_TYPE, &visual_type); - attribs->klass = glx_token_to_visual_class(visual_type); - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_DRAWABLE_TYPE, &attribs->drawableType); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_BUFFER_SIZE, &attribs->bufferSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_LEVEL, &attribs->level); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_RENDER_TYPE, &attribs->render_type); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_DOUBLEBUFFER, &attribs->doubleBuffer); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_STEREO, &attribs->stereo); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_AUX_BUFFERS, &attribs->auxBuffers); - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_RED_SIZE, &attribs->redSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_GREEN_SIZE, &attribs->greenSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_BLUE_SIZE, &attribs->blueSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_ALPHA_SIZE, &attribs->alphaSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_DEPTH_SIZE, &attribs->depthSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_STENCIL_SIZE, &attribs->stencilSize); - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize); - - /* get transparent pixel stuff */ - glXGetFBConfigAttrib(dpy, fbconfig,GLX_TRANSPARENT_TYPE, &attribs->transparentType); - if (attribs->transparentType == GLX_TRANSPARENT_RGB) { - glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_RED_VALUE, &attribs->transparentRedValue); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_GREEN_VALUE, &attribs->transparentGreenValue); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_BLUE_VALUE, &attribs->transparentBlueValue); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_ALPHA_VALUE, &attribs->transparentAlphaValue); - } - else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { - glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_INDEX_VALUE, &attribs->transparentIndexValue); - } - - glXGetFBConfigAttrib(dpy, fbconfig, GLX_SAMPLE_BUFFERS, &attribs->numMultisample); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_SAMPLES, &attribs->numSamples); - glXGetFBConfigAttrib(dpy, fbconfig, GLX_CONFIG_CAVEAT, &attribs->visualCaveat); - -#if defined(GLX_NV_float_buffer) - if (ext && strstr(ext, "GLX_NV_float_buffer")) { - glXGetFBConfigAttrib(dpy, fbconfig, GLX_FLOAT_COMPONENTS_NV, &attribs->floatComponents); - } -#endif -#if defined(GLX_ARB_fbconfig_float) - if (ext && strstr(ext, "GLX_ARB_fbconfig_float")) { - if (attribs->render_type & GLX_RGBA_FLOAT_BIT_ARB) { - attribs->floatComponents = True; - } - } -#endif - -#if defined(GLX_EXT_framebuffer_sRGB) - if (ext && strstr(ext, "GLX_EXT_framebuffer_sRGB")) { - glXGetFBConfigAttrib(dpy, fbconfig, GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT, &attribs->srgb); - } -#endif - return GL_TRUE; -} - -#endif - - - -static void -print_visual_attribs_verbose(const struct visual_attribs *attribs) -{ - printf("Visual ID: %x depth=%d class=%s, type=%s\n", - attribs->id, attribs->depth, visual_class_name(attribs->klass), - visual_drawable_type(attribs->drawableType)); - printf(" bufferSize=%d level=%d renderType=%s doubleBuffer=%d stereo=%d\n", - attribs->bufferSize, attribs->level, - visual_render_type_name(attribs->render_type), - attribs->doubleBuffer, attribs->stereo); - printf(" rgba: redSize=%d greenSize=%d blueSize=%d alphaSize=%d float=%c sRGB=%c\n", - attribs->redSize, attribs->greenSize, - attribs->blueSize, attribs->alphaSize, - attribs->floatComponents ? 'Y' : 'N', - attribs->srgb ? 'Y' : 'N'); - printf(" auxBuffers=%d depthSize=%d stencilSize=%d\n", - attribs->auxBuffers, attribs->depthSize, attribs->stencilSize); - printf(" accum: redSize=%d greenSize=%d blueSize=%d alphaSize=%d\n", - attribs->accumRedSize, attribs->accumGreenSize, - attribs->accumBlueSize, attribs->accumAlphaSize); - printf(" multiSample=%d multiSampleBuffers=%d\n", - attribs->numSamples, attribs->numMultisample); -#ifdef GLX_EXT_visual_rating - if (attribs->visualCaveat == GLX_NONE_EXT || attribs->visualCaveat == 0) - printf(" visualCaveat=None\n"); - else if (attribs->visualCaveat == GLX_SLOW_VISUAL_EXT) - printf(" visualCaveat=Slow\n"); - else if (attribs->visualCaveat == GLX_NON_CONFORMANT_VISUAL_EXT) - printf(" visualCaveat=Nonconformant\n"); -#endif - if (attribs->transparentType == GLX_NONE) { - printf(" Opaque.\n"); - } - else if (attribs->transparentType == GLX_TRANSPARENT_RGB) { - printf(" Transparent RGB: Red=%d Green=%d Blue=%d Alpha=%d\n",attribs->transparentRedValue,attribs->transparentGreenValue,attribs->transparentBlueValue,attribs->transparentAlphaValue); - } - else if (attribs->transparentType == GLX_TRANSPARENT_INDEX) { - printf(" Transparent index=%d\n",attribs->transparentIndexValue); - } -} - - -static void -print_visual_attribs_short_header(void) -{ - printf(" visual x bf lv rg d st colorbuffer sr ax dp st accumbuffer ms cav\n"); - printf(" id dep cl sp sz l ci b ro r g b a F gb bf th cl r g b a ns b eat\n"); - printf("----------------------------------------------------------------------------\n"); -} - - -static void -print_visual_attribs_short(const struct visual_attribs *attribs) -{ - const char *caveat = caveat_string(attribs->visualCaveat); - - printf("0x%03x %2d %2s %2d %3d %2d %c%c %c %c %2d %2d %2d %2d %c %c %2d %2d %2d", - attribs->id, - attribs->depth, - visual_class_abbrev(attribs->klass), - attribs->transparentType != GLX_NONE, - attribs->bufferSize, - attribs->level, - (attribs->render_type & GLX_RGBA_BIT) ? 'r' : ' ', - (attribs->render_type & GLX_COLOR_INDEX_BIT) ? 'c' : ' ', - attribs->doubleBuffer ? 'y' : '.', - attribs->stereo ? 'y' : '.', - attribs->redSize, attribs->greenSize, - attribs->blueSize, attribs->alphaSize, - attribs->floatComponents ? 'f' : '.', - attribs->srgb ? 's' : '.', - attribs->auxBuffers, - attribs->depthSize, - attribs->stencilSize - ); - - printf(" %2d %2d %2d %2d %2d %1d %s\n", - attribs->accumRedSize, attribs->accumGreenSize, - attribs->accumBlueSize, attribs->accumAlphaSize, - attribs->numSamples, attribs->numMultisample, - caveat - ); -} - - -static void -print_visual_attribs_long_header(void) -{ - printf("Vis Vis Visual Trans buff lev render DB ste r g b a s aux dep ste accum buffer MS MS \n"); - printf(" ID Depth Type parent size el type reo sz sz sz sz flt rgb buf th ncl r g b a num bufs caveats\n"); - printf("--------------------------------------------------------------------------------------------------------------------\n"); -} - - -static void -print_visual_attribs_long(const struct visual_attribs *attribs) -{ - const char *caveat = caveat_string(attribs->visualCaveat); - - printf("0x%3x %2d %-11s %2d %3d %2d %4s %3d %3d %3d %3d %3d %3d", - attribs->id, - attribs->depth, - visual_class_name(attribs->klass), - attribs->transparentType != GLX_NONE, - attribs->bufferSize, - attribs->level, - visual_render_type_name(attribs->render_type), - attribs->doubleBuffer, - attribs->stereo, - attribs->redSize, attribs->greenSize, - attribs->blueSize, attribs->alphaSize - ); - - printf(" %c %c %3d %4d %2d %3d %3d %3d %3d %2d %2d %6s\n", - attribs->floatComponents ? 'f' : '.', - attribs->srgb ? 's' : '.', - attribs->auxBuffers, - attribs->depthSize, - attribs->stencilSize, - attribs->accumRedSize, attribs->accumGreenSize, - attribs->accumBlueSize, attribs->accumAlphaSize, - attribs->numSamples, attribs->numMultisample, - caveat - ); -} - - -static void -print_visual_info(Display *dpy, int scrnum, InfoMode mode) -{ - XVisualInfo theTemplate; - XVisualInfo *visuals; - int numVisuals, numGlxVisuals; - long mask; - int i; - struct visual_attribs attribs; - - /* get list of all visuals on this screen */ - theTemplate.screen = scrnum; - mask = VisualScreenMask; - visuals = XGetVisualInfo(dpy, mask, &theTemplate, &numVisuals); - - numGlxVisuals = 0; - for (i = 0; i < numVisuals; i++) { - if (get_visual_attribs(dpy, &visuals[i], &attribs)) - numGlxVisuals++; - } - - if (numGlxVisuals == 0) - return; - - printf("%d GLX Visuals\n", numGlxVisuals); - - if (mode == Normal) - print_visual_attribs_short_header(); - else if (mode == Wide) - print_visual_attribs_long_header(); - - for (i = 0; i < numVisuals; i++) { - if (!get_visual_attribs(dpy, &visuals[i], &attribs)) - continue; - - if (mode == Verbose) - print_visual_attribs_verbose(&attribs); - else if (mode == Normal) - print_visual_attribs_short(&attribs); - else if (mode == Wide) - print_visual_attribs_long(&attribs); - } - printf("\n"); - - XFree(visuals); -} - -#ifdef GLX_VERSION_1_3 - -static void -print_fbconfig_info(Display *dpy, int scrnum, InfoMode mode) -{ - int numFBConfigs = 0; - struct visual_attribs attribs; - GLXFBConfig *fbconfigs; - int i; - - /* get list of all fbconfigs on this screen */ - fbconfigs = glXGetFBConfigs(dpy, scrnum, &numFBConfigs); - - if (numFBConfigs == 0) { - XFree(fbconfigs); - return; - } - - printf("%d GLXFBConfigs:\n", numFBConfigs); - if (mode == Normal) - print_visual_attribs_short_header(); - else if (mode == Wide) - print_visual_attribs_long_header(); - - for (i = 0; i < numFBConfigs; i++) { - get_fbconfig_attribs(dpy, fbconfigs[i], &attribs); - - if (mode == Verbose) - print_visual_attribs_verbose(&attribs); - else if (mode == Normal) - print_visual_attribs_short(&attribs); - else if (mode == Wide) - print_visual_attribs_long(&attribs); - } - printf("\n"); - - XFree(fbconfigs); -} - -#endif - -/* - * Stand-alone Mesa doesn't really implement the GLX protocol so it - * doesn't really know the GLX attributes associated with an X visual. - * The first time a visual is presented to Mesa's pseudo-GLX it - * attaches ancilliary buffers to it (like depth and stencil). - * But that usually only works if glXChooseVisual is used. - * This function calls glXChooseVisual() to sort of "prime the pump" - * for Mesa's GLX so that the visuals that get reported actually - * reflect what applications will see. - * This has no effect when using true GLX. - */ -static void -mesa_hack(Display *dpy, int scrnum) -{ - static int attribs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 1, - GLX_STENCIL_SIZE, 1, - GLX_ACCUM_RED_SIZE, 1, - GLX_ACCUM_GREEN_SIZE, 1, - GLX_ACCUM_BLUE_SIZE, 1, - GLX_ACCUM_ALPHA_SIZE, 1, - GLX_DOUBLEBUFFER, - None - }; - XVisualInfo *visinfo; - - visinfo = glXChooseVisual(dpy, scrnum, attribs); - if (visinfo) - XFree(visinfo); -} - - -/* - * Examine all visuals to find the so-called best one. - * We prefer deepest RGBA buffer with depth, stencil and accum - * that has no caveats. - */ -static int -find_best_visual(Display *dpy, int scrnum) -{ - XVisualInfo theTemplate; - XVisualInfo *visuals; - int numVisuals; - long mask; - int i; - struct visual_attribs bestVis; - - /* get list of all visuals on this screen */ - theTemplate.screen = scrnum; - mask = VisualScreenMask; - visuals = XGetVisualInfo(dpy, mask, &theTemplate, &numVisuals); - - /* init bestVis with first visual info */ - get_visual_attribs(dpy, &visuals[0], &bestVis); - - /* try to find a "better" visual */ - for (i = 1; i < numVisuals; i++) { - struct visual_attribs vis; - - get_visual_attribs(dpy, &visuals[i], &vis); - - /* always skip visuals with caveats */ - if (vis.visualCaveat != GLX_NONE_EXT) - continue; - - /* see if this vis is better than bestVis */ - if ((!bestVis.supportsGL && vis.supportsGL) || - (bestVis.visualCaveat != GLX_NONE_EXT) || - (!(bestVis.render_type & GLX_RGBA_BIT) && (vis.render_type & GLX_RGBA_BIT)) || - (!bestVis.doubleBuffer && vis.doubleBuffer) || - (bestVis.redSize < vis.redSize) || - (bestVis.greenSize < vis.greenSize) || - (bestVis.blueSize < vis.blueSize) || - (bestVis.alphaSize < vis.alphaSize) || - (bestVis.depthSize < vis.depthSize) || - (bestVis.stencilSize < vis.stencilSize) || - (bestVis.accumRedSize < vis.accumRedSize)) { - /* found a better visual */ - bestVis = vis; - } - } - - XFree(visuals); - - return bestVis.id; -} - - -static void -usage(void) -{ - printf("Usage: glxinfo [-v] [-t] [-h] [-i] [-b] [-display <dname>]\n"); - printf("\t-v: Print visuals info in verbose form.\n"); - printf("\t-t: Print verbose table.\n"); - printf("\t-display <dname>: Print GLX visuals on specified server.\n"); - printf("\t-h: This information.\n"); - printf("\t-i: Force an indirect rendering context.\n"); - printf("\t-b: Find the 'best' visual and print its number.\n"); - printf("\t-l: Print interesting OpenGL limits.\n"); -} - - -int -main(int argc, char *argv[]) -{ - char *displayName = NULL; - Display *dpy; - int numScreens, scrnum; - InfoMode mode = Normal; - GLboolean findBest = GL_FALSE; - GLboolean limits = GL_FALSE; - Bool allowDirect = True; - 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], "-t") == 0) { - mode = Wide; - } - else if (strcmp(argv[i], "-v") == 0) { - mode = Verbose; - } - else if (strcmp(argv[i], "-b") == 0) { - findBest = GL_TRUE; - } - else if (strcmp(argv[i], "-i") == 0) { - allowDirect = False; - } - else if (strcmp(argv[i], "-l") == 0) { - limits = GL_TRUE; - } - else if (strcmp(argv[i], "-h") == 0) { - usage(); - return 0; - } - else { - printf("Unknown option `%s'\n", argv[i]); - usage(); - return 0; - } - } - - dpy = XOpenDisplay(displayName); - if (!dpy) { - fprintf(stderr, "Error: unable to open display %s\n", XDisplayName(displayName)); - return -1; - } - - if (findBest) { - int b; - mesa_hack(dpy, 0); - b = find_best_visual(dpy, 0); - printf("%d\n", b); - } - else { - numScreens = ScreenCount(dpy); - print_display_info(dpy); - for (scrnum = 0; scrnum < numScreens; scrnum++) { - mesa_hack(dpy, scrnum); - print_screen_info(dpy, scrnum, allowDirect, limits); - printf("\n"); - print_visual_info(dpy, scrnum, mode); -#ifdef GLX_VERSION_1_3 - print_fbconfig_info(dpy, scrnum, mode); -#endif - if (scrnum + 1 < numScreens) - printf("\n\n"); - } - } - - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/glxpbdemo.c b/progs/xdemos/glxpbdemo.c deleted file mode 100644 index ecf318ec6a7..00000000000 --- a/progs/xdemos/glxpbdemo.c +++ /dev/null @@ -1,431 +0,0 @@ - -/* - * This program demonstrates how to do "off-screen" rendering using - * the GLX pixel buffer extension. - * - * Written by Brian Paul for the "OpenGL and Window System Integration" - * course presented at SIGGRAPH '97. Updated on 5 October 2002. - * - * Updated on 31 January 2004 to use native GLX by - * Andrew P. Lentvorski, Jr. <[email protected]> - * - * Usage: - * glxpbdemo width height imgfile - * Where: - * width is the width, in pixels, of the image to generate. - * height is the height, in pixels, of the image to generate. - * imgfile is the name of the PPM image file to write. - * - * - * This demo draws 3-D boxes with random orientation. - * - * On machines such as the SGI Indigo you may have to reconfigure your - * display/X server to enable pbuffers. Look in the /usr/gfx/ucode/MGRAS/vof/ - * directory for display configurations with the _pbuf suffix. Use - * setmon -x <vof> to configure your X server and display for pbuffers. - * - * O2 systems seem to support pbuffers well. - * - */ - -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <X11/Xlib.h> -#include <GL/glx.h> - -/* Some ugly global vars */ -static GLXFBConfig gFBconfig = 0; -static Display *gDpy = NULL; -static int gScreen = 0; -static GLXPbuffer gPBuffer = 0; -static int gWidth, gHeight; - - -/* - * Test for appropriate version of GLX to run this program - * Input: dpy - the X display - * screen - screen number - * Return: 0 = GLX not available. - * 1 = GLX available. - */ -static int -RuntimeQueryGLXVersion(Display *dpy, int screen) -{ -#if defined(GLX_VERSION_1_3) || defined(GLX_VERSION_1_4) - char *glxversion; - - glxversion = (char *) glXGetClientString(dpy, GLX_VERSION); - if (!(strstr(glxversion, "1.3") || strstr(glxversion, "1.4"))) - return 0; - - glxversion = (char *) glXQueryServerString(dpy, screen, GLX_VERSION); - if (!(strstr(glxversion, "1.3") || strstr(glxversion, "1.4"))) - return 0; - - return 1; -#else - return 0; -#endif -} - - - -/* - * Create the pbuffer and return a GLXPbuffer handle. - */ -static GLXPbuffer -MakePbuffer( Display *dpy, int screen, int width, int height ) -{ - GLXFBConfig *fbConfigs; - GLXFBConfig chosenFBConfig; - GLXPbuffer pBuffer = None; - - int nConfigs; - int fbconfigid; - - int fbAttribs[] = { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DEPTH_SIZE, 1, - GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT | GLX_PBUFFER_BIT, - None - }; - - int pbAttribs[] = { - GLX_PBUFFER_WIDTH, 0, - GLX_PBUFFER_HEIGHT, 0, - GLX_LARGEST_PBUFFER, False, - GLX_PRESERVED_CONTENTS, False, - None - }; - - pbAttribs[1] = width; - pbAttribs[3] = height; - - fbConfigs = glXChooseFBConfig(dpy, screen, fbAttribs, &nConfigs); - - if (0 == nConfigs || !fbConfigs) { - printf("Error: glxChooseFBConfig failed\n"); - XFree(fbConfigs); - XCloseDisplay(dpy); - return 0; - } - - chosenFBConfig = fbConfigs[0]; - - glXGetFBConfigAttrib(dpy, chosenFBConfig, GLX_FBCONFIG_ID, &fbconfigid); - printf("Chose 0x%x as fbconfigid\n", fbconfigid); - - /* Create the pbuffer using first fbConfig in the list that works. */ - pBuffer = glXCreatePbuffer(dpy, chosenFBConfig, pbAttribs); - - if (pBuffer) { - gFBconfig = chosenFBConfig; - gWidth = width; - gHeight = height; - } - - XFree(fbConfigs); - - return pBuffer; -} - - - -/* - * Do all the X / GLX setup stuff. - */ -static int -Setup(int width, int height) -{ -#if defined(GLX_VERSION_1_3) || defined(GLX_VERSION_1_4) - GLXContext glCtx; - - /* Open the X display */ - gDpy = XOpenDisplay(NULL); - if (!gDpy) { - printf("Error: couldn't open default X display.\n"); - return 0; - } - - /* Get default screen */ - gScreen = DefaultScreen(gDpy); - - /* Test that GLX is available */ - if (!RuntimeQueryGLXVersion(gDpy, gScreen)) { - printf("Error: GLX 1.3 or 1.4 not available\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Create Pbuffer */ - gPBuffer = MakePbuffer( gDpy, gScreen, width, height ); - if (gPBuffer==None) { - printf("Error: couldn't create pbuffer\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Create GLX context */ - glCtx = glXCreateNewContext(gDpy, gFBconfig, GLX_RGBA_TYPE, NULL, True); - if (glCtx) { - if (!glXIsDirect(gDpy, glCtx)) { - printf("Warning: using indirect GLXContext\n"); - } - } - else { - printf("Error: Couldn't create GLXContext\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Bind context to pbuffer */ - if (!glXMakeCurrent(gDpy, gPBuffer, glCtx)) { - printf("Error: glXMakeCurrent failed\n"); - XCloseDisplay(gDpy); - return 0; - } - - return 1; /* Success!! */ -#else - printf("Error: GLX version 1.3 or 1.4 not available at compile time\n"); - return 0; -#endif -} - - - -/* One-time GL setup */ -static void -InitGL(void) -{ - static GLfloat pos[4] = {0.0, 0.0, 10.0, 0.0}; - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_NORMALIZE); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - - glViewport(0, 0, gWidth, gHeight); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - glTranslatef( 0.0, 0.0, -15.0 ); - -} - - -/* Return random float in [0,1] */ -static float -Random(void) -{ - int i = rand(); - return (float) (i % 1000) / 1000.0; -} - - -static void -RandomColor(void) -{ - GLfloat c[4]; - c[0] = Random(); - c[1] = Random(); - c[2] = Random(); - c[3] = 1.0; - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c); -} - - -/* This function borrowed from Mark Kilgard's GLUT */ -static void -drawBox(GLfloat x0, GLfloat x1, GLfloat y0, GLfloat y1, - GLfloat z0, GLfloat z1, GLenum type) -{ - static GLfloat n[6][3] = - { - {-1.0, 0.0, 0.0}, - {0.0, 1.0, 0.0}, - {1.0, 0.0, 0.0}, - {0.0, -1.0, 0.0}, - {0.0, 0.0, 1.0}, - {0.0, 0.0, -1.0} - }; - static GLint faces[6][4] = - { - {0, 1, 2, 3}, - {3, 2, 6, 7}, - {7, 6, 5, 4}, - {4, 5, 1, 0}, - {5, 6, 2, 1}, - {7, 4, 0, 3} - }; - GLfloat v[8][3], tmp; - GLint i; - - if (x0 > x1) { - tmp = x0; - x0 = x1; - x1 = tmp; - } - if (y0 > y1) { - tmp = y0; - y0 = y1; - y1 = tmp; - } - if (z0 > z1) { - tmp = z0; - z0 = z1; - z1 = tmp; - } - v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0; - v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1; - v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0; - v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1; - v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0; - v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1; - - for (i = 0; i < 6; i++) { - glBegin(type); - glNormal3fv(&n[i][0]); - glVertex3fv(&v[faces[i][0]][0]); - glVertex3fv(&v[faces[i][1]][0]); - glVertex3fv(&v[faces[i][2]][0]); - glVertex3fv(&v[faces[i][3]][0]); - glEnd(); - } -} - - - -/* Render a scene */ -static void -Render(void) -{ - int NumBoxes = 100; - int i; - - InitGL(); - glClearColor(0.2, 0.2, 0.9, 0.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - for (i=0;i<NumBoxes;i++) { - float tx = -2.0 + 4.0 * Random(); - float ty = -2.0 + 4.0 * Random(); - float tz = 4.0 - 16.0 * Random(); - float sx = 0.1 + Random() * 0.4; - float sy = 0.1 + Random() * 0.4; - float sz = 0.1 + Random() * 0.4; - float rx = Random(); - float ry = Random(); - float rz = Random(); - float ra = Random() * 360.0; - glPushMatrix(); - glTranslatef(tx, ty, tz); - glRotatef(ra, rx, ry, rz); - glScalef(sx, sy, sz); - RandomColor(); - drawBox(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0, GL_POLYGON); - glPopMatrix(); - } - - glFinish(); -} - - - -static void -WriteFile(const char *filename) -{ - FILE *f; - GLubyte *image; - int i; - - image = malloc(gWidth * gHeight * 3 * sizeof(GLubyte)); - if (!image) { - printf("Error: couldn't allocate image buffer\n"); - return; - } - - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, gWidth, gHeight, GL_RGB, GL_UNSIGNED_BYTE, image); - - f = fopen(filename, "w"); - if (!f) { - printf("Couldn't open image file: %s\n", filename); - return; - } - fprintf(f,"P6\n"); - fprintf(f,"# ppm-file created by %s\n", "trdemo2"); - fprintf(f,"%i %i\n", gWidth, gHeight); - fprintf(f,"255\n"); - fclose(f); - f = fopen(filename, "ab"); /* now append binary data */ - if (!f) { - printf("Couldn't append to image file: %s\n", filename); - return; - } - - for (i=0;i<gHeight;i++) { - GLubyte *rowPtr; - /* Remember, OpenGL images are bottom to top. Have to reverse. */ - rowPtr = image + (gHeight-1-i) * gWidth*3; - fwrite(rowPtr, 1, gWidth*3, f); - } - - fclose(f); - free(image); - - printf("Wrote %d by %d image file: %s\n", gWidth, gHeight, filename); -} - - - -/* - * Print message describing command line parameters. - */ -static void -Usage(const char *appName) -{ - printf("Usage:\n"); - printf(" %s width height imgfile\n", appName); - printf("Where imgfile is a ppm file\n"); -} - - - -int -main(int argc, char *argv[]) -{ - if (argc!=4) { - Usage(argv[0]); - } - else { - int width = atoi(argv[1]); - int height = atoi(argv[2]); - char *fileName = argv[3]; - if (width<=0) { - printf("Error: width parameter must be at least 1.\n"); - return 1; - } - if (height<=0) { - printf("Error: height parameter must be at least 1.\n"); - return 1; - } - if (!Setup(width, height)) { - return 1; - } - - printf("Setup completed\n"); - Render(); - printf("Render completed.\n"); - WriteFile(fileName); - printf("File write completed.\n"); - - glXDestroyPbuffer( gDpy, gPBuffer ); - } - return 0; -} - diff --git a/progs/xdemos/glxpixmap.c b/progs/xdemos/glxpixmap.c deleted file mode 100644 index e1abd22ceef..00000000000 --- a/progs/xdemos/glxpixmap.c +++ /dev/null @@ -1,187 +0,0 @@ - - -/* - * A demonstration of using the GLXPixmap functions. This program is in - * the public domain. - * - * Brian Paul - */ - - -#include <GL/gl.h> -#define GLX_GLXEXT_PROTOTYPES -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static GLXContext ctx; -static XVisualInfo *visinfo; -static GC gc; - - - -static Window make_rgb_window( Display *dpy, - unsigned int width, unsigned int height ) -{ - const int sbAttrib[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None }; - const int dbAttrib[] = { 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; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - visinfo = glXChooseVisual( dpy, scrnum, (int *) sbAttrib ); - if (!visinfo) { - visinfo = glXChooseVisual( dpy, scrnum, (int *) dbAttrib ); - if (!visinfo) { - printf("Error: couldn't get an RGB visual\n"); - exit(1); - } - } - - /* window attributes */ - attr.background_pixel = 0; - attr.border_pixel = 0; - /* TODO: share root colormap if possible */ - 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 ); - - /* make an X GC so we can do XCopyArea later */ - gc = XCreateGC( dpy, win, 0, NULL ); - - /* need indirect context */ - ctx = glXCreateContext( dpy, visinfo, NULL, False ); - if (!ctx) { - printf("Error: glXCreateContext failed\n"); - exit(-1); - } - - printf("Direct rendering: %s\n", glXIsDirect(dpy, ctx) ? "Yes" : "No"); - - return win; -} - - -static GLXPixmap make_pixmap( Display *dpy, Window win, - unsigned int width, unsigned int height, - Pixmap *pixmap) -{ - Pixmap pm; - GLXPixmap glxpm; - XWindowAttributes attr; - - pm = XCreatePixmap( dpy, win, width, height, visinfo->depth ); - if (!pm) { - printf("Error: XCreatePixmap failed\n"); - exit(-1); - } - - XGetWindowAttributes( dpy, win, &attr ); - - /* - * IMPORTANT: - * Use the glXCreateGLXPixmapMESA funtion when using Mesa because - * Mesa needs to know the colormap associated with a pixmap in order - * to render correctly. This is because Mesa allows RGB rendering - * into any kind of visual, not just TrueColor or DirectColor. - */ -#ifdef GLX_MESA_pixmap_colormap - if (strstr(glXQueryExtensionsString(dpy, 0), "GLX_MESA_pixmap_colormap")) { - /* stand-alone Mesa, specify the colormap */ - glxpm = glXCreateGLXPixmapMESA( dpy, visinfo, pm, attr.colormap ); - } - else { - glxpm = glXCreateGLXPixmap( dpy, visinfo, pm ); - } -#else - /* This will work with Mesa too if the visual is TrueColor or DirectColor */ - glxpm = glXCreateGLXPixmap( dpy, visinfo, pm ); -#endif - - if (!glxpm) { - printf("Error: GLXCreateGLXPixmap failed\n"); - exit(-1); - } - - *pixmap = pm; - - return glxpm; -} - - - -static void event_loop( Display *dpy, GLXPixmap pm ) -{ - XEvent event; - - while (1) { - XNextEvent( dpy, &event ); - - switch (event.type) { - case Expose: - printf("Redraw\n"); - /* copy the image from GLXPixmap to window */ - XCopyArea( dpy, pm, event.xany.window, /* src, dest */ - gc, 0, 0, 300, 300, /* gc, src pos, size */ - 0, 0 ); /* dest pos */ - break; - case ConfigureNotify: - /* nothing */ - break; - } - } -} - - - -int main( int argc, char *argv[] ) -{ - Display *dpy; - Window win; - Pixmap pm; - GLXPixmap glxpm; - - dpy = XOpenDisplay(NULL); - - win = make_rgb_window( dpy, 300, 300 ); - glxpm = make_pixmap( dpy, win, 300, 300, &pm ); - - glXMakeCurrent( dpy, glxpm, ctx ); - printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); - - /* Render an image into the pixmap */ - glShadeModel( GL_FLAT ); - glClearColor( 0.5, 0.5, 0.5, 1.0 ); - glClear( GL_COLOR_BUFFER_BIT ); - glViewport( 0, 0, 300, 300 ); - glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); - glColor3f( 0.0, 1.0, 1.0 ); - glRectf( -0.75, -0.75, 0.75, 0.75 ); - glFlush(); - glXWaitGL(); - - XMapWindow( dpy, win ); - - event_loop( dpy, pm ); - return 0; -} diff --git a/progs/xdemos/glxsnoop.c b/progs/xdemos/glxsnoop.c deleted file mode 100644 index 2e951345b58..00000000000 --- a/progs/xdemos/glxsnoop.c +++ /dev/null @@ -1,377 +0,0 @@ -/** - * Display/snoop the z/stencil/back/front buffers of another app's window. - * Also, an example of the need for shared ancillary renderbuffers. - * - * Hint: use 'xwininfo' to get a window's ID. - * - * Brian Paul - * 11 Oct 2007 - */ - -#define GL_GLEXT_PROTOTYPES - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <X11/keysym.h> - - -#define Z_BUFFER 1 -#define STENCIL_BUFFER 2 -#define BACK_BUFFER 3 -#define FRONT_BUFFER 4 - - -static int Buffer = BACK_BUFFER; -static int WindowID = 0; -static const char *DisplayName = NULL; -static GLXContext Context = 0; -static int Width, Height; - - -/** - * Grab the z/stencil/back/front image from the srcWin and display it - * (possibly converted to grayscale) in the dstWin. - */ -static void -redraw(Display *dpy, Window srcWin, Window dstWin ) -{ - GLubyte *image = malloc(Width * Height * 4); - - glXMakeCurrent(dpy, srcWin, Context); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - if (Buffer == BACK_BUFFER) { - glReadBuffer(GL_BACK); - glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); - } - else if (Buffer == FRONT_BUFFER) { - glReadBuffer(GL_FRONT); - glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); - } - else if (Buffer == Z_BUFFER) { - GLfloat *z = malloc(Width * Height * sizeof(GLfloat)); - int i; - glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z); - for (i = 0; i < Width * Height; i++) { - image[i*4+0] = - image[i*4+1] = - image[i*4+2] = (GLint) (255.0 * z[i]); - image[i*4+3] = 255; - } - free(z); - } - else if (Buffer == STENCIL_BUFFER) { - GLubyte *sten = malloc(Width * Height * sizeof(GLubyte)); - int i, min = 100, max = -1; - float step; - int sz; - glGetIntegerv(GL_STENCIL_BITS, &sz); - glReadPixels(0, 0, Width, Height, - GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, sten); - /* find min/max for converting stencil to grayscale */ - for (i = 0; i < Width * Height; i++) { - if (sten[i] < min) - min = sten[i]; - if (sten[i] > max) - max = sten[i]; - } - if (min == max) - step = 0; - else - step = 255.0 / (float) (max - min); - for (i = 0; i < Width * Height; i++) { - image[i*4+0] = - image[i*4+1] = - image[i*4+2] = (GLint) ((sten[i] - min) * step); - image[i*4+3] = 255; - } - free(sten); - } - - glXMakeCurrent(dpy, dstWin, Context); - glWindowPos2iARB(0, 0); - glDrawBuffer(GL_FRONT); - glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); - glFlush(); - - free(image); -} - - -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 -update_window_title(Display *dpy, Window win) -{ - char title[1000], *buf; - - switch (Buffer) { - case Z_BUFFER: - buf = "Z"; - break; - case STENCIL_BUFFER: - buf = "Stencil"; - break; - case BACK_BUFFER: - buf = "Back"; - break; - case FRONT_BUFFER: - buf = "Front"; - break; - default: - buf = ""; - } - - sprintf(title, "glxsnoop window 0x%x (%s buffer)", (int) WindowID, buf); - - set_window_title(dpy, win, title); -} - - -static void -keypress(Display *dpy, Window win, char key) -{ - switch (key) { - case 27: - /* escape */ - exit(0); - break; - case 's': - Buffer = STENCIL_BUFFER; - break; - case 'z': - Buffer = Z_BUFFER; - break; - case 'f': - Buffer = FRONT_BUFFER; - break; - case 'b': - Buffer = BACK_BUFFER; - break; - default: - return; - } - - update_window_title(dpy, win); - redraw(dpy, WindowID, win); -} - - -static void -event_loop(Display *dpy, Window win) -{ - XEvent event; - - while (1) { - XNextEvent( dpy, &event ); - - switch (event.type) { - case Expose: - redraw(dpy, WindowID, win); - break; - case ConfigureNotify: - /*resize( 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); - keypress(dpy, win, buffer[0]); - } - } - default: - /* nothing */ - ; - } - } -} - - -static VisualID -get_window_visualid(Display *dpy, Window win) -{ - XWindowAttributes attr; - - if (XGetWindowAttributes(dpy, win, &attr)) { - return attr.visual->visualid; - } - else { - return 0; - } -} - - -static void -get_window_size(Display *dpy, Window win, int *w, int *h) -{ - XWindowAttributes attr; - - if (XGetWindowAttributes(dpy, win, &attr)) { - *w = attr.width; - *h = attr.height; - } - else { - *w = *h = 0; - } -} - - -static XVisualInfo * -visualid_to_visualinfo(Display *dpy, VisualID vid) -{ - XVisualInfo *vinfo, templ; - long mask; - int n; - - templ.visualid = vid; - mask = VisualIDMask; - - vinfo = XGetVisualInfo(dpy, mask, &templ, &n); - return vinfo; -} - - -static void -key_usage(void) -{ - printf("Keyboard:\n"); - printf(" z - display Z buffer\n"); - printf(" s - display stencil buffer\n"); - printf(" f - display front color buffer\n"); - printf(" b - display back buffer\n"); -} - - -static void -usage(void) -{ - printf("Usage: glxsnoop [-display dpy] windowID\n"); - key_usage(); -} - - -static void -parse_opts(int argc, char *argv[]) -{ - int i; - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-h") == 0) { - usage(); - exit(0); - } - else if (strcmp(argv[i], "-display") == 0) { - DisplayName = argv[i + 1]; - i++; - } - else { - if (argv[i][0] == '0' && argv[i][1] == 'x') { - /* hex */ - WindowID = strtol(argv[i], NULL, 16); - } - else { - WindowID = atoi(argv[i]); - } - break; - } - } - - if (!WindowID) { - usage(); - exit(0); - } -} - - -int -main( int argc, char *argv[] ) -{ - Display *dpy; - VisualID vid; - XVisualInfo *visinfo; - Window win; - - parse_opts(argc, argv); - - key_usage(); - - dpy = XOpenDisplay(DisplayName); - - /* find the VisualID for the named window */ - vid = get_window_visualid(dpy, WindowID); - get_window_size(dpy, WindowID, &Width, &Height); - - visinfo = visualid_to_visualinfo(dpy, vid); - - Context = glXCreateContext( dpy, visinfo, NULL, True ); - if (!Context) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - win = make_gl_window(dpy, visinfo, Width, Height); - XMapWindow(dpy, win); - update_window_title(dpy, win); - - event_loop( dpy, win ); - - return 0; -} diff --git a/progs/xdemos/glxswapcontrol.c b/progs/xdemos/glxswapcontrol.c deleted file mode 100644 index cd60d460a06..00000000000 --- a/progs/xdemos/glxswapcontrol.c +++ /dev/null @@ -1,893 +0,0 @@ -/* - * 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 - * - * Modified by Ian Romanick <[email protected]> 09 April 2003 to support - * GLX_{MESA,SGI}_swap_control and GLX_OML_sync_control. - * - * Command line options: - * -display Name of the display to use. - * -info print GL implementation information - * -swap N Attempt to set the swap interval to 1/N second - * -forcegetrate Get the display refresh rate even if the required GLX - * extension is not supported. - */ - - -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#ifndef __VMS -/*# include <stdint.h>*/ -#endif -# define GLX_GLXEXT_PROTOTYPES -#include <GL/gl.h> -#include <GL/glx.h> - -#ifndef GLX_MESA_swap_control -typedef GLint ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned interval); -typedef GLint ( * PFNGLXGETSWAPINTERVALMESAPROC) ( void ); -#endif - -#if !defined( GLX_OML_sync_control ) && defined( _STDINT_H ) -#define GLX_OML_sync_control 1 -typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator); -#endif - -#ifndef GLX_MESA_swap_frame_usage -#define GLX_MESA_swap_frame_usage 1 -typedef int ( * PFNGLXGETFRAMEUSAGEMESAPROC) (Display *dpy, GLXDrawable drawable, float * usage ); -#endif - -#define BENCHMARK - -PFNGLXGETFRAMEUSAGEMESAPROC get_frame_usage = NULL; - -#ifdef BENCHMARK - -/* XXX this probably isn't very portable */ - -#include <sys/time.h> -#include <unistd.h> - -#define NUL '\0' - -/* return current time (in seconds) */ -static int -current_time(void) -{ - struct timeval tv; -#ifdef __VMS - (void) gettimeofday(&tv, NULL ); -#else - struct timezone tz; - (void) gettimeofday(&tv, &tz); -#endif - return (int) tv.tv_sec; -} - -#else /*BENCHMARK*/ - -/* dummy */ -static int -current_time(void) -{ - return 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 GLboolean has_OML_sync_control = GL_FALSE; -static GLboolean has_SGI_swap_control = GL_FALSE; -static GLboolean has_MESA_swap_control = GL_FALSE; -static GLboolean has_MESA_swap_frame_usage = GL_FALSE; - -static char ** extension_table = NULL; -static unsigned num_extensions; - -static GLboolean use_ztrick = GL_FALSE; -static GLfloat aspectX = 1.0f, aspectY = 1.0f; - -/* - * - * 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 -draw(void) -{ - if ( use_ztrick ) { - static GLboolean flip = GL_FALSE; - static const GLfloat vert[4][3] = { - { -1, -1, -0.999 }, - { 1, -1, -0.999 }, - { 1, 1, -0.999 }, - { -1, 1, -0.999 } - }; - static const GLfloat col[4][3] = { - { 1.0, 0.6, 0.0 }, - { 1.0, 0.6, 0.0 }, - { 0.0, 0.0, 0.0 }, - { 0.0, 0.0, 0.0 }, - }; - - if ( flip ) { - glDepthRange(0, 0.5); - glDepthFunc(GL_LEQUAL); - } - else { - glDepthRange(1.0, 0.4999); - glDepthFunc(GL_GEQUAL); - } - - flip = !flip; - - /* The famous Quake "Z trick" only works when the whole screen is - * re-drawn each frame. - */ - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1, 1, -1, 1, -1, 1); - glDisable(GL_LIGHTING); - glShadeModel(GL_SMOOTH); - - glEnableClientState( GL_VERTEX_ARRAY ); - glEnableClientState( GL_COLOR_ARRAY ); - glVertexPointer( 3, GL_FLOAT, 0, vert ); - glColorPointer( 3, GL_FLOAT, 0, col ); - glDrawArrays( GL_POLYGON, 0, 4 ); - glDisableClientState( GL_COLOR_ARRAY ); - glDisableClientState( GL_VERTEX_ARRAY ); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-aspectX, aspectX, -aspectY, aspectY, 5.0, 60.0); - - glEnable(GL_LIGHTING); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -45.0); - } - else { - 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) -{ - if (width > height) { - aspectX = (GLfloat) width / (GLfloat) height; - aspectY = 1.0; - } - else { - aspectX = 1.0; - aspectY = (GLfloat) height / (GLfloat) width; - } - - glViewport(0, 0, (GLint) width, (GLint) height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glFrustum(-aspectX, aspectX, -aspectY, aspectY, 5.0, 60.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -45.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); -} - - -/** - * Remove window border/decorations. - */ -static void -no_border( Display *dpy, Window w) -{ - static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); - static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; - - typedef struct - { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long inputMode; - unsigned long status; - } PropMotifWmHints; - - PropMotifWmHints motif_hints; - Atom prop, proptype; - unsigned long flags = 0; - - /* setup the property */ - motif_hints.flags = MWM_HINTS_DECORATIONS; - motif_hints.decorations = flags; - - /* get the atom for the property */ - prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True ); - if (!prop) { - /* something went wrong! */ - return; - } - - /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ - proptype = prop; - - XChangeProperty( dpy, w, /* display, window */ - prop, proptype, /* property, type */ - 32, /* format: 32-bit datums */ - PropModeReplace, /* mode */ - (unsigned char *) &motif_hints, /* data */ - PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ - ); -} - - -/* - * 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, GLboolean fullscreen, - Window *winRet, GLXContext *ctxRet) -{ - int attrib[] = { 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; - GLXContext ctx; - XVisualInfo *visinfo; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - if (fullscreen) { - x = y = 0; - width = DisplayWidth( dpy, scrnum ); - height = DisplayHeight( 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 | KeyPressMask; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow( dpy, root, 0, 0, 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); - } - - if (fullscreen) - no_border(dpy, win); - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - if (!ctx) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - XFree(visinfo); - - *winRet = win; - *ctxRet = ctx; -} - - -static void -event_loop(Display *dpy, Window win) -{ - float frame_usage = 0.0; - - while (1) { - while (XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - switch (event.type) { - case Expose: - /* we'll redraw below */ - break; - case ConfigureNotify: - reshape(event.xconfigure.width, 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; - } - } - } - } - } - - /* next frame */ - angle += 2.0; - - draw(); - - glXSwapBuffers(dpy, win); - - if ( get_frame_usage != NULL ) { - GLfloat temp; - - (*get_frame_usage)( dpy, win, & temp ); - frame_usage += temp; - } - - /* calc framerate */ - { - static int t0 = -1; - static int frames = 0; - int t = current_time(); - - if (t0 < 0) - t0 = t; - - frames++; - - if (t - t0 >= 5.0) { - GLfloat seconds = t - t0; - GLfloat fps = frames / seconds; - if ( get_frame_usage != NULL ) { - printf("%d frames in %3.1f seconds = %6.3f FPS (%3.1f%% usage)\n", - frames, seconds, fps, - (frame_usage * 100.0) / (float) frames ); - } - else { - printf("%d frames in %3.1f seconds = %6.3f FPS\n", - frames, seconds, fps); - } - - t0 = t; - frames = 0; - frame_usage = 0.0; - } - } - } -} - - -/** - * Display the refresh rate of the display using the GLX_OML_sync_control - * extension. - */ -static void -show_refresh_rate( Display * dpy ) -{ -#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - PFNGLXGETMSCRATEOMLPROC get_msc_rate; - int32_t n; - int32_t d; - - get_msc_rate = (PFNGLXGETMSCRATEOMLPROC) glXGetProcAddressARB( (const GLubyte *) "glXGetMscRateOML" ); - if ( get_msc_rate != NULL ) { - (*get_msc_rate)( dpy, glXGetCurrentDrawable(), &n, &d ); - printf( "refresh rate: %.1fHz\n", (float) n / d ); - return; - } -#endif - printf( "glXGetMscRateOML not supported.\n" ); -} - - -/** - * Fill in the table of extension strings from a supplied extensions string - * (as returned by glXQueryExtensionsString). - * - * \param string String of GLX extensions. - * \sa is_extension_supported - */ -static void -make_extension_table( const char * string ) -{ - char ** string_tab; - unsigned num_strings; - unsigned base; - unsigned idx; - unsigned i; - - /* Count the number of spaces in the string. That gives a base-line - * figure for the number of extension in the string. - */ - - num_strings = 1; - for ( i = 0 ; string[i] != NUL ; i++ ) { - if ( string[i] == ' ' ) { - num_strings++; - } - } - - string_tab = (char **) malloc( sizeof( char * ) * num_strings ); - if ( string_tab == NULL ) { - return; - } - - base = 0; - idx = 0; - - while ( string[ base ] != NUL ) { - /* Determine the length of the next extension string. - */ - - for ( i = 0 - ; (string[ base + i ] != NUL) && (string[ base + i ] != ' ') - ; i++ ) { - /* empty */ ; - } - - if ( i > 0 ) { - /* If the string was non-zero length, add it to the table. We - * can get zero length strings if there is a space at the end of - * the string or if there are two (or more) spaces next to each - * other in the string. - */ - - string_tab[ idx ] = malloc( sizeof( char ) * (i + 1) ); - if ( string_tab[ idx ] == NULL ) { - return; - } - - (void) memcpy( string_tab[ idx ], & string[ base ], i ); - string_tab[ idx ][i] = NUL; - idx++; - } - - - /* Skip to the start of the next extension string. - */ - - for ( base += i - ; (string[ base ] == ' ') && (string[ base ] != NUL) - ; base++ ) { - /* empty */ ; - } - } - - extension_table = string_tab; - num_extensions = idx; -} - - -/** - * Determine of an extension is supported. The extension string table - * must have already be initialized by calling \c make_extension_table. - * - * \praram ext Extension to be tested. - * \return GL_TRUE of the extension is supported, GL_FALSE otherwise. - * \sa make_extension_table - */ -static GLboolean -is_extension_supported( const char * ext ) -{ - unsigned i; - - for ( i = 0 ; i < num_extensions ; i++ ) { - if ( strcmp( ext, extension_table[i] ) == 0 ) { - return GL_TRUE; - } - } - - return GL_FALSE; -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - Window win; - GLXContext ctx; - char *dpyName = NULL; - int swap_interval = 1; - GLboolean do_swap_interval = GL_FALSE; - GLboolean force_get_rate = GL_FALSE; - GLboolean fullscreen = GL_FALSE; - GLboolean printInfo = GL_FALSE; - int i; - PFNGLXSWAPINTERVALMESAPROC set_swap_interval = NULL; - PFNGLXGETSWAPINTERVALMESAPROC get_swap_interval = NULL; - int width = 300, height = 300; - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-display") == 0 && i + 1 < argc) { - dpyName = argv[i+1]; - i++; - } - else if (strcmp(argv[i], "-info") == 0) { - printInfo = GL_TRUE; - } - else if (strcmp(argv[i], "-swap") == 0 && i + 1 < argc) { - swap_interval = atoi( argv[i+1] ); - do_swap_interval = GL_TRUE; - i++; - } - else if (strcmp(argv[i], "-forcegetrate") == 0) { - /* This option was put in because some DRI drivers don't support the - * full GLX_OML_sync_control extension, but they do support - * glXGetMscRateOML. - */ - force_get_rate = GL_TRUE; - } - else if (strcmp(argv[i], "-fullscreen") == 0) { - fullscreen = GL_TRUE; - } - else if (strcmp(argv[i], "-ztrick") == 0) { - use_ztrick = GL_TRUE; - } - else if (strcmp(argv[i], "-help") == 0) { - printf("Usage:\n"); - printf(" gears [options]\n"); - printf("Options:\n"); - printf(" -help Print this information\n"); - printf(" -display displayName Specify X display\n"); - printf(" -info Display GL information\n"); - printf(" -swap N Swap no more than once per N vertical refreshes\n"); - printf(" -forcegetrate Try to use glXGetMscRateOML function\n"); - printf(" -fullscreen Full-screen window\n"); - return 0; - } - } - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); - return -1; - } - - make_window(dpy, "glxgears", 0, 0, width, height, fullscreen, &win, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, win, ctx); - - make_extension_table( (char *) glXQueryExtensionsString(dpy,DefaultScreen(dpy)) ); - has_OML_sync_control = is_extension_supported( "GLX_OML_sync_control" ); - has_SGI_swap_control = is_extension_supported( "GLX_SGI_swap_control" ); - has_MESA_swap_control = is_extension_supported( "GLX_MESA_swap_control" ); - has_MESA_swap_frame_usage = is_extension_supported( "GLX_MESA_swap_frame_usage" ); - - if ( has_MESA_swap_control ) { - set_swap_interval = (PFNGLXSWAPINTERVALMESAPROC) glXGetProcAddressARB( (const GLubyte *) "glXSwapIntervalMESA" ); - get_swap_interval = (PFNGLXGETSWAPINTERVALMESAPROC) glXGetProcAddressARB( (const GLubyte *) "glXGetSwapIntervalMESA" ); - } - else if ( has_SGI_swap_control ) { - set_swap_interval = (PFNGLXSWAPINTERVALMESAPROC) glXGetProcAddressARB( (const GLubyte *) "glXSwapIntervalSGI" ); - } - - - if ( has_MESA_swap_frame_usage ) { - get_frame_usage = (PFNGLXGETFRAMEUSAGEMESAPROC) glXGetProcAddressARB( (const GLubyte *) "glXGetFrameUsageMESA" ); - } - - - 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)); - if ( has_OML_sync_control || force_get_rate ) { - show_refresh_rate( dpy ); - } - - if ( get_swap_interval != NULL ) { - printf("Default swap interval = %d\n", (*get_swap_interval)() ); - } - } - - if ( do_swap_interval ) { - if ( set_swap_interval != NULL ) { - if ( ((swap_interval == 0) && !has_MESA_swap_control) - || (swap_interval < 0) ) { - printf( "Swap interval must be non-negative or greater than zero " - "if GLX_MESA_swap_control is not supported.\n" ); - } - else { - (*set_swap_interval)( swap_interval ); - } - - if ( printInfo && (get_swap_interval != NULL) ) { - printf("Current swap interval = %d\n", (*get_swap_interval)() ); - } - } - else { - printf("Unable to set swap-interval. Neither GLX_SGI_swap_control " - "nor GLX_MESA_swap_control are supported.\n" ); - } - } - - init(); - - /* Set initial projection/viewing transformation. - * same as glxgears.c - */ - reshape(width, height); - - event_loop(dpy, win); - - glXDestroyContext(dpy, ctx); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/ipc.c b/progs/xdemos/ipc.c deleted file mode 100644 index c872d1641ab..00000000000 --- a/progs/xdemos/ipc.c +++ /dev/null @@ -1,264 +0,0 @@ -/* Copyright (c) 2003 Tungsten Graphics, Inc. - * - * 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, the Tungsten - * Graphics splash screen, 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 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. - */ - -/* - * Simple IPC API - * Brian Paul - */ - - -#include <assert.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <unistd.h> -#include <sys/socket.h> -#include "ipc.h" - -#if defined(IRIX) || defined(irix) -typedef int socklen_t; -#endif - -#define NO_DELAY 1 - -#define DEFAULT_MASTER_PORT 7011 - - -/* - * Return my hostname in <nameOut>. - * Return 1 for success, 0 for error. - */ -int -MyHostName(char *nameOut, int maxNameLength) -{ - int k = gethostname(nameOut, maxNameLength); - return k==0; -} - - -/* - * Create a socket attached to a port. Later, we can call AcceptConnection - * on the socket returned from this function. - * Return the new socket number or -1 if error. - */ -int -CreatePort(int *port) -{ - char hostname[1000]; - struct sockaddr_in servaddr; - struct hostent *hp; - int so_reuseaddr = 1; - int tcp_nodelay = 1; - int sock, k; - - /* create socket */ - sock = socket(AF_INET, SOCK_STREAM, 0); - assert(sock > 2); - - /* get my host name */ - k = gethostname(hostname, 1000); - assert(k == 0); - - /* get hostent info */ - hp = gethostbyname(hostname); - assert(hp); - - /* initialize the servaddr struct */ - memset(&servaddr, 0, sizeof(servaddr) ); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons((unsigned short) (*port)); - memcpy((char *) &servaddr.sin_addr, hp->h_addr, - sizeof(servaddr.sin_addr)); - - /* deallocate when we exit */ - k = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, - (char *) &so_reuseaddr, sizeof(so_reuseaddr)); - assert(k==0); - - /* send packets immediately */ -#if NO_DELAY - k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, - (char *) &tcp_nodelay, sizeof(tcp_nodelay)); - assert(k==0); -#endif - - if (*port == 0) - *port = DEFAULT_MASTER_PORT; - - k = 1; - while (k && (*port < 65534)) { - /* bind our address to the socket */ - servaddr.sin_port = htons((unsigned short) (*port)); - k = bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); - if (k) - *port = *port + 1; - } - -#if 0 - printf("###### Real Port: %d\n", *port); -#endif - - /* listen for connections */ - k = listen(sock, 100); - assert(k == 0); - - return sock; -} - - -/* - * Accept a connection on the named socket. - * Return a new socket for the new connection, or -1 if error. - */ -int -AcceptConnection(int socket) -{ - struct sockaddr addr; - socklen_t addrLen; - int newSock; - - addrLen = sizeof(addr); - newSock = accept(socket, &addr, &addrLen); - if (newSock == 1) - return -1; - else - return newSock; -} - - -/* - * Contact the server running on the given host on the named port. - * Return socket number or -1 if error. - */ -int -Connect(const char *hostname, int port) -{ - struct sockaddr_in servaddr; - struct hostent *hp; - int sock, k; - int tcp_nodelay = 1; - - assert(port); - - sock = socket(AF_INET, SOCK_STREAM, 0); - assert(sock >= 0); - - hp = gethostbyname(hostname); - assert(hp); - - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons((unsigned short) port); - memcpy((char *) &servaddr.sin_addr, hp->h_addr, sizeof(servaddr.sin_addr)); - - k = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); - if (k != 0) { - perror("Connect:"); - return -1; - } - -#if NO_DELAY - /* send packets immediately */ - k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, - (char *) &tcp_nodelay, sizeof(tcp_nodelay)); - assert(k==0); -#endif - - return sock; -} - - -void -CloseSocket(int socket) -{ - close(socket); -} - - -int -SendData(int socket, const void *data, int bytes) -{ - int sent = 0; - int b; - - while (sent < bytes) { - b = write(socket, (char *) data + sent, bytes - sent); - if (b <= 0) - return -1; /* something broke */ - sent += b; - } - return sent; -} - - -int -ReceiveData(int socket, void *data, int bytes) -{ - int received = 0, b; - - while (received < bytes) { - b = read(socket, (char *) data + received, bytes - received); - if (b <= 0) - return -1; - received += b; - } - return received; -} - - -int -SendString(int socket, const char *str) -{ - const int len = strlen(str); - int sent, b; - - /* first, send a 4-byte length indicator */ - b = write(socket, &len, sizeof(len)); - if (b <= 0) - return -1; - - sent = SendData(socket, str, len); - assert(sent == len); - return sent; -} - - -int -ReceiveString(int socket, char *str, int maxLen) -{ - int len, received, b; - - /* first, read 4 bytes to see how long of string to receive */ - b = read(socket, &len, sizeof(len)); - if (b <= 0) - return -1; - - assert(len <= maxLen); /* XXX fix someday */ - assert(len >= 0); - received = ReceiveData(socket, str, len); - assert(received != -1); - assert(received == len); - str[len] = 0; - return received; -} diff --git a/progs/xdemos/ipc.h b/progs/xdemos/ipc.h deleted file mode 100644 index 3f434457c6f..00000000000 --- a/progs/xdemos/ipc.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef IPC_H -#define IPC_H - - -extern int MyHostName(char *nameOut, int maxNameLength); -extern int CreatePort(int *port); -extern int AcceptConnection(int socket); -extern int Connect(const char *hostname, int port); -extern void CloseSocket(int socket); -extern int SendData(int socket, const void *data, int bytes); -extern int ReceiveData(int socket, void *data, int bytes); -extern int SendString(int socket, const char *str); -extern int ReceiveString(int socket, char *str, int maxLen); - - -#endif /* IPC_H */ diff --git a/progs/xdemos/manywin.c b/progs/xdemos/manywin.c deleted file mode 100644 index 8ad5c4fe49f..00000000000 --- a/progs/xdemos/manywin.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * Create N GLX windows/contexts and render to them in round-robin order. - * Also, have the contexts share all texture objects. - * Press 'd' to delete a texture, 'u' to unbind it. - * - * 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. - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <X11/keysym.h> - - -/* - * Each display/window/context: - */ -struct head { - char DisplayName[1000]; - Display *Dpy; - Window Win; - GLXContext Context; - float Angle; - char Renderer[1000]; - char Vendor[1000]; - char Version[1000]; -}; - - -#define MAX_HEADS 200 -static struct head Heads[MAX_HEADS]; -static int NumHeads = 0; -static GLboolean SwapSeparate = GL_TRUE; -static GLuint TexObj = 0; - - -static void -Error(const char *display, const char *msg) -{ - fprintf(stderr, "Error on display %s - %s\n", XDisplayName(display), msg); - exit(1); -} - - -static struct head * -AddHead(const char *displayName, const char *name) -{ - Display *dpy; - Window win; - GLXContext ctx; - 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; - XVisualInfo *visinfo; - int width = 90, height = 90; - int xpos = 0, ypos = 0; - - if (NumHeads >= MAX_HEADS) - return NULL; - - dpy = XOpenDisplay(displayName); - if (!dpy) { - Error(displayName, "Unable to open display"); - return NULL; - } - - scrnum = DefaultScreen(dpy); - root = RootWindow(dpy, scrnum); - - visinfo = glXChooseVisual(dpy, scrnum, attrib); - if (!visinfo) { - Error(displayName, "Unable to find RGB, double-buffered visual"); - return NULL; - } - - /* window attributes */ - xpos = (NumHeads % 10) * 100; - ypos = (NumHeads / 10) * 100; - printf("%d, %d\n", xpos, ypos); - 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, xpos, ypos, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - if (!win) { - Error(displayName, "Couldn't create window"); - return NULL; - } - - { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, name, name, - None, (char **)NULL, 0, &sizehints); - } - - if (NumHeads == 0) { - ctx = glXCreateContext(dpy, visinfo, NULL, True); - } - else { - /* share textures & dlists with 0th context */ - printf("sharing\n"); - ctx = glXCreateContext(dpy, visinfo, Heads[0].Context, True); - } - if (!ctx) { - Error(displayName, "Couldn't create GLX context"); - return NULL; - } - - XMapWindow(dpy, win); - - if (!glXMakeCurrent(dpy, win, ctx)) { - Error(displayName, "glXMakeCurrent failed"); - printf("glXMakeCurrent failed in Redraw()\n"); - return NULL; - } - - if (NumHeads == 0) { - /* create texture object now */ - static const GLubyte checker[2][2][4] = { - { {255, 255, 255, 255}, { 0, 0, 0, 255} }, - { { 0, 0, 0, 0}, {255, 255, 255, 255} } - }; - glGenTextures(1, &TexObj); - assert(TexObj); - glBindTexture(GL_TEXTURE_2D, TexObj); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGB, - GL_UNSIGNED_BYTE, checker); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - else { - /* bind 0th context's texture in this context too */ - assert(TexObj); - glBindTexture(GL_TEXTURE_2D, TexObj); - } - glEnable(GL_TEXTURE_2D); - - /* save the info for this head */ - { - struct head *h = &Heads[NumHeads]; - const char * tmp; - - if (strlen(name) + 1 > sizeof(h->DisplayName)) { - Error(displayName, "name string overflow"); - return NULL; - } - strcpy(h->DisplayName, name); - - h->Dpy = dpy; - h->Win = win; - h->Context = ctx; - h->Angle = 0.0; - - tmp = (char *) glGetString(GL_VERSION); - if (strlen(tmp) + 1 > sizeof(h->Version)) { - Error(displayName, "GL_VERSION string overflow"); - return NULL; - } - strcpy(h->Version, tmp); - - tmp = (char *) glGetString(GL_VENDOR); - if (strlen(tmp) + 1 > sizeof(h->Vendor)) { - Error(displayName, "GL_VENDOR string overflow"); - return NULL; - } - strcpy(h->Vendor, tmp); - - tmp = (char *) glGetString(GL_RENDERER); - if (strlen(tmp) + 1 > sizeof(h->Renderer)) { - Error(displayName, "GL_RENDERER string overflow"); - return NULL; - } - strcpy(h->Renderer, tmp); - - NumHeads++; - return &Heads[NumHeads-1]; - } - -} - - -static void -DestroyHeads(void) -{ - int i; - for (i = 0; i < NumHeads; i++) { - XDestroyWindow(Heads[i].Dpy, Heads[i].Win); - glXDestroyContext(Heads[i].Dpy, Heads[i].Context); - XCloseDisplay(Heads[i].Dpy); - } -} - - -static void -Redraw(struct head *h) -{ - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed"); - printf("glXMakeCurrent failed in Redraw()\n"); - return; - } - - h->Angle += 1.0; - - glShadeModel(GL_FLAT); - glClearColor(0.5, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* draw green triangle */ - glColor3f(0.0, 1.0, 0.0); - glPushMatrix(); - glRotatef(h->Angle, 0, 0, 1); - glBegin(GL_TRIANGLES); - glTexCoord2f(0.5, 1.0); glVertex2f(0, 0.8); - glTexCoord2f(0.0, 0.0); glVertex2f(-0.8, -0.7); - glTexCoord2f(1.0, 0.0); glVertex2f(0.8, -0.7); - glEnd(); - glPopMatrix(); - - if (!SwapSeparate) - glXSwapBuffers(h->Dpy, h->Win); -} - - -static void -Swap(struct head *h) -{ - glXSwapBuffers(h->Dpy, h->Win); -} - - -static void -Resize(const struct head *h, unsigned int width, unsigned int height) -{ - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed in Resize()"); - return; - } - glFlush(); - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); -} - - - -static void -EventLoop(void) -{ - while (1) { - int i; - for (i = 0; i < NumHeads; i++) { - struct head *h = &Heads[i]; - while (XPending(h->Dpy) > 0) { - XEvent event; - XNextEvent(h->Dpy, &event); - if (event.xany.window == h->Win) { - switch (event.type) { - case Expose: - Redraw(h); - if (SwapSeparate) - Swap(h); - break; - case ConfigureNotify: - Resize(h, event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - { - char buf[100]; - KeySym keySym; - XComposeStatus stat; - XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); - switch (keySym) { - case XK_Escape: - return; - break; - case XK_d: - case XK_D: - printf("Delete Texture in window %d\n", i); - glXMakeCurrent(h->Dpy, h->Win, h->Context); - glDeleteTextures(1, &TexObj); - break; - case XK_u: - case XK_U: - printf("Unbind Texture in window %d\n", i); - glXMakeCurrent(h->Dpy, h->Win, h->Context); - glBindTexture(GL_TEXTURE_2D, 0); - break; - } - } - break; - default: - /*no-op*/ ; - } - } - else { - printf("window mismatch\n"); - } - } - } - - /* redraw all windows */ - for (i = 0; i < NumHeads; i++) { - Redraw(&Heads[i]); - } - /* swapbuffers on all windows, if not already done */ - if (SwapSeparate) { - for (i = 0; i < NumHeads; i++) { - Swap(&Heads[i]); - } - } - usleep(1); - } -} - - - -static void -PrintInfo(const struct head *h) -{ - printf("Name: %s\n", h->DisplayName); - printf(" Display: %p\n", (void *) h->Dpy); - printf(" Window: 0x%x\n", (int) h->Win); - printf(" Context: 0x%lx\n", (long) h->Context); - printf(" GL_VERSION: %s\n", h->Version); - printf(" GL_VENDOR: %s\n", h->Vendor); - printf(" GL_RENDERER: %s\n", h->Renderer); -} - - -int -main(int argc, char *argv[]) -{ - char *dpyName = NULL; - int i; - - if (argc == 1) { - printf("manywin: open N simultaneous glx windows\n"); - printf("Usage:\n"); - printf(" manywin [-s] numWindows\n"); - printf("Options:\n"); - printf(" -s = swap immediately after drawing (see src code)\n"); - printf("Example:\n"); - printf(" manywin 10\n"); - return 0; - } - else { - int n = 3; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-s") == 0) { - SwapSeparate = GL_FALSE; - } - else if (strcmp(argv[i], "-display") == 0 && i < argc) { - dpyName = argv[i+1]; - i++; - } - else { - n = atoi(argv[i]); - } - } - if (n < 1) - n = 1; - if (n > MAX_HEADS) - n = MAX_HEADS; - - printf("%d windows\n", n); - for (i = 0; i < n; i++) { - char name[100]; - struct head *h; - sprintf(name, "%d", i); - h = AddHead(dpyName, name); - if (h) { - PrintInfo(h); - } - } - } - - EventLoop(); - DestroyHeads(); - return 0; -} diff --git a/progs/xdemos/msctest.c b/progs/xdemos/msctest.c deleted file mode 100644 index 11b04344426..00000000000 --- a/progs/xdemos/msctest.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright © 2009 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 <[email protected]> - * - */ - -/** @file msctest.c - * Simple test for MSC functionality. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glx.h> -#include <GL/glxext.h> -#include <X11/X.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> - -void (*get_sync_values)(Display *dpy, Window winGL, int64_t *ust, int64_t *msc, int64_t *sbc); -void (*wait_sync)(Display *dpy, Window winGL, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc); - -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[] = "v"; - -static void usage(char *name) -{ - printf("usage: %s\n", name); - exit(-1); -} - -int main(int argc, char *argv[]) -{ - Display *disp; - XVisualInfo *pvi; - XSetWindowAttributes swa; - int attrib[14]; - Window winGL; - GLXContext context; - int dummy; - Atom wmDelete; - int verbose = 0, width = 200, height = 200; - int c, i = 1; - int64_t ust, msc, sbc; - - opterr = 0; - while ((c = getopt(argc, argv, optstr)) != -1) { - switch (c) { - case 'v': - verbose = 1; - 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_OML_sync_control")) { - fprintf(stderr, "GLX_OML_sync_control not supported, exiting\n"); - 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; - attrib[8] = GLX_DOUBLEBUFFER; - attrib[9] = 1; - attrib[10] = None; - - 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), - 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); - - XSetStandardProperties(disp, winGL, "msc test", "msc text", - None, NULL, 0, NULL); - - XMapRaised(disp, winGL); - - glXMakeCurrent(disp, winGL, context); - - get_sync_values = (void *)glXGetProcAddress((unsigned char *)"glXGetSyncValuesOML"); - wait_sync = (void *)glXGetProcAddress((unsigned char *)"glXWaitForMscOML"); - - if (!get_sync_values || !wait_sync) { - fprintf(stderr, "failed to get sync values function\n"); - return -1; - } - - while (i++) { - get_sync_values(disp, winGL, &ust, &msc, &sbc); - fprintf(stderr, "ust: %llu, msc: %llu, sbc: %llu\n", ust, msc, - sbc); - - /* 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); - glXSwapBuffers(disp, winGL); - wait_sync(disp, winGL, 0, 60, 0, &ust, &msc, &sbc); - fprintf(stderr, - "wait returned ust: %llu, msc: %llu, sbc: %llu\n", - ust, msc, sbc); - sleep(1); - } - - XDestroyWindow(disp, winGL); - glXDestroyContext(disp, context); - XCloseDisplay(disp); - - return 0; -} diff --git a/progs/xdemos/multictx.c b/progs/xdemos/multictx.c deleted file mode 100644 index 75255b28605..00000000000 --- a/progs/xdemos/multictx.c +++ /dev/null @@ -1,585 +0,0 @@ -/* - * Copyright (C) 2009 VMware, Inc. 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. - */ - -/* - * Test rendering with two contexts into one window. - * Setup different rendering state for each context to check that - * context switching is handled properly. - * - * Brian Paul - * 6 Aug 2009 - */ - - -#include <math.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/time.h> -#include <unistd.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#include <GL/gl.h> -#include <GL/glx.h> - - - -#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 = 0.0, view_roty = 210.0, view_rotz = 0.0; -static GLint gear1, gear2; -static GLfloat angle = 0.0; - -static GLboolean animate = GL_TRUE; /* Animation */ - - -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; -} - - -/* - * - * 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 -draw(int ctx) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glRotatef(view_rotx, 1.0, 0.0, 0.0); - glRotatef(view_roty + angle, 0.0, 1.0, 0.0); - glRotatef(view_rotz, 0.0, 0.0, 1.0); - - if (ctx == 0) { - glDisable(GL_CULL_FACE); - glPushMatrix(); - glRotatef(angle, 0.0, 0.0, 1.0); - glCallList(gear1); - glPopMatrix(); - /* This should not effect the other context's rendering */ - glEnable(GL_CULL_FACE); - glCullFace(GL_FRONT_AND_BACK); - } - else { - glPushMatrix(); - glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0); - glCallList(gear2); - glPopMatrix(); - } - - glPopMatrix(); - - /* this flush is important since we'll be switching contexts next */ - glFlush(); -} - - - -static void -draw_frame(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2) -{ - static double tRot0 = -1.0; - double dt, t = current_time(); - - if (tRot0 < 0.0) - tRot0 = t; - dt = t - tRot0; - tRot0 = t; - - if (animate) { - /* advance rotation for next frame */ - angle += 70.0 * dt; /* 70 degrees per second */ - if (angle > 3600.0) - angle -= 3600.0; - } - - glXMakeCurrent(dpy, (GLXDrawable) win, ctx1); - draw(0); - - glXMakeCurrent(dpy, (GLXDrawable) win, ctx2); - draw(1); - - glXSwapBuffers(dpy, win); -} - - -/* new window size or exposure */ -static void -reshape(Display *dpy, Window win, - GLXContext ctx1, GLXContext ctx2, int width, int height) -{ - int i; - - width /= 2; - - /* loop: left half of window, right half of window */ - for (i = 0; i < 2; i++) { - if (i == 0) - glXMakeCurrent(dpy, win, ctx1); - else - glXMakeCurrent(dpy, win, ctx2); - - glViewport(width * i, 0, width, height); - glScissor(width * i, 0, width, 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, -30.0); - } -} - - - -static void -init(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2) -{ - 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, 0.5 }; - /*static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };*/ - - /* first ctx */ - { - static GLuint stipple[32] = { - 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, - 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, - - 0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00, - 0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00, - - 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, - 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff, - - 0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00, - 0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00 - }; - - glXMakeCurrent(dpy, win, ctx1); - - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - - 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(); - - glEnable(GL_NORMALIZE); - glEnable(GL_SCISSOR_TEST); - glClearColor(0.4, 0.4, 0.4, 1.0); - - glPolygonStipple((GLubyte *) stipple); - glEnable(GL_POLYGON_STIPPLE); - } - - /* second ctx */ - { - glXMakeCurrent(dpy, win, ctx2); - - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - - gear2 = glGenLists(1); - glNewList(gear2, GL_COMPILE); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); - gear(1.5, 3.0, 1.5, 16, 0.7); - glEndList(); - - glEnable(GL_NORMALIZE); - glEnable(GL_SCISSOR_TEST); - glClearColor(0.6, 0.6, 0.6, 1.0); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } -} - - -/** - * Create an RGB, double-buffered window. - * Return the window and two context handles. - */ -static void -make_window_and_contexts( Display *dpy, const char *name, - int x, int y, int width, int height, - Window *winRet, - GLXContext *ctxRet1, - GLXContext *ctxRet2) -{ - 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; - XVisualInfo *visinfo; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - 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; - 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); - } - - *winRet = win; - *ctxRet1 = glXCreateContext( dpy, visinfo, NULL, True ); - *ctxRet2 = glXCreateContext( dpy, visinfo, NULL, True ); - - if (!*ctxRet1 || !*ctxRet2) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - XFree(visinfo); -} - - -/** - * Handle one X event. - * \return NOP, EXIT or DRAW - */ -static int -handle_event(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2, - XEvent *event) -{ - (void) dpy; - (void) win; - - switch (event->type) { - case Expose: - return DRAW; - case ConfigureNotify: - reshape(dpy, win, ctx1, ctx2, - event->xconfigure.width, 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 EXIT; - } - else if (buffer[0] == 'a' || buffer[0] == 'A') { - animate = !animate; - } - } - return DRAW; - } - } - return NOP; -} - - -static void -event_loop(Display *dpy, Window win, GLXContext ctx1, GLXContext ctx2) -{ - while (1) { - int op; - while (!animate || XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - op = handle_event(dpy, win, ctx1, ctx2, &event); - if (op == EXIT) - return; - else if (op == DRAW) - break; - } - - draw_frame(dpy, win, ctx1, ctx2); - } -} - - -int -main(int argc, char *argv[]) -{ - unsigned int winWidth = 800, winHeight = 400; - int x = 0, y = 0; - Display *dpy; - Window win; - GLXContext ctx1, ctx2; - 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 { - return 1; - } - } - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", - dpyName ? dpyName : getenv("DISPLAY")); - return -1; - } - - make_window_and_contexts(dpy, "multictx", x, y, winWidth, winHeight, - &win, &ctx1, &ctx2); - XMapWindow(dpy, win); - - 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)); - } - - init(dpy, win, ctx1, ctx2); - - /* Set initial projection/viewing transformation. - * We can't be sure we'll get a ConfigureNotify event when the window - * first appears. - */ - reshape(dpy, win, ctx1, ctx2, winWidth, winHeight); - - event_loop(dpy, win, ctx1, ctx2); - - glDeleteLists(gear1, 1); - glDeleteLists(gear2, 1); - glXDestroyContext(dpy, ctx1); - glXDestroyContext(dpy, ctx2); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); - - return 0; -} diff --git a/progs/xdemos/offset.c b/progs/xdemos/offset.c deleted file mode 100644 index 3858a5b8020..00000000000 --- a/progs/xdemos/offset.c +++ /dev/null @@ -1,343 +0,0 @@ -/**************************************************************************** -Copyright 1995 by Silicon Graphics Incorporated, Mountain View, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Silicon Graphics not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF -USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - -****************************************************************************/ - -/* - * Derived from code written by Kurt Akeley, November 1992 - * - * Uses PolygonOffset to draw hidden-line images. PolygonOffset - * shifts the z values of polygons an amount that is - * proportional to their slope in screen z. This keeps - * the lines, which are drawn without displacement, from - * interacting with their respective polygons, and - * thus eliminates line dropouts. - * - * The left image shows an ordinary antialiased wireframe image. - * The center image shows an antialiased hidden-line image without - * PolygonOffset. - * The right image shows an antialiased hidden-line image using - * PolygonOffset to reduce artifacts. - * - * Drag with a mouse button pressed to rotate the models. - * Press the escape key to exit. - */ - -/* - * Modified for OpenGL 1.1 glPolygonOffset() conventions - */ - - -#include <GL/glx.h> -#include <X11/keysym.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#undef GL_EXT_polygon_offset /* use GL 1.1 version instead of extension */ - - -#ifndef EXIT_FAILURE -# define EXIT_FAILURE 1 -#endif -#ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -#endif - -#define MAXQUAD 6 - -typedef float Vertex[3]; - -typedef Vertex Quad[4]; - -/* data to define the six faces of a unit cube */ -Quad quads[MAXQUAD] = { - { {0,0,0}, {0,0,1}, {0,1,1}, {0,1,0} }, /* x = 0 */ - { {0,0,0}, {1,0,0}, {1,0,1}, {0,0,1} }, /* y = 0 */ - { {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0} }, /* z = 0 */ - { {1,0,0}, {1,0,1}, {1,1,1}, {1,1,0} }, /* x = 1 */ - { {0,1,0}, {1,1,0}, {1,1,1}, {0,1,1} }, /* y = 1 */ - { {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} } /* z = 1 */ -}; - -#define WIREFRAME 0 -#define HIDDEN_LINE 1 - -static void error(const char* prog, const char* msg); -static void cubes(int mx, int my, int mode); -static void fill(Quad quad); -static void outline(Quad quad); -static void draw_hidden(Quad quad, int mode, int face); -static void process_input(Display *dpy, Window win); -static int query_extension(char* extName); - -static int attributeList[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None }; - -static int dimension = 3; - -static float Scale = 1.0; - - -int main(int argc, char** argv) { - Display *dpy; - XVisualInfo *vi; - XSetWindowAttributes swa; - Window win; - GLXContext cx; - GLint z; - - dpy = XOpenDisplay(0); - if (!dpy) error(argv[0], "can't open display"); - - vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeList); - if (!vi) error(argv[0], "no suitable visual"); - - cx = glXCreateContext(dpy, vi, 0, GL_TRUE); - - swa.colormap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), - vi->visual, AllocNone); - - swa.border_pixel = 0; - swa.event_mask = ExposureMask | StructureNotifyMask | KeyPressMask | - ButtonPressMask | ButtonMotionMask; - win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 900, 300, - 0, vi->depth, InputOutput, vi->visual, - CWBorderPixel|CWColormap|CWEventMask, &swa); - XStoreName(dpy, win, "hiddenline"); - XMapWindow(dpy, win); - - glXMakeCurrent(dpy, win, cx); - - /* check for the polygon offset extension */ -#ifndef GL_VERSION_1_1 - if (!query_extension("GL_EXT_polygon_offset")) - error(argv[0], "polygon_offset extension is not available"); -#else - (void) query_extension; -#endif - - /* set up viewing parameters */ - glMatrixMode(GL_PROJECTION); - glFrustum(-1, 1, -1, 1, 6, 20); - glMatrixMode(GL_MODELVIEW); - glTranslatef(0, 0, -15); - - /* set other relevant state information */ - glEnable(GL_DEPTH_TEST); - - glGetIntegerv(GL_DEPTH_BITS, &z); - printf("GL_DEPTH_BITS = %d\n", z); - -#ifdef GL_EXT_polygon_offset - printf("using 1.0 offset extension\n"); - glPolygonOffsetEXT( 1.0, 0.00001 ); -#else - printf("using 1.1 offset\n"); - glPolygonOffset( 1.0, 0.5 ); -#endif - - glShadeModel( GL_FLAT ); - glDisable( GL_DITHER ); - - /* process events until the user presses ESC */ - while (1) process_input(dpy, win); - - return 0; -} - -static void -draw_scene(int mx, int my) { - glClearColor(0.25, 0.25, 0.25, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(-1.7, 0.0, 0.0); - cubes(mx, my, WIREFRAME); - glPopMatrix(); - - glPushMatrix(); - cubes(mx, my, HIDDEN_LINE); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(1.7, 0.0, 0.0); -#ifdef GL_EXT_polygon_offset - glEnable(GL_POLYGON_OFFSET_EXT); -#else - glEnable(GL_POLYGON_OFFSET_FILL); -#endif - glScalef(Scale, Scale, Scale); - cubes(mx, my, HIDDEN_LINE); -#ifdef GL_EXT_polygon_offset - glDisable(GL_POLYGON_OFFSET_EXT); -#else - glDisable(GL_POLYGON_OFFSET_FILL); -#endif - glPopMatrix(); -} - - -static void -cubes(int mx, int my, int mode) { - int x, y, z, i; - - /* track the mouse */ - glRotatef(mx / 2.0, 0, 1, 0); - glRotatef(my / 2.0, 1, 0, 0); - - /* draw the lines as hidden polygons */ - glTranslatef(-0.5, -0.5, -0.5); - glScalef(1.0/dimension, 1.0/dimension, 1.0/dimension); - for (z = 0; z < dimension; z++) { - for (y = 0; y < dimension; y++) { - for (x = 0; x < dimension; x++) { - glPushMatrix(); - glTranslatef(x, y, z); - glScalef(0.8, 0.8, 0.8); - for (i = 0; i < MAXQUAD; i++) - draw_hidden(quads[i], mode, i); - glPopMatrix(); - } - } - } -} - -static void -fill(Quad quad) { - /* draw a filled polygon */ - glBegin(GL_QUADS); - glVertex3fv(quad[0]); - glVertex3fv(quad[1]); - glVertex3fv(quad[2]); - glVertex3fv(quad[3]); - glEnd(); -} - -static void -outline(Quad quad) { - /* draw an outlined polygon */ - glBegin(GL_LINE_LOOP); - glVertex3fv(quad[0]); - glVertex3fv(quad[1]); - glVertex3fv(quad[2]); - glVertex3fv(quad[3]); - glEnd(); -} - -static void -draw_hidden(Quad quad, int mode, int face) { - static const GLfloat colors[3][3] = { - {0.5, 0.5, 0.0}, - {0.8, 0.5, 0.0}, - {0.0, 0.5, 0.8} - }; - if (mode == HIDDEN_LINE) { - glColor3fv(colors[face % 3]); - fill(quad); - } - - /* draw the outline using white */ - glColor3f(1, 1, 1); - outline(quad); -} - -static void -process_input(Display *dpy, Window win) { - XEvent event; - static int prevx, prevy; - static int deltax = 90, deltay = 40; - - do { - char buf[31]; - KeySym keysym; - - XNextEvent(dpy, &event); - switch(event.type) { - case Expose: - break; - case ConfigureNotify: { - /* this approach preserves a 1:1 viewport aspect ratio */ - int vX, vY, vW, vH; - int eW = event.xconfigure.width, eH = event.xconfigure.height; - if (eW >= eH) { - vX = 0; - vY = (eH - eW) >> 1; - vW = vH = eW; - } else { - vX = (eW - eH) >> 1; - vY = 0; - vW = vH = eH; - } - glViewport(vX, vY, vW, vH); - } - break; - case KeyPress: - (void) XLookupString(&event.xkey, buf, sizeof(buf), &keysym, NULL); - switch (keysym) { - case 'Z': - Scale *= 1.1; - break; - case 'z': - Scale *= 0.9; - break; - case XK_Escape: - exit(EXIT_SUCCESS); - default: - break; - } - break; - case ButtonPress: - prevx = event.xbutton.x; - prevy = event.xbutton.y; - break; - case MotionNotify: - deltax += (event.xbutton.x - prevx); prevx = event.xbutton.x; - deltay += (event.xbutton.y - prevy); prevy = event.xbutton.y; - break; - default: - break; - } - } while (XPending(dpy)); - - draw_scene(deltax, deltay); - glXSwapBuffers(dpy, win); -} - -static void -error(const char *prog, const char *msg) { - fprintf(stderr, "%s: %s\n", prog, msg); - exit(EXIT_FAILURE); -} - -static int -query_extension(char* extName) { - char *p = (char *) glGetString(GL_EXTENSIONS); - char *end = p + strlen(p); - while (p < end) { - int n = strcspn(p, " "); - if ((strlen(extName) == n) && (strncmp(extName, p, n) == 0)) - return GL_TRUE; - p += (n + 1); - } - return GL_FALSE; -} - diff --git a/progs/xdemos/omlsync.c b/progs/xdemos/omlsync.c deleted file mode 100644 index 061d6c68613..00000000000 --- a/progs/xdemos/omlsync.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright © 2007-2010 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 <[email protected]> - * - */ - -/** @file omlsync.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 <width>' and '-h <height>' to set the - * window size. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glx.h> -#include <GL/glxext.h> -#include <X11/X.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> - -Bool (*glXGetSyncValuesOML)(Display *dpy, GLXDrawable drawable, - int64_t *ust, int64_t *msc, int64_t *sbc); -Bool (*glXGetMscRateOML)(Display *dpy, GLXDrawable drawable, int32_t *numerator, - int32_t *denominator); -int64_t (*glXSwapBuffersMscOML)(Display *dpy, GLXDrawable drawable, - int64_t target_msc, int64_t divisor, - int64_t remainder); -Bool (*glXWaitForMscOML)(Display *dpy, GLXDrawable drawable, int64_t target_msc, - int64_t divisor, int64_t remainder, int64_t *ust, - 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, *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:vd:r:n:i:"; - -static void usage(char *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-v: verbose (print count)\n"); - exit(-1); -} - -int main(int argc, char *argv[]) -{ - Display *disp; - XVisualInfo *pvi; - XSetWindowAttributes swa; - Window winGL; - 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, swap_interval = 1; - int c, i = 1; - int ret; - 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 'v': - verbose = 1; - break; - case 'd': - divisor = atoi(optarg); - break; - case 'r': - remainder = atoi(optarg); - break; - case 'n': - wait_interval = atoi(optarg); - break; - case 'i': - swap_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_OML_sync_control")) { - fprintf(stderr, "GLX_OML_sync_control not supported\n"); - 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) { - 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); - } - - glXGetSyncValuesOML = (void *)glXGetProcAddress((unsigned char *)"glXGetSyncValuesOML"); - glXGetMscRateOML = (void *)glXGetProcAddress((unsigned char *)"glXGetMscRateOML"); - 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) { - 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); - - 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); - glXDestroyContext(disp, context); - XCloseDisplay(disp); - - return 0; -} diff --git a/progs/xdemos/opencloseopen.c b/progs/xdemos/opencloseopen.c deleted file mode 100644 index 756096095ef..00000000000 --- a/progs/xdemos/opencloseopen.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. - * (C) Copyright IBM Corporation 2003 - * - * 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. - */ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <X11/Xlib.h> -#include <GL/gl.h> -#include <GL/glx.h> - -/** \file opencloseopen.c - * Simple test for Mesa bug #508473. Create a window and rendering context. - * Draw a single frame. Close the window, destroy the context, and close - * the display. Re-open the display, create a new window and context. This - * should work, but, at least as of Mesa 5.1, it segfaults. See the bug - * report for more details. - * - * Most of the code here was lifed from various other Mesa xdemos. - */ - -static void -draw(void) -{ - glViewport(0, 0, 300, 300); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - - glShadeModel(GL_FLAT); - glClearColor(0.5, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* draw blue quad */ - glLoadIdentity(); - glColor3f(0.3, 0.3, 1.0); - glPushMatrix(); - glRotatef(0, 0, 0, 1); - glBegin(GL_POLYGON); - glVertex2f(-0.5, -0.25); - glVertex2f( 0.5, -0.25); - glVertex2f( 0.5, 0.25); - glVertex2f(-0.5, 0.25); - glEnd(); - glPopMatrix();} - - -/* - * Create an RGB, double-buffered window. - * Return the window and context handles. - */ -static void -make_window( const char * dpyName, const char *name, - int x, int y, int width, int height, - Display **dpyRet, Window *winRet, GLXContext *ctxRet) -{ - 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; - Display *dpy; - - dpy = XOpenDisplay(dpyName); - if (!dpy) { - printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); - exit(1); - } - - *dpyRet = dpy; - 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 | KeyPressMask; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow( dpy, root, 0, 0, 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); - } - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - if (!ctx) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - XFree(visinfo); - - *winRet = win; - *ctxRet = ctx; -} - - -static void -destroy_window( Display *dpy, Window win, GLXContext ctx ) -{ - glXMakeCurrent(dpy, None, NULL); - glXDestroyContext(dpy, ctx); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - Window win; - GLXContext ctx; - char *dpyName = NULL; - int i; - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-display") == 0) { - dpyName = argv[i+1]; - i++; - } - } - - printf("If this program segfaults, then Mesa bug #508473 is probably " - "back.\n"); - make_window(dpyName, "Open-close-open", 0, 0, 300, 300, &dpy, &win, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, win, ctx); - - draw(); - glXSwapBuffers(dpy, win); - sleep(2); - - destroy_window(dpy, win, ctx); - - make_window(dpyName, "Open-close-open", 0, 0, 300, 300, &dpy, &win, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, win, ctx); - destroy_window(dpy, win, ctx); - - return 0; -} diff --git a/progs/xdemos/overlay.c b/progs/xdemos/overlay.c deleted file mode 100644 index 758f85c4492..00000000000 --- a/progs/xdemos/overlay.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * GLX overlay test/demo. - * - * Brian Paul - * 18 July 2005 - */ - -#include <GL/gl.h> -#include <GL/glx.h> -#include <X11/keysym.h> -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> - -static int WinWidth = 300, WinHeight = 300; -static Window NormalWindow = 0; -static Window OverlayWindow = 0; -static GLXContext NormalContext = 0; -static GLXContext OverlayContext = 0; -static GLboolean RGBOverlay = GL_FALSE; -static GLfloat Angle = 0.0; - - -static void -RedrawNormal(Display *dpy) -{ - glXMakeCurrent(dpy, NormalWindow, NormalContext); - glViewport(0, 0, WinWidth, WinHeight); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glClearColor(0.5, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - glColor3f(1.0, 1.0, 0.0); - glPushMatrix(); - glRotatef(Angle, 0, 0, 1); - glRectf(-0.8, -0.8, 0.8, 0.8); - glPopMatrix(); - glXSwapBuffers(dpy, NormalWindow); -} - - -static void -RedrawOverlay(Display *dpy) -{ - glXMakeCurrent(dpy, OverlayWindow, OverlayContext); - glViewport(0, 0, WinWidth, WinHeight); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glClear(GL_COLOR_BUFFER_BIT); - if (RGBOverlay) { - glColor3f(0.0, 1.0, 1.0); - } - else { - glIndexi(2); - } - glBegin(GL_LINES); - glVertex2f(-1, -1); - glVertex2f(1, 1); - glVertex2f(1, -1); - glVertex2f(-1, 1); - glEnd(); - glXSwapBuffers(dpy, OverlayWindow); -} - - -static Window -MakeWindow(Display *dpy, XVisualInfo *visinfo, Window parent, - unsigned int width, unsigned int height) -{ - int scrnum; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - Window win; - - 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, parent, 0, 0, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - return win; -} - - -static void -MakeNormalWindow(Display *dpy) -{ - int attrib[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - None }; - int scrnum; - Window root; - 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); - } - - NormalWindow = MakeWindow(dpy, visinfo, root, WinWidth, WinHeight); - assert(NormalWindow); - - NormalContext = glXCreateContext(dpy, visinfo, NULL, True); - assert(NormalContext); -} - - -static void -MakeOverlayWindow(Display *dpy) -{ - int rgbAttribs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_LEVEL, 1, - None - }; - int indexAttribs[] = { - /*GLX_RGBA, leave this out */ - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_LEVEL, 1, - None - }; - int scrnum; - Window root; - XVisualInfo *visinfo; - - scrnum = DefaultScreen(dpy); - root = RootWindow(dpy, scrnum); - - visinfo = glXChooseVisual(dpy, scrnum, rgbAttribs); - if (visinfo) { - printf("Found RGB overlay visual 0x%x\n", (int) visinfo->visualid); - RGBOverlay = GL_TRUE; - } - else { - visinfo = glXChooseVisual(dpy, scrnum, indexAttribs); - if (visinfo) { - printf("Found Color Index overlay visual 0x%x\n", - (int) visinfo->visualid); - /* XXX setup the colormap entries! */ - } - else { - printf("Couldn't get an overlay visual.\n"); - printf("Your hardware probably doesn't support framebuffer overlay planes.\n"); - exit(1); - } - } - - OverlayWindow = MakeWindow(dpy, visinfo, NormalWindow, WinWidth, WinHeight); - assert(OverlayWindow); - - OverlayContext = glXCreateContext(dpy, visinfo, NULL, True); - assert(OverlayContext); -} - - -static void -EventLoop(Display *dpy) -{ - XEvent event; - - while (1) { - XNextEvent(dpy, &event); - - switch (event.type) { - case Expose: - RedrawNormal(dpy); - RedrawOverlay(dpy); - break; - case ConfigureNotify: - WinWidth = event.xconfigure.width; - WinHeight = event.xconfigure.height; - if (event.xconfigure.window == NormalWindow) - XResizeWindow(dpy, OverlayWindow, WinWidth, WinHeight); - break; - case KeyPress: - { - char buffer[10]; - int r, code; - code = XLookupKeysym(&event.xkey, 0); - r = XLookupString(&event.xkey, buffer, sizeof(buffer), - NULL, NULL); - if (buffer[0] == 27) { - /* escape */ - return; - } - else if (buffer[0] == ' ') { - Angle += 5.0; - RedrawNormal(dpy); - } - } - break; - default: - ; /* nothing */ - } - } -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy = XOpenDisplay(NULL); - - assert(dpy); - - MakeNormalWindow(dpy); - MakeOverlayWindow(dpy); - - XMapWindow(dpy, NormalWindow); - XMapWindow(dpy, OverlayWindow); - - EventLoop(dpy); - - glXDestroyContext(dpy, OverlayContext); - glXDestroyContext(dpy, NormalContext); - XDestroyWindow(dpy, OverlayWindow); - XDestroyWindow(dpy, NormalWindow); - - return 0; -} diff --git a/progs/xdemos/pbdemo.c b/progs/xdemos/pbdemo.c deleted file mode 100644 index 277df729246..00000000000 --- a/progs/xdemos/pbdemo.c +++ /dev/null @@ -1,493 +0,0 @@ - -/* - * This program demonstrates how to do "off-screen" rendering using - * the GLX pixel buffer extension. - * - * Written by Brian Paul for the "OpenGL and Window System Integration" - * course presented at SIGGRAPH '97. Updated on 5 October 2002. - * - * Usage: - * pbuffers width height imgfile - * Where: - * width is the width, in pixels, of the image to generate. - * height is the height, in pixels, of the image to generate. - * imgfile is the name of the PPM image file to write. - * - * - * This demo draws 3-D boxes with random orientation. A pbuffer with - * a depth (Z) buffer is prefered but if such a pbuffer can't be created - * we use a non-depth-buffered config. - * - * On machines such as the SGI Indigo you may have to reconfigure your - * display/X server to enable pbuffers. Look in the /usr/gfx/ucode/MGRAS/vof/ - * directory for display configurationswith the _pbuf suffix. Use - * setmon -x <vof> to configure your X server and display for pbuffers. - * - * O2 systems seem to support pbuffers well. - * - * IR systems (at least 1RM systems) don't have single-buffered, RGBA, - * Z-buffered pbuffer configs. BUT, they DO have DOUBLE-buffered, RGBA, - * Z-buffered pbuffers. Note how we try four different fbconfig attribute - * lists below! - */ - - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <X11/Xlib.h> -#include "pbutil.h" - - -/* Some ugly global vars */ -static Display *gDpy = NULL; -static int gScreen = 0; -static FBCONFIG gFBconfig = 0; -static PBUFFER gPBuffer = 0; -static int gWidth, gHeight; -static GLXContext glCtx; - - - -/* - * Create the pbuffer and return a GLXPbuffer handle. - * - * We loop over a list of fbconfigs trying to create - * a pixel buffer. We return the first pixel buffer which we successfully - * create. - */ -static PBUFFER -MakePbuffer( Display *dpy, int screen, int width, int height ) -{ -#define NUM_FB_CONFIGS 4 - const char fbString[NUM_FB_CONFIGS][100] = { - "Single Buffered, depth buffer", - "Double Buffered, depth buffer", - "Single Buffered, no depth buffer", - "Double Buffered, no depth buffer" - }; - int fbAttribs[NUM_FB_CONFIGS][100] = { - { - /* Single buffered, with depth buffer */ - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, 0, - GLX_STENCIL_SIZE, 0, - None - }, - { - /* Double buffered, with depth buffer */ - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, 1, - GLX_STENCIL_SIZE, 0, - None - }, - { - /* Single buffered, without depth buffer */ - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 0, - GLX_DOUBLEBUFFER, 0, - GLX_STENCIL_SIZE, 0, - None - }, - { - /* Double buffered, without depth buffer */ - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DEPTH_SIZE, 0, - GLX_DOUBLEBUFFER, 1, - GLX_STENCIL_SIZE, 0, - None - } - }; - Bool largest = True; - Bool preserve = False; - FBCONFIG *fbConfigs; - PBUFFER pBuffer = None; - int nConfigs; - int i; - int attempt; - - for (attempt=0; attempt<NUM_FB_CONFIGS; attempt++) { - - /* Get list of possible frame buffer configurations */ - fbConfigs = ChooseFBConfig(dpy, screen, fbAttribs[attempt], &nConfigs); - if (nConfigs==0 || !fbConfigs) { - printf("Note: glXChooseFBConfig(%s) failed\n", fbString[attempt]); - XFree(fbConfigs); - continue; - } - -#if 0 /*DEBUG*/ - for (i=0;i<nConfigs;i++) { - printf("Config %d\n", i); - PrintFBConfigInfo(dpy, screen, fbConfigs[i], 0); - } -#endif - - /* Create the pbuffer using first fbConfig in the list that works. */ - for (i=0;i<nConfigs;i++) { - pBuffer = CreatePbuffer(dpy, screen, fbConfigs[i], width, height, largest, preserve); - if (pBuffer) { - gFBconfig = fbConfigs[i]; - gWidth = width; - gHeight = height; - break; - } - } - - if (pBuffer!=None) { - break; - } - } - - if (pBuffer) { - printf("Using: %s\n", fbString[attempt]); - } - - XFree(fbConfigs); - - return pBuffer; -#undef NUM_FB_CONFIGS -} - - - -/* - * Do all the X / GLX setup stuff. - */ -static int -Setup(int width, int height) -{ - int pbSupport; - XVisualInfo *visInfo; - - /* Open the X display */ - gDpy = XOpenDisplay(NULL); - if (!gDpy) { - printf("Error: couldn't open default X display.\n"); - return 0; - } - - /* Get default screen */ - gScreen = DefaultScreen(gDpy); - - /* Test that pbuffers are available */ - pbSupport = QueryPbuffers(gDpy, gScreen); - if (pbSupport == 1) { - printf("Using GLX 1.3 Pbuffers\n"); - } - else if (pbSupport == 2) { - printf("Using SGIX Pbuffers\n"); - } - else { - printf("Error: pbuffers not available on this screen\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Create Pbuffer */ - gPBuffer = MakePbuffer( gDpy, gScreen, width, height ); - if (gPBuffer==None) { - printf("Error: couldn't create pbuffer\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Test drawable queries */ - { - unsigned int v; - glXQueryDrawable( gDpy, gPBuffer, GLX_WIDTH, &v); - printf("GLX_WIDTH = %u\n", v); - glXQueryDrawable( gDpy, gPBuffer, GLX_HEIGHT, &v); - printf("GLX_HEIGHT = %u\n", v); - glXQueryDrawable( gDpy, gPBuffer, GLX_PRESERVED_CONTENTS, &v); - printf("GLX_PRESERVED_CONTENTS = %u\n", v); - glXQueryDrawable( gDpy, gPBuffer, GLX_LARGEST_PBUFFER, &v); - printf("GLX_LARGEST_PBUFFER = %u\n", v); - glXQueryDrawable( gDpy, gPBuffer, GLX_FBCONFIG_ID, &v); - printf("GLX_FBCONFIG_ID = %u\n", v); - } - - /* Get corresponding XVisualInfo */ - visInfo = GetVisualFromFBConfig(gDpy, gScreen, gFBconfig); - if (!visInfo) { - printf("Error: can't get XVisualInfo from FBconfig\n"); - XCloseDisplay(gDpy); - return 0; - } - - /* Create GLX context */ - glCtx = glXCreateContext(gDpy, visInfo, NULL, True); - if (!glCtx) { - /* try indirect */ - glCtx = glXCreateContext(gDpy, visInfo, NULL, False); - if (!glCtx) { - printf("Error: Couldn't create GLXContext\n"); - XFree(visInfo); - XCloseDisplay(gDpy); - return 0; - } - else { - printf("Warning: using indirect GLXContext\n"); - } - } - - /* Bind context to pbuffer */ - if (!glXMakeCurrent(gDpy, gPBuffer, glCtx)) { - printf("Error: glXMakeCurrent failed\n"); - XFree(visInfo); - XCloseDisplay(gDpy); - return 0; - } - - return 1; /* Success!! */ -} - - - -/* One-time GL setup */ -static void -InitGL(void) -{ - static GLfloat pos[4] = {0.0, 0.0, 10.0, 0.0}; - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_NORMALIZE); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - - glViewport(0, 0, gWidth, gHeight); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - glTranslatef( 0.0, 0.0, -15.0 ); -} - - -/* Return random float in [0,1] */ -static float -Random(void) -{ - int i = rand(); - return (float) (i % 1000) / 1000.0; -} - - -static void -RandomColor(void) -{ - GLfloat c[4]; - c[0] = Random(); - c[1] = Random(); - c[2] = Random(); - c[3] = 1.0; - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, c); -} - - -/* This function borrowed from Mark Kilgard's GLUT */ -static void -drawBox(GLfloat x0, GLfloat x1, GLfloat y0, GLfloat y1, - GLfloat z0, GLfloat z1, GLenum type) -{ - static GLfloat n[6][3] = - { - {-1.0, 0.0, 0.0}, - {0.0, 1.0, 0.0}, - {1.0, 0.0, 0.0}, - {0.0, -1.0, 0.0}, - {0.0, 0.0, 1.0}, - {0.0, 0.0, -1.0} - }; - static GLint faces[6][4] = - { - {0, 1, 2, 3}, - {3, 2, 6, 7}, - {7, 6, 5, 4}, - {4, 5, 1, 0}, - {5, 6, 2, 1}, - {7, 4, 0, 3} - }; - GLfloat v[8][3], tmp; - GLint i; - - if (x0 > x1) { - tmp = x0; - x0 = x1; - x1 = tmp; - } - if (y0 > y1) { - tmp = y0; - y0 = y1; - y1 = tmp; - } - if (z0 > z1) { - tmp = z0; - z0 = z1; - z1 = tmp; - } - v[0][0] = v[1][0] = v[2][0] = v[3][0] = x0; - v[4][0] = v[5][0] = v[6][0] = v[7][0] = x1; - v[0][1] = v[1][1] = v[4][1] = v[5][1] = y0; - v[2][1] = v[3][1] = v[6][1] = v[7][1] = y1; - v[0][2] = v[3][2] = v[4][2] = v[7][2] = z0; - v[1][2] = v[2][2] = v[5][2] = v[6][2] = z1; - - for (i = 0; i < 6; i++) { - glBegin(type); - glNormal3fv(&n[i][0]); - glVertex3fv(&v[faces[i][0]][0]); - glVertex3fv(&v[faces[i][1]][0]); - glVertex3fv(&v[faces[i][2]][0]); - glVertex3fv(&v[faces[i][3]][0]); - glEnd(); - } -} - - - -/* Render a scene */ -static void -Render(void) -{ - int NumBoxes = 100; - int i; - - glClearColor(0.2, 0.2, 0.9, 0.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - for (i=0;i<NumBoxes;i++) { - float tx = -2.0 + 4.0 * Random(); - float ty = -2.0 + 4.0 * Random(); - float tz = 4.0 - 16.0 * Random(); - float sx = 0.1 + Random() * 0.4; - float sy = 0.1 + Random() * 0.4; - float sz = 0.1 + Random() * 0.4; - float rx = Random(); - float ry = Random(); - float rz = Random(); - float ra = Random() * 360.0; - glPushMatrix(); - glTranslatef(tx, ty, tz); - glRotatef(ra, rx, ry, rz); - glScalef(sx, sy, sz); - RandomColor(); - drawBox(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0, GL_POLYGON); - glPopMatrix(); - } - - glFinish(); -} - - - -static void -WriteFile(const char *filename) -{ - FILE *f; - GLubyte *image; - int i; - - image = malloc(gWidth * gHeight * 3 * sizeof(GLubyte)); - if (!image) { - printf("Error: couldn't allocate image buffer\n"); - return; - } - - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, gWidth, gHeight, GL_RGB, GL_UNSIGNED_BYTE, image); - - f = fopen(filename, "w"); - if (!f) { - printf("Couldn't open image file: %s\n", filename); - return; - } - fprintf(f,"P6\n"); - fprintf(f,"# ppm-file created by %s\n", "trdemo2"); - fprintf(f,"%i %i\n", gWidth, gHeight); - fprintf(f,"255\n"); - fclose(f); - f = fopen(filename, "ab"); /* now append binary data */ - if (!f) { - printf("Couldn't append to image file: %s\n", filename); - return; - } - - for (i=0;i<gHeight;i++) { - GLubyte *rowPtr; - /* Remember, OpenGL images are bottom to top. Have to reverse. */ - rowPtr = image + (gHeight-1-i) * gWidth*3; - fwrite(rowPtr, 1, gWidth*3, f); - } - - fclose(f); - free(image); - - printf("Wrote %d by %d image file: %s\n", gWidth, gHeight, filename); -} - - - -/* - * Print message describing command line parameters. - */ -static void -Usage(const char *appName) -{ - printf("Usage:\n"); - printf(" %s width height imgfile\n", appName); - printf("Where imgfile is a ppm file\n"); -} - - - -int -main(int argc, char *argv[]) -{ - if (argc!=4) { - Usage(argv[0]); - } - else { - int width = atoi(argv[1]); - int height = atoi(argv[2]); - char *fileName = argv[3]; - if (width<=0) { - printf("Error: width parameter must be at least 1.\n"); - return 1; - } - if (height<=0) { - printf("Error: height parameter must be at least 1.\n"); - return 1; - } - if (!Setup(width, height)) { - return 1; - } - InitGL(); - Render(); - WriteFile(fileName); - DestroyPbuffer(gDpy, gScreen, gPBuffer); - } - return 0; -} - diff --git a/progs/xdemos/pbinfo.c b/progs/xdemos/pbinfo.c deleted file mode 100644 index edfa9c1f3b0..00000000000 --- a/progs/xdemos/pbinfo.c +++ /dev/null @@ -1,107 +0,0 @@ - -/* - * Print list of fbconfigs and test each to see if a pbuffer can be created - * for that config. - * - * Brian Paul - * April 1997 - * Updated on 5 October 2002. - */ - - -#include <X11/Xlib.h> -#include <stdio.h> -#include <string.h> -#include "pbutil.h" - - - - -static void -PrintConfigs(Display *dpy, int screen, Bool horizFormat) -{ - FBCONFIG *fbConfigs; - int nConfigs; - int i; - - fbConfigs = GetAllFBConfigs(dpy, screen, &nConfigs); - if (!nConfigs || !fbConfigs) { - printf("Error: glxGetFBConfigs failed\n"); - XFree(fbConfigs); - return; - } - - printf("Number of fbconfigs: %d\n", nConfigs); - - if (horizFormat) { - printf(" ID VisualType Depth Lvl RGB CI DB Stereo R G B A"); - printf(" Z S AR AG AB AA MSbufs MSnum Pbuffer Float\n"); - } - - /* Print config info */ - for (i = 0; i < nConfigs; i++) { - PrintFBConfigInfo(dpy, screen, fbConfigs[i], horizFormat); - } - - /* free the list */ - XFree(fbConfigs); -} - - - -static void -PrintUsage(void) -{ - printf("Options:\n"); - printf(" -display <display-name> specify X display name\n"); - printf(" -t print in tabular format\n"); - printf(" -v print in verbose format\n"); - printf(" -help print this information\n"); -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - int scrn; - char *dpyName = NULL; - Bool horizFormat = True; - int i; - - for (i=1; i<argc; i++) { - if (strcmp(argv[i],"-display")==0) { - if (i+1<argc) { - dpyName = argv[i+1]; - i++; - } - } - else if (strcmp(argv[i],"-t")==0) { - /* tabular format */ - horizFormat = True; - } - else if (strcmp(argv[i],"-v")==0) { - /* verbose format */ - horizFormat = False; - } - else if (strcmp(argv[i],"-help")==0) { - PrintUsage(); - return 0; - } - else { - printf("Unknown option: %s\n", argv[i]); - } - } - - dpy = XOpenDisplay(dpyName); - - if (!dpy) { - printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); - return 1; - } - - scrn = DefaultScreen(dpy); - PrintConfigs(dpy, scrn, horizFormat); - XCloseDisplay(dpy); - return 0; -} diff --git a/progs/xdemos/pbutil.c b/progs/xdemos/pbutil.c deleted file mode 100644 index ce133d012dc..00000000000 --- a/progs/xdemos/pbutil.c +++ /dev/null @@ -1,446 +0,0 @@ - -/* - * OpenGL pbuffers utility functions. - * - * Brian Paul - * Original code: April 1997 - * Updated on 5 October 2002 - * Updated again on 3 January 2005 to use GLX 1.3 functions in preference - * to the GLX_SGIX_fbconfig/pbuffer extensions. - */ - -#include <stdio.h> -#include <string.h> -#include "pbutil.h" - - -/** - * Test if we pixel buffers are available for a particular X screen. - * Input: dpy - the X display - * screen - screen number - * Return: 0 = fbconfigs not available. - * 1 = fbconfigs are available via GLX 1.3. - * 2 = fbconfigs and pbuffers are available via GLX_SGIX_fbconfig - */ -int -QueryFBConfig(Display *dpy, int screen) -{ -#if defined(GLX_VERSION_1_3) - { - /* GLX 1.3 supports pbuffers */ - int glxVersionMajor, glxVersionMinor; - if (!glXQueryVersion(dpy, &glxVersionMajor, &glxVersionMinor)) { - /* GLX not available! */ - return 0; - } - if (glxVersionMajor * 100 + glxVersionMinor >= 103) { - return 1; - } - /* fall-through */ - } -#endif - - /* Try the SGIX extensions */ - { - char *extensions; - extensions = (char *) glXQueryServerString(dpy, screen, GLX_EXTENSIONS); - if (extensions && strstr(extensions,"GLX_SGIX_fbconfig")) { - return 2; - } - } - - return 0; -} - -/** - * Test if we pixel buffers are available for a particular X screen. - * Input: dpy - the X display - * screen - screen number - * Return: 0 = pixel buffers not available. - * 1 = pixel buffers are available via GLX 1.3. - * 2 = pixel buffers are available via GLX_SGIX_fbconfig/pbuffer. - */ -int -QueryPbuffers(Display *dpy, int screen) -{ - int ret; - - ret = QueryFBConfig(dpy, screen); - if (ret == 2) { - char *extensions; - extensions = (char *) glXQueryServerString(dpy, screen, GLX_EXTENSIONS); - if (extensions && strstr(extensions, "GLX_SGIX_pbuffer")) - return 2; - else - return 0; - } - else - return ret; -} - -FBCONFIG * -ChooseFBConfig(Display *dpy, int screen, const int attribs[], int *nConfigs) -{ - int fbcSupport = QueryPbuffers(dpy, screen); -#if defined(GLX_VERSION_1_3) - if (fbcSupport == 1) { - return glXChooseFBConfig(dpy, screen, attribs, nConfigs); - } -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (fbcSupport == 2) { - return glXChooseFBConfigSGIX(dpy, screen, (int *) attribs, nConfigs); - } -#endif - return NULL; -} - - -FBCONFIG * -GetAllFBConfigs(Display *dpy, int screen, int *nConfigs) -{ - int fbcSupport = QueryFBConfig(dpy, screen); -#if defined(GLX_VERSION_1_3) - if (fbcSupport == 1) { - return glXGetFBConfigs(dpy, screen, nConfigs); - } -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (fbcSupport == 2) { - /* The GLX_SGIX_fbconfig extensions says to pass NULL to get list - * of all available configurations. - */ - return glXChooseFBConfigSGIX(dpy, screen, NULL, nConfigs); - } -#endif - return NULL; -} - - -XVisualInfo * -GetVisualFromFBConfig(Display *dpy, int screen, FBCONFIG config) -{ - int fbcSupport = QueryFBConfig(dpy, screen); -#if defined(GLX_VERSION_1_3) - if (fbcSupport == 1) { - return glXGetVisualFromFBConfig(dpy, config); - } -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (fbcSupport == 2) { - return glXGetVisualFromFBConfigSGIX(dpy, config); - } -#endif - return NULL; -} - - -/** - * Either use glXGetFBConfigAttrib() or glXGetFBConfigAttribSGIX() - * to query an fbconfig attribute. - */ -static int -GetFBConfigAttrib(Display *dpy, int screen, -#if defined(GLX_VERSION_1_3) - const GLXFBConfig config, -#elif defined(GLX_SGIX_fbconfig) - const GLXFBConfigSGIX config, -#endif - int attrib - ) -{ - int fbcSupport = QueryFBConfig(dpy, screen); - int value = 0; - -#if defined(GLX_VERSION_1_3) - if (fbcSupport == 1) { - /* ok */ - if (glXGetFBConfigAttrib(dpy, config, attrib, &value) != 0) { - value = 0; - } - return value; - } - /* fall-through */ -#endif - -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (fbcSupport == 2) { - if (glXGetFBConfigAttribSGIX(dpy, config, attrib, &value) != 0) { - value = 0; - } - return value; - } -#endif - - return value; -} - - - -/** - * Print parameters for a GLXFBConfig to stdout. - * Input: dpy - the X display - * screen - the X screen number - * fbConfig - the fbconfig handle - * horizFormat - if true, print in horizontal format - */ -void -PrintFBConfigInfo(Display *dpy, int screen, FBCONFIG config, Bool horizFormat) -{ - PBUFFER pBuffer; - int width=2, height=2; - int bufferSize, level, doubleBuffer, stereo, auxBuffers; - int redSize, greenSize, blueSize, alphaSize; - int depthSize, stencilSize; - int accumRedSize, accumBlueSize, accumGreenSize, accumAlphaSize; - int sampleBuffers, samples; - int drawableType, renderType, xRenderable, xVisual, id; - int maxWidth, maxHeight, maxPixels; - int optWidth, optHeight; - int floatComponents = 0; - - /* do queries using the GLX 1.3 tokens (same as the SGIX tokens) */ - bufferSize = GetFBConfigAttrib(dpy, screen, config, GLX_BUFFER_SIZE); - level = GetFBConfigAttrib(dpy, screen, config, GLX_LEVEL); - doubleBuffer = GetFBConfigAttrib(dpy, screen, config, GLX_DOUBLEBUFFER); - stereo = GetFBConfigAttrib(dpy, screen, config, GLX_STEREO); - auxBuffers = GetFBConfigAttrib(dpy, screen, config, GLX_AUX_BUFFERS); - redSize = GetFBConfigAttrib(dpy, screen, config, GLX_RED_SIZE); - greenSize = GetFBConfigAttrib(dpy, screen, config, GLX_GREEN_SIZE); - blueSize = GetFBConfigAttrib(dpy, screen, config, GLX_BLUE_SIZE); - alphaSize = GetFBConfigAttrib(dpy, screen, config, GLX_ALPHA_SIZE); - depthSize = GetFBConfigAttrib(dpy, screen, config, GLX_DEPTH_SIZE); - stencilSize = GetFBConfigAttrib(dpy, screen, config, GLX_STENCIL_SIZE); - accumRedSize = GetFBConfigAttrib(dpy, screen, config, GLX_ACCUM_RED_SIZE); - accumGreenSize = GetFBConfigAttrib(dpy, screen, config, GLX_ACCUM_GREEN_SIZE); - accumBlueSize = GetFBConfigAttrib(dpy, screen, config, GLX_ACCUM_BLUE_SIZE); - accumAlphaSize = GetFBConfigAttrib(dpy, screen, config, GLX_ACCUM_ALPHA_SIZE); - sampleBuffers = GetFBConfigAttrib(dpy, screen, config, GLX_SAMPLE_BUFFERS); - samples = GetFBConfigAttrib(dpy, screen, config, GLX_SAMPLES); - drawableType = GetFBConfigAttrib(dpy, screen, config, GLX_DRAWABLE_TYPE); - renderType = GetFBConfigAttrib(dpy, screen, config, GLX_RENDER_TYPE); - xRenderable = GetFBConfigAttrib(dpy, screen, config, GLX_X_RENDERABLE); - xVisual = GetFBConfigAttrib(dpy, screen, config, GLX_X_VISUAL_TYPE); - if (!xRenderable || !(drawableType & GLX_WINDOW_BIT_SGIX)) - xVisual = -1; - - id = GetFBConfigAttrib(dpy, screen, config, GLX_FBCONFIG_ID); - maxWidth = GetFBConfigAttrib(dpy, screen, config, GLX_MAX_PBUFFER_WIDTH); - maxHeight = GetFBConfigAttrib(dpy, screen, config, GLX_MAX_PBUFFER_HEIGHT); - maxPixels = GetFBConfigAttrib(dpy, screen, config, GLX_MAX_PBUFFER_PIXELS); -#if defined(GLX_SGIX_pbuffer) - optWidth = GetFBConfigAttrib(dpy, screen, config, GLX_OPTIMAL_PBUFFER_WIDTH_SGIX); - optHeight = GetFBConfigAttrib(dpy, screen, config, GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX); -#else - optWidth = optHeight = 0; -#endif -#if defined(GLX_NV_float_buffer) - floatComponents = GetFBConfigAttrib(dpy, screen, config, GLX_FLOAT_COMPONENTS_NV); -#endif - - /* See if we can create a pbuffer with this config */ - pBuffer = CreatePbuffer(dpy, screen, config, width, height, False, False); - - if (horizFormat) { - printf("0x%-9x ", id); - if (xVisual==GLX_STATIC_GRAY) printf("StaticGray "); - else if (xVisual==GLX_GRAY_SCALE) printf("GrayScale "); - else if (xVisual==GLX_STATIC_COLOR) printf("StaticColor "); - else if (xVisual==GLX_PSEUDO_COLOR) printf("PseudoColor "); - else if (xVisual==GLX_TRUE_COLOR) printf("TrueColor "); - else if (xVisual==GLX_DIRECT_COLOR) printf("DirectColor "); - else printf(" -none- "); - printf(" %3d %3d %s %s %s %2s ", bufferSize, level, - (renderType & GLX_RGBA_BIT_SGIX) ? "y" : ".", - (renderType & GLX_COLOR_INDEX_BIT_SGIX) ? "y" : ".", - doubleBuffer ? "y" : ".", - stereo ? "y" : "."); - printf("%2d %2d %2d %2d ", redSize, greenSize, blueSize, alphaSize); - printf("%2d %2d ", depthSize, stencilSize); - printf("%2d %2d %2d %2d", accumRedSize, accumGreenSize, accumBlueSize, - accumAlphaSize); - printf(" %2d %2d", sampleBuffers, samples); - printf(" %s %c", pBuffer ? "y" : ".", - ".y"[floatComponents]); - printf("\n"); - } - else { - printf("Id 0x%x\n", id); - printf(" Buffer Size: %d\n", bufferSize); - printf(" Level: %d\n", level); - printf(" Double Buffer: %s\n", doubleBuffer ? "yes" : "no"); - printf(" Stereo: %s\n", stereo ? "yes" : "no"); - printf(" Aux Buffers: %d\n", auxBuffers); - printf(" Red Size: %d\n", redSize); - printf(" Green Size: %d\n", greenSize); - printf(" Blue Size: %d\n", blueSize); - printf(" Alpha Size: %d\n", alphaSize); - printf(" Depth Size: %d\n", depthSize); - printf(" Stencil Size: %d\n", stencilSize); - printf(" Accum Red Size: %d\n", accumRedSize); - printf(" Accum Green Size: %d\n", accumGreenSize); - printf(" Accum Blue Size: %d\n", accumBlueSize); - printf(" Accum Alpha Size: %d\n", accumAlphaSize); - printf(" Sample Buffers: %d\n", sampleBuffers); - printf(" Samples/Pixel: %d\n", samples); - printf(" Drawable Types: "); - if (drawableType & GLX_WINDOW_BIT) printf("Window "); - if (drawableType & GLX_PIXMAP_BIT) printf("Pixmap "); - if (drawableType & GLX_PBUFFER_BIT) printf("PBuffer"); - printf("\n"); - printf(" Render Types: "); - if (renderType & GLX_RGBA_BIT_SGIX) printf("RGBA "); - if (renderType & GLX_COLOR_INDEX_BIT_SGIX) printf("CI "); - printf("\n"); - printf(" X Renderable: %s\n", xRenderable ? "yes" : "no"); - - printf(" Pbuffer: %s\n", pBuffer ? "yes" : "no"); - printf(" Max Pbuffer width: %d\n", maxWidth); - printf(" Max Pbuffer height: %d\n", maxHeight); - printf(" Max Pbuffer pixels: %d\n", maxPixels); - printf(" Optimum Pbuffer width: %d\n", optWidth); - printf(" Optimum Pbuffer height: %d\n", optHeight); - - printf(" Float Components: %s\n", floatComponents ? "yes" : "no"); - } - - if (pBuffer) { - DestroyPbuffer(dpy, screen, pBuffer); - } -} - - - -GLXContext -CreateContext(Display *dpy, int screen, FBCONFIG config) -{ - int fbcSupport = QueryFBConfig(dpy, screen); -#if defined(GLX_VERSION_1_3) - if (fbcSupport == 1) { - /* GLX 1.3 */ - GLXContext c; - c = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, True); - if (!c) { - /* try indirect */ - c = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, False); - } - return c; - } -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (fbcSupport == 2) { - GLXContext c; - c = glXCreateContextWithConfigSGIX(dpy, config, GLX_RGBA_TYPE_SGIX, NULL, True); - if (!c) { - c = glXCreateContextWithConfigSGIX(dpy, config, GLX_RGBA_TYPE_SGIX, NULL, False); - } - return c; - } -#endif - return 0; -} - - -void -DestroyContext(Display *dpy, GLXContext ctx) -{ - glXDestroyContext(dpy, ctx); -} - - -/* This is only used by CreatePbuffer() */ -static int XErrorFlag = 0; -static int HandleXError(Display *dpy, XErrorEvent *event) -{ - XErrorFlag = 1; - return 0; -} - - -/** - * Create a Pbuffer. Use an X error handler to deal with potential - * BadAlloc errors. - * - * Input: dpy - the X display - * fbConfig - an FBConfig as returned by glXChooseFBConfigSGIX(). - * width, height - size of pixel buffer to request, in pixels. - * pbAttribs - list of optional pixel buffer attributes - * Return: a Pbuffer or None. - */ -PBUFFER -CreatePbuffer(Display *dpy, int screen, FBCONFIG config, - int width, int height, Bool largest, Bool preserve) -{ - int (*oldHandler)(Display *, XErrorEvent *); - PBUFFER pBuffer = None; - int pbSupport = QueryPbuffers(dpy, screen); - - /* Catch X protocol errors with our own error handler */ - oldHandler = XSetErrorHandler(HandleXError); - XErrorFlag = 0; - -#if defined(GLX_VERSION_1_3) - if (pbSupport == 1) { - /* GLX 1.3 */ - int attribs[100], i = 0; - attribs[i++] = GLX_PBUFFER_WIDTH; - attribs[i++] = width; - attribs[i++] = GLX_PBUFFER_HEIGHT; - attribs[i++] = height; - attribs[i++] = GLX_PRESERVED_CONTENTS; - attribs[i++] = preserve; - attribs[i++] = GLX_LARGEST_PBUFFER; - attribs[i++] = largest; - attribs[i++] = 0; - pBuffer = glXCreatePbuffer(dpy, config, attribs); - } - else -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (pbSupport == 2) { - int attribs[100], i = 0; - attribs[i++] = GLX_PRESERVED_CONTENTS; - attribs[i++] = preserve; - attribs[i++] = GLX_LARGEST_PBUFFER; - attribs[i++] = largest; - attribs[i++] = 0; - pBuffer = glXCreateGLXPbufferSGIX(dpy, config, width, height, attribs); - } - else -#endif - { - pBuffer = None; - } - - XSync(dpy, False); - /* Restore original X error handler */ - (void) XSetErrorHandler(oldHandler); - - /* Return pbuffer (may be None) */ - if (!XErrorFlag && pBuffer != None) { - /*printf("config %d worked!\n", i);*/ - return pBuffer; - } - else { - return None; - } -} - - -void -DestroyPbuffer(Display *dpy, int screen, PBUFFER pbuffer) -{ - int pbSupport = QueryPbuffers(dpy, screen); -#if defined(GLX_VERSION_1_3) - if (pbSupport == 1) { - glXDestroyPbuffer(dpy, pbuffer); - return; - } -#endif -#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) - if (pbSupport == 2) { - glXDestroyGLXPbufferSGIX(dpy, pbuffer); - return; - } -#endif -} diff --git a/progs/xdemos/pbutil.h b/progs/xdemos/pbutil.h deleted file mode 100644 index d420522ff01..00000000000 --- a/progs/xdemos/pbutil.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * OpenGL pbuffers utility functions. - * - * Brian Paul - * April 1997 - */ - - -#ifndef PBUTIL_H -#define PBUTIL_H - - -#define GLX_GLXEXT_PROTOTYPES -#include <GL/glx.h> - - -#if defined(GLX_VERSION_1_3) -#define PBUFFER GLXPbuffer -#define FBCONFIG GLXFBConfig -#elif defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer) -#define PBUFFER GLXPbufferSGIX -#define FBCONFIG GLXFBConfigSGIX -#else -#define PBUFFER int -#define FBCONFIG int -#endif - - -extern int -QueryFBConfig(Display *dpy, int screen); - -extern int -QueryPbuffers(Display *dpy, int screen); - - -extern void -PrintFBConfigInfo(Display *dpy, int screen, FBCONFIG config, Bool horizFormat); - - -extern FBCONFIG * -ChooseFBConfig(Display *dpy, int screen, const int attribs[], int *nConfigs); - - -extern FBCONFIG * -GetAllFBConfigs(Display *dpy, int screen, int *nConfigs); - - -extern XVisualInfo * -GetVisualFromFBConfig(Display *dpy, int screen, FBCONFIG config); - - -extern GLXContext -CreateContext(Display *dpy, int screen, FBCONFIG config); - - -extern void -DestroyContext(Display *dpy, GLXContext ctx); - - -extern PBUFFER -CreatePbuffer(Display *dpy, int screen, FBCONFIG config, - int width, int height, Bool preserve, Bool largest); - - -extern void -DestroyPbuffer(Display *dpy, int screen, PBUFFER pbuffer); - - -#endif /*PBUTIL_H*/ diff --git a/progs/xdemos/shape.c b/progs/xdemos/shape.c deleted file mode 100644 index 5ff09708be6..00000000000 --- a/progs/xdemos/shape.c +++ /dev/null @@ -1,393 +0,0 @@ - -/* - * Example of using the X "shape" extension with OpenGL: render a spinning - * cube inside of a non-rectangular window. - * - * Press ESC to exit. Press up/down to change window shape. - * - * To compile add "shape" to the PROGS list in Makefile. - * - * Brian Paul - * June 16, 1997 - * - * This program is in the public domain. - */ - - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/time.h> -#include <time.h> -#include <unistd.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/keysym.h> -#include <X11/extensions/shape.h> -#include <GL/glx.h> - -#ifndef PI -#define PI 3.1415926 -#endif - - -static int Width=500, Height=500; - -static float Xangle = 0.0, Yangle = 0.0; -static int Sides = 5; -static int MinSides = 3; -static int MaxSides = 20; - - -/* 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; -} - - -/* - * Draw the OpenGL stuff and do a SwapBuffers. - */ -static void display(Display *dpy, Window win) -{ - float scale = 1.7; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - - glScalef(scale, scale, scale); - glRotatef(Xangle, 1.0, 0.0, 0.0); - glRotatef(Yangle, 0.0, 1.0, 0.0); - - /* - * wireframe box - */ - glColor3f(1.0, 1.0, 1.0); - glBegin(GL_LINE_LOOP); - glVertex3f(-1.0, -1.0, -1.0); - glVertex3f( 1.0, -1.0, -1.0); - glVertex3f( 1.0, 1.0, -1.0); - glVertex3f(-1.0, 1.0, -1.0); - glEnd(); - - glBegin(GL_LINE_LOOP); - glVertex3f(-1.0, -1.0, 1.0); - glVertex3f( 1.0, -1.0, 1.0); - glVertex3f( 1.0, 1.0, 1.0); - glVertex3f(-1.0, 1.0, 1.0); - glEnd(); - - glBegin(GL_LINES); - glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); - glVertex3f( 1.0, -1.0, -1.0); glVertex3f( 1.0, -1.0, 1.0); - glVertex3f( 1.0, 1.0, -1.0); glVertex3f( 1.0, 1.0, 1.0); - glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); - glEnd(); - - /* - * Solid box - */ - glPushMatrix(); - glScalef(0.75, 0.75, 0.75); - - glColor3f(1, 0, 0); - glBegin(GL_POLYGON); - glVertex3f(1, -1, -1); - glVertex3f(1, 1, -1); - glVertex3f(1, 1, 1); - glVertex3f(1, -1, 1); - glEnd(); - - glColor3f(0, 1, 1); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, -1); - glVertex3f(-1, 1, -1); - glVertex3f(-1, 1, 1); - glVertex3f(-1, -1, 1); - glEnd(); - - glColor3f(0, 1, 0); - glBegin(GL_POLYGON); - glVertex3f(-1, 1, -1); - glVertex3f( 1, 1, -1); - glVertex3f( 1, 1, 1); - glVertex3f(-1, 1, 1); - glEnd(); - - glColor3f(1, 0, 1); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, -1); - glVertex3f( 1, -1, -1); - glVertex3f( 1, -1, 1); - glVertex3f(-1, -1, 1); - glEnd(); - - glColor3f(0, 0, 1); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, 1); - glVertex3f( 1, -1, 1); - glVertex3f( 1, 1, 1); - glVertex3f(-1, 1, 1); - glEnd(); - - glColor3f(1, 1, 0); - glBegin(GL_POLYGON); - glVertex3f(-1, -1, -1); - glVertex3f( 1, -1, -1); - glVertex3f( 1, 1, -1); - glVertex3f(-1, 1, -1); - glEnd(); - glPopMatrix(); - - - glPopMatrix(); - - glXSwapBuffers(dpy, win); -} - - -/* - * This is called when we have to recompute the window shape bitmask. - * We just generate an n-sided regular polygon here but any other shape - * would be possible. - */ -static void make_shape_mask(Display *dpy, Window win, int width, int height, - int sides) -{ - Pixmap shapeMask; - XGCValues xgcv; - GC gc; - - /* allocate 1-bit deep pixmap and a GC */ - shapeMask = XCreatePixmap(dpy, win, width, height, 1); - gc = XCreateGC(dpy, shapeMask, 0, &xgcv); - - /* clear shapeMask to zeros */ - XSetForeground(dpy, gc, 0); - XFillRectangle(dpy, shapeMask, gc, 0, 0, width, height); - - /* draw mask */ - XSetForeground(dpy, gc, 1); - { - int cx = width / 2; - int cy = height / 2; - float angle = 0.0; - float step = 2.0 * PI / sides; - float radius = width / 2; - int i; - XPoint points[100]; - for (i=0;i<sides;i++) { - int x = cx + radius * sin(angle); - int y = cy - radius * cos(angle); - points[i].x = x; - points[i].y = y; - angle += step; - } - XFillPolygon(dpy, shapeMask, gc, points, sides, Convex, CoordModeOrigin); - } - - /* This is the only SHAPE extension call- simple! */ - XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, shapeMask, ShapeSet); - - XFreeGC(dpy, gc); - XFreePixmap(dpy, shapeMask); -} - - -/* - * Called when window is resized. Do OpenGL viewport and projection stuff. - */ -static void reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 3.0, 20.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -10.0); - - glEnable(GL_DEPTH_TEST); -} - - -/* - * Process X events. - */ -static void event_loop(Display *dpy, Window win) -{ - while (1) { - XEvent event; - if (XPending(dpy)) { - XNextEvent(dpy, &event); - switch (event.type) { - case Expose: - display(dpy, event.xexpose.window); - break; - case ConfigureNotify: - Width = event.xconfigure.width; - Height = event.xconfigure.height, - make_shape_mask(dpy, win, Width, Height, Sides); - reshape(Width, Height); - break; - case KeyPress: - { - char buf[100]; - KeySym keySym; - XComposeStatus stat; - XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); - switch (keySym) { - case XK_Escape: - exit(0); - break; - case XK_Up: - Sides++; - if (Sides>MaxSides) Sides = MaxSides; - make_shape_mask(dpy, win, Width, Height, Sides); - break; - case XK_Down: - Sides--; - if (Sides<MinSides) Sides = MinSides; - make_shape_mask(dpy, win, Width, Height, Sides); - break; - } - } - break; - default: - ;; - } - } - else { - static double t0 = -1.0; - double dt, t = current_time(); - if (t0 < 0.0) - t0 = t; - dt = t - t0; - Xangle += 90.0 * dt; /* 90 degrees per second */ - Yangle += 70.0 * dt; - t0 = t; - display(dpy, win); - } - } -} - - -/* - * Allocate a "nice" colormap. This could be better (HP-CR support, etc). - */ -static Colormap alloc_colormap(Display *dpy, Window parent, Visual *vis) -{ - Screen *scr = DefaultScreenOfDisplay(dpy); - int scrnum = DefaultScreen(dpy); - - if (MaxCmapsOfScreen(scr)==1 && vis==DefaultVisual(dpy, scrnum)) { - /* The window and root are of the same visual type so */ - /* share the root colormap. */ - return DefaultColormap(dpy, scrnum); - } - else { - return XCreateColormap(dpy, parent, vis, AllocNone); - } -} - - -int main(int argc, char *argv[]) -{ - static int glAttribs[] = { - GLX_DOUBLEBUFFER, - GLX_RGBA, - GLX_DEPTH_SIZE, 1, - None - }; - Display *dpy; - XVisualInfo *visInfo; - int scrn; - Window root; - Colormap cmap; - Window win; - XSetWindowAttributes winAttribs; - unsigned long winAttribsMask; - GLXContext glCtx; - int ignore; - const char *name = "OpenGL in a Shaped Window"; - - dpy = XOpenDisplay(NULL); - if (!dpy) { - fprintf(stderr, "Couldn't open default display\n"); - return 1; - } - - /* check that we can use the shape extension */ - if (!XQueryExtension(dpy, "SHAPE", &ignore, &ignore, &ignore )) { - fprintf(stderr, "Display doesn't support shape extension\n"); - return 1; - } - - scrn = DefaultScreen(dpy); - - root = RootWindow(dpy, scrn); - - visInfo = glXChooseVisual(dpy, scrn, glAttribs); - if (!visInfo) { - fprintf(stderr, "Couldn't get RGB, DB, Z visual\n"); - return 1; - } - - glCtx = glXCreateContext(dpy, visInfo, 0, True); - if (!glCtx) { - fprintf(stderr, "Couldn't create GL context\n"); - return 1; - } - - cmap = alloc_colormap(dpy, root, visInfo->visual); - if (!cmap) { - fprintf(stderr, "Couln't create colormap\n"); - return 1; - } - - winAttribs.border_pixel = 0; - winAttribs.colormap = cmap; - winAttribs.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; - winAttribsMask = CWBorderPixel | CWColormap | CWEventMask; - win = XCreateWindow(dpy, root, 0, 0, Width, Height, 0, - visInfo->depth, InputOutput, - visInfo->visual, - winAttribsMask, &winAttribs); - - { - XSizeHints sizehints; - /* - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - */ - sizehints.flags = 0; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, name, name, - None, (char **)NULL, 0, &sizehints); - } - - - XMapWindow(dpy, win); - - glXMakeCurrent(dpy, win, glCtx); - - printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); - printf("Press ESC to exit.\n"); - printf("Press up/down to change window shape.\n"); - - event_loop(dpy, win); - - return 0; -} diff --git a/progs/xdemos/sharedtex.c b/progs/xdemos/sharedtex.c deleted file mode 100644 index 81703fe0e7d..00000000000 --- a/progs/xdemos/sharedtex.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Test sharing of texture objects by two rendering contexts. - * In particular, test that changing a texture object in one context - * effects the texture in the second context. - * - * Brian Paul - * 30 Apr 2008 - * - * Copyright (C) 2008 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. - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <X11/keysym.h> - - -#define MAX_CONTEXTS 2 - -#define TEX_SIZE 32 - -static const char *DisplayName = NULL; -static Display *Dpy; -static XVisualInfo *VisInfo; -static Window Win; -static GLXContext Contexts[MAX_CONTEXTS]; -static int WinWidth = 300, WinHeight = 300; - -static int DrawContext = 0, TexContext = 1; - -static GLuint TexObj = 0; -static GLboolean NewTexture = GL_FALSE; - - -static void -Error(const char *msg) -{ - fprintf(stderr, "sharedtex error: %s\n", msg); - exit(1); -} - - -static void -CreateWindow(const char *name) -{ - 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; - int xpos = 0, ypos = 0; - static int n = 0; - - scrnum = DefaultScreen(Dpy); - root = RootWindow(Dpy, scrnum); - - VisInfo = glXChooseVisual(Dpy, scrnum, attrib); - if (!VisInfo) { - Error("Unable to find RGB, double-buffered visual"); - } - - /* window attributes */ - xpos = (n % 10) * 100; - ypos = (n / 10) * 100; - n++; - - 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, xpos, ypos, WinWidth, WinHeight, - 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 = WinWidth; - sizehints.height = WinHeight; - sizehints.flags = USSize | USPosition; - XSetNormalHints(Dpy, Win, &sizehints); - XSetStandardProperties(Dpy, Win, name, name, - None, (char **)NULL, 0, &sizehints); - } - - XMapWindow(Dpy, Win); -} - - -/** - * Change texture image, using TexContext - */ -static void -ModifyTexture(void) -{ - GLuint tex[TEX_SIZE][TEX_SIZE]; - GLuint c0, c1; - int i, j; - - if (Win && !glXMakeCurrent(Dpy, Win, Contexts[TexContext])) { - Error("glXMakeCurrent failed"); - } - - /* choose two random colors */ - c0 = rand() & 0xffffffff; - c1 = rand() & 0xffffffff; - - for (i = 0; i < TEX_SIZE; i++) { - for (j = 0; j < TEX_SIZE; j++) { - if (((i / 4) ^ (j / 4)) & 1) { - tex[i][j] = c0; - } - else { - tex[i][j] = c1; - } - } - } - - glBindTexture(GL_TEXTURE_2D, TexObj); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, - GL_RGBA, GL_UNSIGNED_BYTE, tex); - - NewTexture = GL_TRUE; -} - - -static void -InitContext(void) -{ - glGenTextures(1, &TexObj); - assert(TexObj); - glBindTexture(GL_TEXTURE_2D, TexObj); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glEnable(GL_TEXTURE_2D); - - printf("GL_RENDERER = %s\n", (char*) glGetString(GL_RENDERER)); -} - - -static void -Setup(void) -{ - int i; - - Dpy = XOpenDisplay(DisplayName); - if (!Dpy) { - Error("Unable to open display"); - } - - CreateWindow("sharedtex"); - - for (i = 0; i < MAX_CONTEXTS; i++) { - GLXContext share = i > 0 ? Contexts[0] : 0; - - Contexts[i] = glXCreateContext(Dpy, VisInfo, share, True); - if (!Contexts[i]) { - Error("Unable to create GLX context"); - } - - if (!glXMakeCurrent(Dpy, Win, Contexts[i])) { - Error("glXMakeCurrent failed"); - } - - InitContext(); - } - - ModifyTexture(); -} - - -/** - * Redraw window, using DrawContext - */ -static void -Redraw(void) -{ - static float rot = 0.0; - float ar; - - rot += 1.0; - - if (Win && !glXMakeCurrent(Dpy, Win, Contexts[DrawContext])) { - Error("glXMakeCurrent failed"); - } - - glViewport(0, 0, WinWidth, WinHeight); - ar = (float) WinWidth / (float) WinHeight; - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - - glShadeModel(GL_FLAT); - glClearColor(0.5, 0.5, 0.5, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - glRotatef(rot, 0, 0, 1); - glScalef(0.7, 0.7, 0.7); - - if (NewTexture) { - /* rebind to get new contents */ - glBindTexture(GL_TEXTURE_2D, TexObj); - NewTexture = GL_FALSE; - } - - /* draw textured quad */ - glBegin(GL_POLYGON); - glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 ); - glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 ); - glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 ); - glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 ); - glEnd(); - - glPopMatrix(); - - if (Win) - glXSwapBuffers(Dpy, Win); -} - - -static void -EventLoop(void) -{ - while (1) { - while (XPending(Dpy) > 0) { - XEvent event; - XNextEvent(Dpy, &event); - - switch (event.type) { - case Expose: - Redraw(); - break; - case ConfigureNotify: - WinWidth = event.xconfigure.width; - WinHeight = event.xconfigure.height; - break; - case KeyPress: - { - char buf[100]; - KeySym keySym; - XComposeStatus stat; - XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); - switch (keySym) { - case XK_Escape: - exit(0); - break; - case XK_t: - case XK_T: - ModifyTexture(); - break; - default: - ; - } - } - Redraw(); - break; - default: - /*no-op*/ ; - } - } - - Redraw(); - usleep(10000); - } -} - - - - -int -main(int argc, char *argv[]) -{ - int i; - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-display") == 0 && i < argc) { - DisplayName = argv[i+1]; - i++; - } - } - - Setup(); - - printf("Press 't' to change texture image/colors\n"); - - EventLoop(); - - return 0; -} diff --git a/progs/xdemos/sharedtex_mt.c b/progs/xdemos/sharedtex_mt.c deleted file mode 100644 index a90903adeca..00000000000 --- a/progs/xdemos/sharedtex_mt.c +++ /dev/null @@ -1,490 +0,0 @@ -/* $Id: sharedtex.c,v 1.2 2002/01/16 14:32:46 joukj Exp $ */ - -/* - * Test sharing of display lists and texture objects between GLX contests. - * Brian Paul - * Summer 2000 - * - * - * 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. - * - * - * Modified 2009 for multithreading by Thomas Hellstrom. - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <pthread.h> -#include <X11/X.h> - -struct thread_init_arg { - int id; -}; - -struct window { - pthread_mutex_t drawMutex; - char DisplayName[1000]; - Display *Dpy; - Window Win; - GLXContext Context; - float Angle; - int Id; - XVisualInfo *visInfo; -}; - - -#define MAX_WINDOWS 20 -static struct window Windows[MAX_WINDOWS]; -static int NumWindows = 0; -static int terminate = 0; -static GLXContext gCtx; -static Display *gDpy; -static GLuint Textures[3]; - - - -static void -Error(const char *display, const char *msg) -{ - fprintf(stderr, "Error on display %s - %s\n", display, msg); - exit(1); -} - - -static int -initMainthread(Display *dpy, const char *displayName) -{ - int scrnum; - XVisualInfo *visinfo; - int attrib[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - None }; - - scrnum = DefaultScreen(dpy); - visinfo = glXChooseVisual(dpy, scrnum, attrib); - if (!visinfo) { - Error(displayName, "Unable to find RGB, double-buffered visual"); - return -1; - } - gCtx = glXCreateContext(dpy, visinfo, NULL, True); - if (!gCtx) { - Error(displayName, "Couldn't create GLX context"); - return -1; - } - return 0; -} - -static struct window * -AddWindow(Display *dpy, const char *displayName, int xpos, int ypos, - GLXContext sCtx) -{ - Window win; - GLXContext ctx; - int attrib[] = { 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; - XVisualInfo *visinfo; - int width = 300, height = 300; - - if (NumWindows >= MAX_WINDOWS) - return NULL; - - scrnum = DefaultScreen(dpy); - root = RootWindow(dpy, scrnum); - - visinfo = glXChooseVisual(dpy, scrnum, attrib); - if (!visinfo) { - Error(displayName, "Unable to find RGB, double-buffered visual"); - return NULL; - } - - /* 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 = CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow(dpy, root, xpos, ypos, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - if (!win) { - Error(displayName, "Couldn't create window"); - return NULL; - } - - { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, displayName, displayName, - None, (char **)NULL, 0, &sizehints); - } - - - ctx = glXCreateContext(dpy, visinfo, - sCtx ? sCtx : NULL, True); - - if (!ctx) { - Error(displayName, "Couldn't create GLX context"); - return NULL; - } - - XMapWindow(dpy, win); - - /* save the info for this window */ - { - static int id = 0; - struct window *h = &Windows[NumWindows]; - if (strlen(displayName) + 1 > sizeof(h->DisplayName)) { - Error(displayName, "string overflow"); - return NULL; - } - strcpy(h->DisplayName, displayName); - h->Dpy = dpy; - h->Win = win; - h->Context = ctx; - h->Angle = 0.0; - h->Id = id++; - h->visInfo = visinfo; - pthread_mutex_init(&h->drawMutex, NULL); - NumWindows++; - return &Windows[NumWindows-1]; - } -} - - -static void -InitGLstuff(void) - -{ - glGenTextures(3, Textures); - - /* setup first texture object */ - { - GLubyte image[16][16][4]; - GLint i, j; - glBindTexture(GL_TEXTURE_2D, Textures[0]); - - /* red/white checkerboard */ - for (i = 0; i < 16; i++) { - for (j = 0; j < 16; j++) { - if ((i ^ j) & 1) { - image[i][j][0] = 255; - image[i][j][1] = 255; - image[i][j][2] = 255; - image[i][j][3] = 255; - } - else { - image[i][j][0] = 255; - image[i][j][1] = 0; - image[i][j][2] = 0; - image[i][j][3] = 255; - } - } - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, - GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - - /* setup second texture object */ - { - GLubyte image[8][8][3]; - GLint i, j; - glBindTexture(GL_TEXTURE_2D, Textures[1]); - - /* green/yellow checkerboard */ - for (i = 0; i < 8; i++) { - for (j = 0; j < 8; j++) { - if ((i ^ j) & 1) { - image[i][j][0] = 0; - image[i][j][1] = 255; - image[i][j][2] = 0; - } - else { - image[i][j][0] = 255; - image[i][j][1] = 255; - image[i][j][2] = 0; - } - } - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 2); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, - GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - - /* setup second texture object */ - { - GLubyte image[4][4][3]; - GLint i, j; - glBindTexture(GL_TEXTURE_2D, Textures[2]); - - /* blue/gray checkerboard */ - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - if ((i ^ j) & 1) { - image[i][j][0] = 0; - image[i][j][1] = 0; - image[i][j][2] = 255; - } - else { - image[i][j][0] = 200; - image[i][j][1] = 200; - image[i][j][2] = 200; - } - } - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 2); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 4, 4, 0, GL_RGB, - GL_UNSIGNED_BYTE, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - - /* Now make the cube object display list */ - - 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)); -} - -static void -Redraw(struct window *h) -{ - pthread_mutex_lock(&h->drawMutex); - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed in Redraw"); - pthread_mutex_unlock(&h->drawMutex); - return; - } - - h->Angle += 1.0; - - glShadeModel(GL_FLAT); - glClearColor(0.25, 0.25, 0.25, 1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glEnable(GL_TEXTURE_2D); - glEnable(GL_DEPTH_TEST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - - glColor3f(1, 1, 1); - - glPushMatrix(); - if (h->Id == 0) - glRotatef(h->Angle, 0, 1, -1); - else if (h->Id == 1) - glRotatef(-(h->Angle), 0, 1, -1); - else if (h->Id == 2) - glRotatef(h->Angle, 0, 1, 1); - else if (h->Id == 3) - glRotatef(-(h->Angle), 0, 1, 1); - glBindTexture(GL_TEXTURE_2D, Textures[0]); - glBegin(GL_POLYGON); - 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(); - glBegin(GL_POLYGON); - 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(); - - glBindTexture(GL_TEXTURE_2D, Textures[1]); - glBegin(GL_POLYGON); - 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(); - glBegin(GL_POLYGON); - 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(); - - glBindTexture(GL_TEXTURE_2D, Textures[2]); - glBegin(GL_POLYGON); - 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(); - glBegin(GL_POLYGON); - 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(); - - glXSwapBuffers(h->Dpy, h->Win); - - if (!glXMakeCurrent(h->Dpy, None, NULL)) { - Error(h->DisplayName, "glXMakeCurrent failed in Redraw"); - } - pthread_mutex_unlock(&h->drawMutex); -} - -static void *threadRunner (void *arg) -{ - struct thread_init_arg *tia = (struct thread_init_arg *) arg; - struct window *win; - - win = &Windows[tia->id]; - - while(!terminate) { - usleep(1000); - Redraw(win); - } - - return NULL; -} - -static void -Resize(struct window *h, unsigned int width, unsigned int height) -{ - pthread_mutex_lock(&h->drawMutex); - - if (!glXMakeCurrent(h->Dpy, h->Win, h->Context)) { - Error(h->DisplayName, "glXMakeCurrent failed in Resize()"); - pthread_mutex_unlock(&h->drawMutex); - return; - } - - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1, 1, -1, 1, 2, 10); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, -4.5); - if (!glXMakeCurrent(h->Dpy, None, NULL)) { - Error(h->DisplayName, "glXMakeCurrent failed in Resize()"); - } - pthread_mutex_unlock(&h->drawMutex); -} - - -static void -EventLoop(void) -{ - while (1) { - int i; - XEvent event; - XNextEvent(gDpy, &event); - for (i = 0; i < NumWindows; i++) { - struct window *h = &Windows[i]; - if (event.xany.window == h->Win) { - switch (event.type) { - case Expose: - Redraw(h); - break; - case ConfigureNotify: - Resize(h, event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - terminate = 1; - return; - default: - /*no-op*/ ; - } - } - } - } -} - -int -main(int argc, char *argv[]) -{ - const char *dpyName = XDisplayName(NULL); - pthread_t t0, t1, t2, t3; - struct thread_init_arg tia0, tia1, tia2, tia3; - struct window *h0; - - XInitThreads(); - - gDpy = XOpenDisplay(dpyName); - if (!gDpy) { - Error(dpyName, "Unable to open display"); - return -1; - } - - if (initMainthread(gDpy, dpyName)) - return -1; - - /* four windows and contexts sharing display lists and texture objects */ - h0 = AddWindow(gDpy, dpyName, 10, 10, gCtx); - (void) AddWindow(gDpy, dpyName, 330, 10, gCtx); - (void) AddWindow(gDpy, dpyName, 10, 350, gCtx); - (void) AddWindow(gDpy, dpyName, 330, 350, gCtx); - - if (!glXMakeCurrent(gDpy, h0->Win, gCtx)) { - Error(dpyName, "glXMakeCurrent failed for init thread."); - return -1; - } - - InitGLstuff(); - - tia0.id = 0; - pthread_create(&t0, NULL, threadRunner, &tia0); - tia1.id = 1; - pthread_create(&t1, NULL, threadRunner, &tia1); - tia2.id = 2; - pthread_create(&t2, NULL, threadRunner, &tia2); - tia3.id = 3; - pthread_create(&t3, NULL, threadRunner, &tia3); - EventLoop(); - return 0; -} diff --git a/progs/xdemos/texture_from_pixmap.c b/progs/xdemos/texture_from_pixmap.c deleted file mode 100644 index 5f2fbc3f129..00000000000 --- a/progs/xdemos/texture_from_pixmap.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 7.1 - * - * Copyright (C) 1999-2007 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. - */ - - -/* - * Test the GLX_EXT_texture_from_pixmap extension - * Brian Paul - * 19 May 2007 - */ - - -#define GL_GLEXT_PROTOTYPES -#define GLX_GLXEXT_PROTOTYPES -#include <GL/gl.h> -#include <GL/glx.h> -#include <X11/keysym.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -static float top, bottom; - -static PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT_func = NULL; -static PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT_func = NULL; - - -static Display * -OpenDisplay(void) -{ - int screen; - Display *dpy; - const char *ext; - - dpy = XOpenDisplay(NULL); - if (!dpy) { - printf("Couldn't open default display!\n"); - exit(1); - } - - screen = DefaultScreen(dpy); - ext = glXQueryExtensionsString(dpy, screen); - if (!strstr(ext, "GLX_EXT_texture_from_pixmap")) { - fprintf(stderr, "GLX_EXT_texture_from_pixmap not supported.\n"); - exit(1); - } - - glXBindTexImageEXT_func = (PFNGLXBINDTEXIMAGEEXTPROC) - glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); - glXReleaseTexImageEXT_func = (PFNGLXRELEASETEXIMAGEEXTPROC) - glXGetProcAddress((GLubyte*) "glXReleaseTexImageEXT"); - - if (!glXBindTexImageEXT_func || !glXReleaseTexImageEXT_func) { - fprintf(stderr, "glXGetProcAddress failed!\n"); - exit(1); - } - - return dpy; -} - - -static GLXFBConfig -ChoosePixmapFBConfig(Display *display) -{ - int screen = DefaultScreen(display); - GLXFBConfig *fbconfigs; - int i, nfbconfigs = 0, value; - - fbconfigs = glXGetFBConfigs(display, screen, &nfbconfigs); - for (i = 0; i < nfbconfigs; i++) { - - glXGetFBConfigAttrib(display, fbconfigs[i], GLX_DRAWABLE_TYPE, &value); - if (!(value & GLX_PIXMAP_BIT)) - continue; - - glXGetFBConfigAttrib(display, fbconfigs[i], - GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value); - if (!(value & GLX_TEXTURE_2D_BIT_EXT)) - continue; - - glXGetFBConfigAttrib(display, fbconfigs[i], - GLX_BIND_TO_TEXTURE_RGBA_EXT, &value); - if (value == False) { - glXGetFBConfigAttrib(display, fbconfigs[i], - GLX_BIND_TO_TEXTURE_RGB_EXT, &value); - if (value == False) - continue; - } - - glXGetFBConfigAttrib(display, fbconfigs[i], - GLX_Y_INVERTED_EXT, &value); - if (value == True) { - top = 0.0f; - bottom = 1.0f; - } - else { - top = 1.0f; - bottom = 0.0f; - } - - break; - } - - if (i == nfbconfigs) { - printf("Unable to find FBconfig for texturing\n"); - exit(1); - } - - return fbconfigs[i]; -} - - -static GLXPixmap -CreatePixmap(Display *dpy, GLXFBConfig config, int w, int h, Pixmap *p) -{ - GLXPixmap gp; - const int pixmapAttribs[] = { - GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, - GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, - None - }; - Window root = RootWindow(dpy, 0); - - *p = XCreatePixmap(dpy, root, w, h, 24); - XSync(dpy, 0); - gp = glXCreatePixmap(dpy, config, *p, pixmapAttribs); - XSync(dpy, 0); - - return gp; -} - - -static void -DrawPixmapImage(Display *dpy, Pixmap pm, int w, int h) -{ - XGCValues gcvals; - GC gc; - - gcvals.background = 0; - gc = XCreateGC(dpy, pm, GCBackground, &gcvals); - - XSetForeground(dpy, gc, 0x0); - XFillRectangle(dpy, pm, gc, 0, 0, w, h); - - XSetForeground(dpy, gc, 0xff0000); - XFillRectangle(dpy, pm, gc, 0, 0, 50, 50); - - XSetForeground(dpy, gc, 0x00ff00); - XFillRectangle(dpy, pm, gc, w - 50, 0, 50, 50); - - XSetForeground(dpy, gc, 0x0000ff); - XFillRectangle(dpy, pm, gc, 0, h - 50, 50, 50); - - XSetForeground(dpy, gc, 0xffffff); - XFillRectangle(dpy, pm, gc, h - 50, h - 50, 50, 50); - - XSetForeground(dpy, gc, 0xffff00); - XSetLineAttributes(dpy, gc, 3, LineSolid, CapButt, JoinBevel); - XDrawLine(dpy, pm, gc, 0, 0, w, h); - XDrawLine(dpy, pm, gc, 0, h, w, 0); - - XFreeGC(dpy, gc); -} - - -static XVisualInfo * -ChooseWindowVisual(Display *dpy) -{ - int screen = DefaultScreen(dpy); - XVisualInfo *visinfo; - int attribs[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - None - }; - - visinfo = glXChooseVisual(dpy, screen, attribs); - if (!visinfo) { - printf("Unable to find RGB, double-buffered visual\n"); - exit(1); - } - - return visinfo; -} - - -static Window -CreateWindow(Display *dpy, XVisualInfo *visinfo, - int width, int height, const char *name) -{ - int screen = DefaultScreen(dpy); - Window win; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - - root = RootWindow(dpy, screen); - - /* 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, 0, 0, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - if (win) { - XSizeHints sizehints; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, name, name, - None, (char **)NULL, 0, &sizehints); - - XMapWindow(dpy, win); - } - return win; -} - - -static void -BindPixmapTexture(Display *dpy, GLXPixmap gp) -{ - GLuint texture; - - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - - glXBindTexImageEXT_func(dpy, gp, GLX_FRONT_LEFT_EXT, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glEnable(GL_TEXTURE_2D); - /* - glXReleaseTexImageEXT_func(display, glxpixmap, GLX_FRONT_LEFT_EXT); - */ -} - - -static void -Resize(Window win, unsigned int width, unsigned int height) -{ - float sz = 1.5; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-sz, sz, -sz, sz, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); -} - - -static void -Redraw(Display *dpy, Window win, float rot) -{ - glClearColor(0.25, 0.25, 0.25, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - glPushMatrix(); - glRotatef(rot, 0, 0, 1); - glRotatef(2.0 * rot, 1, 0, 0); - - glBegin(GL_QUADS); - glTexCoord2d(0.0, bottom); - glVertex2f(-1, -1); - glTexCoord2d(1.0, bottom); - glVertex2f( 1, -1); - glTexCoord2d(1.0, top); - glVertex2d(1.0, 1.0); - glTexCoord2d(0.0, top); - glVertex2f(-1.0, 1.0); - glEnd(); - - glPopMatrix(); - - glXSwapBuffers(dpy, win); -} - - -static void -EventLoop(Display *dpy, Window win) -{ - GLfloat rot = 0.0; - int anim = 0; - - while (1) { - if (!anim || XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - - switch (event.type) { - case Expose: - Redraw(dpy, win, rot); - break; - case ConfigureNotify: - Resize(event.xany.window, - event.xconfigure.width, - event.xconfigure.height); - break; - case KeyPress: - { - char buf[100]; - KeySym keySym; - XComposeStatus stat; - XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); - if (keySym == XK_Escape) { - return; /* exit */ - } - else if (keySym == XK_r) { - rot += 1.0; - Redraw(dpy, win, rot); - } - else if (keySym == XK_a) { - anim = !anim; - } - else if (keySym == XK_R) { - rot -= 1.0; - Redraw(dpy, win, rot); - } - } - break; - default: - ; /*no-op*/ - } - } - else { - /* animate */ - rot += 1.0; - Redraw(dpy, win, rot); - } - } -} - - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - GLXFBConfig pixmapConfig; - XVisualInfo *windowVis; - GLXPixmap gp; - Window win; - GLXContext ctx; - Pixmap p; - - dpy = OpenDisplay(); - - pixmapConfig = ChoosePixmapFBConfig(dpy); - windowVis = ChooseWindowVisual(dpy); - win = CreateWindow(dpy, windowVis, 500, 500, "Texture From Pixmap"); - - gp = CreatePixmap(dpy, pixmapConfig, 512, 512, &p); - DrawPixmapImage(dpy, p, 512, 512); - - ctx = glXCreateContext(dpy, windowVis, NULL, True); - if (!ctx) { - printf("Couldn't create GLX context\n"); - exit(1); - } - - glXMakeCurrent(dpy, win, ctx); - - BindPixmapTexture(dpy, gp); - - EventLoop(dpy, win); - - return 0; -} diff --git a/progs/xdemos/wincopy.c b/progs/xdemos/wincopy.c deleted file mode 100644 index f670983a0f7..00000000000 --- a/progs/xdemos/wincopy.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5.2 - * - * Copyright (C) 1999-2006 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 opens two GLX windows, renders into one and uses - * glCopyPixels to copy the image from the first window into the - * second by means of the GLX 1.3 function glxMakeContextCurrent(). - * This function works just like the glXMakeCurrentReadSGI() function - * in the GLX_SGI_make_current_read extension. - */ - - -#define GL_GLEXT_PROTOTYPES -#define GLX_GLXEXT_PROTOTYPES -#include <GL/gl.h> -#include <GL/glx.h> -#include <X11/keysym.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - - -#ifdef GLX_VERSION_1_3 - - -static Display *Dpy; -static int ScrNum; -static GLXContext Context; -static Window Win[2]; /* Win[0] = source, Win[1] = dest */ -static GLint Width[2], Height[2]; -static GLboolean TestClipping = GL_FALSE; -static GLfloat Angle = 0.0; - -static GLboolean DrawFront = GL_FALSE; - -PFNGLXMAKECURRENTREADSGIPROC make_context_current = NULL; - -static Window -CreateWindow(Display *dpy, int scrnum, XVisualInfo *visinfo, - int xpos, int ypos, int width, int height, - const char *name) -{ - Window win; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - - 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, xpos, ypos, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr); - if (win) { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, name, name, - None, (char **)NULL, 0, &sizehints); - - XMapWindow(dpy, win); - } - return win; -} - - -static void -Redraw(void) -{ - /* make the first window the current one */ - if (! (*make_context_current)(Dpy, Win[0], Win[0], Context)) { - printf("glXMakeContextCurrent failed in Redraw()\n"); - return; - } - - Angle += 1.0; - - if (DrawFront) { - glDrawBuffer(GL_FRONT); - glReadBuffer(GL_FRONT); - } - else { - glDrawBuffer(GL_BACK); - glReadBuffer(GL_BACK); - } - - glViewport(0, 0, Width[0], Height[0]); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - - glShadeModel(GL_FLAT); - glClearColor(0.5, 0.5, 0.5, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* draw blue quad */ - glColor3f(0.3, 0.3, 1.0); - glPushMatrix(); - glRotatef(Angle, 0, 0, 1); - glBegin(GL_POLYGON); - glVertex2f(-0.5, -0.25); - glVertex2f( 0.5, -0.25); - glVertex2f( 0.5, 0.25); - glVertex2f(-0.5, 0.25); - glEnd(); - glPopMatrix(); - - if (DrawFront) - glFinish(); - else - glXSwapBuffers(Dpy, Win[0]); - - - /* copy image from window 0 to window 1 */ - if (!(*make_context_current)(Dpy, Win[1], Win[0], Context)) { - printf("glXMakeContextCurrent failed in Redraw()\n"); - return; - } - - /* copy the image between windows */ - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - if (TestClipping) { - glWindowPos2iARB(-2, -2); - glCopyPixels(-2, -2, Width[0] + 4, Height[0] + 4, GL_COLOR); - } - else { - glWindowPos2iARB(0, 0); - glCopyPixels(0, 0, Width[0], Height[0], GL_COLOR); - } - - if (DrawFront) - glFinish(); - else - glXSwapBuffers(Dpy, Win[1]); -} - - - -static void -Resize(Window win, unsigned int width, unsigned int height) -{ - int i; - if (win == Win[0]) { - i = 0; - } - else { - i = 1; - } - Width[i] = width; - Height[i] = height; - if (!glXMakeCurrent(Dpy, Win[i], Context)) { - printf("glXMakeCurrent failed in Resize()\n"); - return; - } -} - - - -static void -EventLoop(void) -{ - XEvent event; - while (1) { - if (XPending(Dpy) > 0) { - XNextEvent( Dpy, &event ); - switch (event.type) { - case Expose: - Redraw(); - break; - case ConfigureNotify: - Resize(event.xany.window, event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - { - char buf[100]; - KeySym keySym; - XComposeStatus stat; - XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); - if (keySym == XK_Escape) { - /* exit */ - return; - } - else if (buf[0] == 'f') { - DrawFront = !DrawFront; - printf("Drawing to %s buffer\n", - DrawFront ? "GL_FRONT" : "GL_BACK"); - } - } - break; - default: - /*no-op*/ ; - } - } - else { - /* animate */ - Redraw(); - } - } -} - - -static void -Init(void) -{ - XVisualInfo *visinfo; - int attrib[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - None }; - int major, minor; - - Dpy = XOpenDisplay(NULL); - if (!Dpy) { - printf("Couldn't open default display!\n"); - exit(1); - } - - ScrNum = DefaultScreen(Dpy); - - glXQueryVersion(Dpy, &major, &minor); - - if (major * 100 + minor >= 103) { - make_context_current = (PFNGLXMAKECURRENTREADSGIPROC) - glXGetProcAddressARB( (GLubyte *) "glXMakeContextCurrent" ); - } - else { - const char * const glxExtensions = glXQueryExtensionsString(Dpy, ScrNum); - const char * ext = strstr( glxExtensions, "GLX_SGI_make_current_read" ); - const size_t len = strlen( "GLX_SGI_make_current_read" ); - - if ( (ext != NULL) - && ((ext[len] == ' ') || (ext[len] == '\0')) ) { - make_context_current = (PFNGLXMAKECURRENTREADSGIPROC) - glXGetProcAddressARB( (GLubyte *) "glXMakeCurrentReadSGI" ); - } - } - - if (make_context_current == NULL) { - fprintf(stderr, "Sorry, this program requires either GLX 1.3 " - "or GLX_SGI_make_current_read.\n"); - exit(1); - } - - visinfo = glXChooseVisual(Dpy, ScrNum, attrib); - if (!visinfo) { - printf("Unable to find RGB, double-buffered visual\n"); - exit(1); - } - - Context = glXCreateContext(Dpy, visinfo, NULL, True); - if (!Context) { - printf("Couldn't create GLX context\n"); - exit(1); - } - - - Win[0] = CreateWindow(Dpy, ScrNum, visinfo, - 0, 0, 300, 300, "source window"); - - Win[1] = CreateWindow(Dpy, ScrNum, visinfo, - 350, 0, 300, 300, "dest window"); - - printf("Press Esc to exit\n"); - printf("Press 'f' to toggle front/back buffer drawing\n"); -} - - -int -main(int argc, char *argv[]) -{ - if (argc > 1 && strcmp(argv[1], "-clip") == 0) - TestClipping = GL_TRUE; - Init(); - EventLoop(); - return 0; -} - - -#else - - -int -main(int argc, char *argv[]) -{ - printf("This program requires GLX 1.3!\n"); - return 0; -} - - -#endif /* GLX_VERSION_1_3 */ diff --git a/progs/xdemos/xdemo.c b/progs/xdemos/xdemo.c deleted file mode 100644 index 52039cb6424..00000000000 --- a/progs/xdemos/xdemo.c +++ /dev/null @@ -1,334 +0,0 @@ - -/* - * Very simple demo of how to use the Mesa/X11 interface instead of the - * glx, tk or aux toolkits. I highly recommend using the GLX interface - * instead of the X/Mesa interface, however. - * - * This program is in the public domain. - * - * Brian Paul - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include "GL/xmesa.h" -#include "GL/gl.h" - - - -static GLint Black, Red, Green, Blue; - - - -static void make_window( char *title, int color_flag ) -{ - int x = 10, y = 10, width = 400, height = 300; - Display *dpy; - int scr; - Window root, win; - Colormap cmap; - XColor xcolor; - int attr_flags; - XVisualInfo *visinfo; - XSetWindowAttributes attr; - XTextProperty tp; - XSizeHints sh; - XEvent e; - XMesaContext context; - XMesaVisual visual; - XMesaBuffer buffer; - - - /* - * Do the usual X things to make a window. - */ - - dpy = XOpenDisplay(NULL); - if (!dpy) { - printf("Couldn't open default display!\n"); - exit(1); - } - - scr = DefaultScreen(dpy); - root = RootWindow(dpy, scr); - - /* alloc visinfo struct */ - visinfo = (XVisualInfo *) malloc( sizeof(XVisualInfo) ); - - /* Get a visual and colormap */ - if (color_flag) { - /* Open TrueColor window */ - -/* - if (!XMatchVisualInfo( dpy, scr, 24, TrueColor, visinfo )) { - printf("Couldn't get 24-bit TrueColor visual!\n"); - exit(1); - } -*/ - if (!XMatchVisualInfo( dpy, scr, 8, PseudoColor, visinfo )) { - printf("Couldn't get 8-bit PseudoColor visual!\n"); - exit(1); - } - - cmap = XCreateColormap( dpy, root, visinfo->visual, AllocNone ); - Black = Red = Green = Blue = 0; - } - else { - /* Open color index window */ - - if (!XMatchVisualInfo( dpy, scr, 8, PseudoColor, visinfo )) { - printf("Couldn't get 8-bit PseudoColor visual\n"); - exit(1); - } - - cmap = XCreateColormap( dpy, root, visinfo->visual, AllocNone ); - - /* Allocate colors */ - xcolor.red = 0x0; - xcolor.green = 0x0; - xcolor.blue = 0x0; - xcolor.flags = DoRed | DoGreen | DoBlue; - if (!XAllocColor( dpy, cmap, &xcolor )) { - printf("Couldn't allocate black!\n"); - exit(1); - } - Black = xcolor.pixel; - - xcolor.red = 0xffff; - xcolor.green = 0x0; - xcolor.blue = 0x0; - xcolor.flags = DoRed | DoGreen | DoBlue; - if (!XAllocColor( dpy, cmap, &xcolor )) { - printf("Couldn't allocate red!\n"); - exit(1); - } - Red = xcolor.pixel; - - xcolor.red = 0x0; - xcolor.green = 0xffff; - xcolor.blue = 0x0; - xcolor.flags = DoRed | DoGreen | DoBlue; - if (!XAllocColor( dpy, cmap, &xcolor )) { - printf("Couldn't allocate green!\n"); - exit(1); - } - Green = xcolor.pixel; - - xcolor.red = 0x0; - xcolor.green = 0x0; - xcolor.blue = 0xffff; - xcolor.flags = DoRed | DoGreen | DoBlue; - if (!XAllocColor( dpy, cmap, &xcolor )) { - printf("Couldn't allocate blue!\n"); - exit(1); - } - Blue = xcolor.pixel; - } - - /* set window attributes */ - attr.colormap = cmap; - attr.event_mask = ExposureMask | StructureNotifyMask; - attr.border_pixel = BlackPixel( dpy, scr ); - attr.background_pixel = BlackPixel( dpy, scr ); - attr_flags = CWColormap | CWEventMask | CWBorderPixel | CWBackPixel; - - /* Create the window */ - win = XCreateWindow( dpy, root, x,y, width, height, 0, - visinfo->depth, InputOutput, - visinfo->visual, - attr_flags, &attr); - if (!win) { - printf("Couldn't open window!\n"); - exit(1); - } - - XStringListToTextProperty(&title, 1, &tp); - sh.flags = USPosition | USSize; - XSetWMProperties(dpy, win, &tp, &tp, 0, 0, &sh, 0, 0); - XMapWindow(dpy, win); - while (1) { - XNextEvent( dpy, &e ); - if (e.type == MapNotify && e.xmap.window == win) { - break; - } - } - - - /* - * Now do the special Mesa/Xlib stuff! - */ - - visual = XMesaCreateVisual( dpy, visinfo, - (GLboolean) color_flag, - GL_FALSE, /* alpha_flag */ - GL_FALSE, /* db_flag */ - GL_FALSE, /* stereo flag */ - GL_FALSE, /* ximage_flag */ - 0, /* depth size */ - 0, /* stencil size */ - 0,0,0,0, /* accum_size */ - 0, /* num samples */ - 0, /* level */ - 0 /* caveat */ - ); - if (!visual) { - printf("Couldn't create Mesa/X visual!\n"); - exit(1); - } - - /* Create a Mesa rendering context */ - context = XMesaCreateContext( visual, - NULL /* share_list */ - ); - if (!context) { - printf("Couldn't create Mesa/X context!\n"); - exit(1); - } - - buffer = XMesaCreateWindowBuffer( visual, win ); - if (!buffer) { - printf("Couldn't create Mesa/X buffer!\n"); - exit(1); - } - - - XMesaMakeCurrent( context, buffer ); - - /* Ready to render! */ -} - - - -static void draw_cube( void ) -{ - /* X faces */ - glIndexi( Red ); - glColor3f( 1.0, 0.0, 0.0 ); - glBegin( GL_POLYGON ); - glVertex3f( 1.0, 1.0, 1.0 ); - glVertex3f( 1.0, -1.0, 1.0 ); - glVertex3f( 1.0, -1.0, -1.0 ); - glVertex3f( 1.0, 1.0, -1.0 ); - glEnd(); - - glBegin( GL_POLYGON ); - glVertex3f( -1.0, 1.0, 1.0 ); - glVertex3f( -1.0, 1.0, -1.0 ); - glVertex3f( -1.0, -1.0, -1.0 ); - glVertex3f( -1.0, -1.0, 1.0 ); - glEnd(); - - /* Y faces */ - glIndexi( Green ); - glColor3f( 0.0, 1.0, 0.0 ); - glBegin( GL_POLYGON ); - glVertex3f( 1.0, 1.0, 1.0 ); - glVertex3f( 1.0, 1.0, -1.0 ); - glVertex3f( -1.0, 1.0, -1.0 ); - glVertex3f( -1.0, 1.0, 1.0 ); - glEnd(); - - glBegin( GL_POLYGON ); - glVertex3f( 1.0, -1.0, 1.0 ); - glVertex3f( -1.0, -1.0, 1.0 ); - glVertex3f( -1.0, -1.0, -1.0 ); - glVertex3f( 1.0, -1.0, -1.0 ); - glEnd(); - - /* Z faces */ - glIndexi( Blue ); - glColor3f( 0.0, 0.0, 1.0 ); - glBegin( GL_POLYGON ); - glVertex3f( 1.0, 1.0, 1.0 ); - glVertex3f( -1.0, 1.0, 1.0 ); - glVertex3f( -1.0, -1.0, 1.0 ); - glVertex3f( 1.0, -1.0, 1.0 ); - glEnd(); - - glBegin( GL_POLYGON ); - glVertex3f( 1.0, 1.0, -1.0 ); - glVertex3f( 1.0,-1.0, -1.0 ); - glVertex3f( -1.0,-1.0, -1.0 ); - glVertex3f( -1.0, 1.0, -1.0 ); - glEnd(); -} - - - - -static void display_loop( void ) -{ - GLfloat xrot, yrot, zrot; - - xrot = yrot = zrot = 0.0; - - glClearColor( 0.0, 0.0, 0.0, 0.0 ); - glClearIndex( Black ); - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glFrustum( -1.0, 1.0, -1.0, 1.0, 1.0, 10.0 ); - glTranslatef( 0.0, 0.0, -5.0 ); - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - glCullFace( GL_BACK ); - glEnable( GL_CULL_FACE ); - - glShadeModel( GL_FLAT ); - - while (1) { - glClear( GL_COLOR_BUFFER_BIT ); - glPushMatrix(); - glRotatef( xrot, 1.0, 0.0, 0.0 ); - glRotatef( yrot, 0.0, 1.0, 0.0 ); - glRotatef( zrot, 0.0, 0.0, 1.0 ); - - draw_cube(); - - glPopMatrix(); - glFinish(); - - xrot += 10.0; - yrot += 7.0; - zrot -= 3.0; - } - -} - - - - -int main( int argc, char *argv[] ) -{ - int mode = 0; - - if (argc >= 2) - { - if (strcmp(argv[1],"-ci")==0) - mode = 0; - else if (strcmp(argv[1],"-rgb")==0) - mode = 1; - else - { - printf("Bad flag: %s\n", argv[1]); - printf("Specify -ci for 8-bit color index or -rgb for RGB mode\n"); - exit(1); - } - } - else - { - printf("Specify -ci for 8-bit color index or -rgb for RGB mode\n"); - printf("Defaulting to 8-bit color index\n"); - } - - make_window( argv[0], mode ); - - display_loop(); - return 0; -} - diff --git a/progs/xdemos/xfont.c b/progs/xdemos/xfont.c deleted file mode 100644 index 2585aa6447c..00000000000 --- a/progs/xdemos/xfont.c +++ /dev/null @@ -1,206 +0,0 @@ - -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999 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. - */ - - -/* - * Example of using glXUseXFont(). - * 5 November 1999 - * Brian Paul - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static const char *ProgramName = "xfont"; - -static const char *FontName = "fixed"; - -static GLuint FontBase = 0; - - - -static void redraw( Display *dpy, Window w ) -{ - static const char *text = "This is glXUseXFont()"; - - glClear( GL_COLOR_BUFFER_BIT ); - - /* triangle */ - glColor3f( 0.2, 0.2, 1.0 ); - glBegin(GL_TRIANGLES); - glVertex2f( 0, 0.8 ); - glVertex2f( -0.8, -0.7 ); - glVertex2f( 0.8, -0.7 ); - glEnd(); - - /* text */ - glColor3f( 1, 1, 1 ); - glRasterPos2f(-0.8, 0); - glListBase(FontBase); - glCallLists(strlen(text), GL_UNSIGNED_BYTE, (GLubyte *) text); - - glXSwapBuffers( dpy, w ); -} - - - -static void resize( unsigned int width, unsigned int height ) -{ - glViewport( 0, 0, width, height ); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); -} - - - -static void setup_font( Display *dpy ) -{ - XFontStruct *fontInfo; - Font id; - unsigned int first, last; - - fontInfo = XLoadQueryFont(dpy, FontName); - if (!fontInfo) { - printf("Error: font %s not found\n", FontName); - exit(0); - } - - id = fontInfo->fid; - first = fontInfo->min_char_or_byte2; - last = fontInfo->max_char_or_byte2; - - FontBase = glGenLists((GLuint) last + 1); - if (!FontBase) { - printf("Error: unable to allocate display lists\n"); - exit(0); - } - glXUseXFont(id, first, last - first + 1, FontBase + first); -} - -static Window make_rgb_db_window( Display *dpy, int xpos, int ypos, - 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 | KeyPressMask; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow( dpy, root, 0, 0, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr ); - - { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, ProgramName, ProgramName, - None, (char **)NULL, 0, &sizehints); - } - - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - - 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; - case KeyPress: - exit(0); - default: - ; /* no-op */ - } - } -} - - - -int main( int argc, char *argv[] ) -{ - Display *dpy; - Window win; - - dpy = XOpenDisplay(NULL); - - win = make_rgb_db_window( dpy, 0, 0, 300, 300 ); - setup_font( dpy ); - - glShadeModel( GL_FLAT ); - glClearColor( 0.5, 0.5, 1.0, 1.0 ); - - XMapWindow( dpy, win ); - - event_loop( dpy ); - return 0; -} diff --git a/progs/xdemos/xrotfontdemo.c b/progs/xdemos/xrotfontdemo.c deleted file mode 100644 index 58cd0286cc6..00000000000 --- a/progs/xdemos/xrotfontdemo.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Mesa 3-D graphics library - * - * Copyright (C) 1999 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. - */ - - -/* - * Example of using glXUseRotatedXFontMESA(). - * 24 Jan 2004 - * Brian Paul - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "xuserotfont.h" - - -static const char *ProgramName = "xfont"; - -static const char *FontName = "fixed"; - -static GLuint FontBase[4]; - - -static void redraw( Display *dpy, Window w ) -{ - static const char *text = " Rotated bitmap text"; - int i; - - glClear( GL_COLOR_BUFFER_BIT ); - - /* triangle */ - glColor3f( 0.2, 0.2, 1.0 ); - glBegin(GL_TRIANGLES); - glVertex2f( -0.8, 0.7 ); - glVertex2f( -0.8, -0.7 ); - glVertex2f( 0.8, 0.0 ); - glEnd(); - - /* marker */ - glColor3f( 0, 1, 0 ); - glBegin(GL_POINTS); - glVertex2f(0, 0); - glEnd(); - - /* text */ - glColor3f( 1, 1, 1 ); - - for (i = 0; i < 4; i++) { - glRasterPos2f(0, 0); - glListBase(FontBase[i]); - glCallLists(strlen(text), GL_UNSIGNED_BYTE, (GLubyte *) text); - } - - glXSwapBuffers( dpy, w ); -} - - - -static void resize( unsigned int width, unsigned int height ) -{ - glViewport( 0, 0, width, height ); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); -} - - - -static void setup_font( Display *dpy ) -{ - XFontStruct *fontInfo; - Font id; - unsigned int first, last; - int i; - - fontInfo = XLoadQueryFont(dpy, FontName); - if (!fontInfo) { - printf("Error: font %s not found\n", FontName); - exit(0); - } - - id = fontInfo->fid; - first = fontInfo->min_char_or_byte2; - last = fontInfo->max_char_or_byte2; - - for (i = 0; i < 4; i++) { - FontBase[i] = glGenLists((GLuint) last + 1); - if (!FontBase[i]) { - printf("Error: unable to allocate display lists\n"); - exit(0); - } - glXUseRotatedXFontMESA(id, first, last - first + 1, FontBase[i] + first, - i * 90); - } -} - - -static Window make_rgb_db_window( Display *dpy, int xpos, int ypos, - 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 | KeyPressMask; - mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - - win = XCreateWindow( dpy, root, 0, 0, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr ); - - { - XSizeHints sizehints; - sizehints.x = xpos; - sizehints.y = ypos; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, ProgramName, ProgramName, - None, (char **)NULL, 0, &sizehints); - } - - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - - 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; - case KeyPress: - exit(0); - default: - ; /* no-op */ - } - } -} - - - -int main( int argc, char *argv[] ) -{ - Display *dpy; - Window win; - - dpy = XOpenDisplay(NULL); - - win = make_rgb_db_window( dpy, 0, 0, 300, 300 ); - setup_font( dpy ); - - glShadeModel( GL_FLAT ); - glClearColor( 0.5, 0.5, 1.0, 1.0 ); - - XMapWindow( dpy, win ); - - event_loop( dpy ); - return 0; -} diff --git a/progs/xdemos/xuserotfont.c b/progs/xdemos/xuserotfont.c deleted file mode 100644 index adb849511d8..00000000000 --- a/progs/xdemos/xuserotfont.c +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Mesa 3-D graphics library - * Version: 6.1 - * - * Copyright (C) 1999-2004 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. - */ - - -/* \file xuserotfont.c - * - * A function like glXUseXFont() but takes a 0, 90, 180 or 270 degree - * rotation angle for rotated text display. - * - * Based on Mesa's glXUseXFont implementation written by Thorsten Ohl. - */ - -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <GL/glx.h> -#include "xuserotfont.h" - - -/** - * Generate OpenGL-compatible bitmap by drawing an X character glyph - * to an off-screen pixmap, then getting the image and testing pixels. - * \param width bitmap width in pixels - * \param height bitmap height in pixels - */ -static void -fill_bitmap(Display *dpy, Pixmap pixmap, GC gc, - unsigned int bitmapWidth, unsigned int bitmapHeight, - unsigned int charWidth, unsigned int charHeight, - int xPos, int yPos, unsigned int c, GLubyte * bitmap, - int rotation) -{ - const int bytesPerRow = (bitmapWidth + 7) / 8; - XImage *image; - XChar2b char2b; - - /* clear pixmap to 0 */ - XSetForeground(dpy, gc, 0); - XFillRectangle(dpy, pixmap, gc, 0, 0, charWidth, charHeight); - - /* The glyph is drawn snug up against the left/top edges of the pixmap */ - XSetForeground(dpy, gc, 1); - char2b.byte1 = (c >> 8) & 0xff; - char2b.byte2 = (c & 0xff); - XDrawString16(dpy, pixmap, gc, xPos, yPos, &char2b, 1); - - /* initialize GL bitmap */ - memset(bitmap, 0, bytesPerRow * bitmapHeight); - - image = XGetImage(dpy, pixmap, 0, 0, charWidth, charHeight, 1, XYPixmap); - if (image) { - /* Set appropriate bits in the GL bitmap. - * Note: X11 and OpenGL are upside down wrt each other). - */ - unsigned int x, y; - if (rotation == 0) { - for (y = 0; y < charHeight; y++) { - for (x = 0; x < charWidth; x++) { - if (XGetPixel(image, x, y)) { - int y2 = bitmapHeight - y - 1; - bitmap[bytesPerRow * y2 + x / 8] |= (1 << (7 - (x % 8))); - } - } - } - } - else if (rotation == 90) { - for (y = 0; y < charHeight; y++) { - for (x = 0; x < charWidth; x++) { - if (XGetPixel(image, x, y)) { - int x2 = y; - int y2 = x; - bitmap[bytesPerRow * y2 + x2 / 8] |= (1 << (7 - (x2 % 8))); - } - } - } - } - else if (rotation == 180) { - for (y = 0; y < charHeight; y++) { - for (x = 0; x < charWidth; x++) { - if (XGetPixel(image, x, y)) { - int x2 = charWidth - x - 1; - bitmap[bytesPerRow * y + x2 / 8] |= (1 << (7 - (x2 % 8))); - } - } - } - } - else { - assert(rotation == 270); - for (y = 0; y < charHeight; y++) { - for (x = 0; x < charWidth; x++) { - if (XGetPixel(image, x, y)) { - int x2 = charHeight - y - 1; - int y2 = charWidth - x - 1; - bitmap[bytesPerRow * y2 + x2 / 8] |= (1 << (7 - (x2 % 8))); - } - } - } - } - XDestroyImage(image); - } -} - - -/* - * Determine if a given glyph is valid and return the - * corresponding XCharStruct. - */ -static const XCharStruct * -isvalid(const XFontStruct * fs, unsigned int which) -{ - unsigned int rows, pages; - unsigned int byte1 = 0, byte2 = 0; - int i, valid = 1; - - rows = fs->max_byte1 - fs->min_byte1 + 1; - pages = fs->max_char_or_byte2 - fs->min_char_or_byte2 + 1; - - if (rows == 1) { - /* "linear" fonts */ - if ((fs->min_char_or_byte2 > which) || (fs->max_char_or_byte2 < which)) - valid = 0; - } - else { - /* "matrix" fonts */ - byte2 = which & 0xff; - byte1 = which >> 8; - if ((fs->min_char_or_byte2 > byte2) || - (fs->max_char_or_byte2 < byte2) || - (fs->min_byte1 > byte1) || (fs->max_byte1 < byte1)) - valid = 0; - } - - if (valid) { - if (fs->per_char) { - if (rows == 1) { - /* "linear" fonts */ - return fs->per_char + (which - fs->min_char_or_byte2); - } - else { - /* "matrix" fonts */ - i = ((byte1 - fs->min_byte1) * pages) + - (byte2 - fs->min_char_or_byte2); - return fs->per_char + i; - } - } - else { - return &fs->min_bounds; - } - } - return NULL; -} - - -void -glXUseRotatedXFontMESA(Font font, int first, int count, int listbase, - int rotation) -{ - Display *dpy; - Window win; - Pixmap pixmap; - GC gc; - XFontStruct *fs; - GLint swapbytes, lsbfirst, rowlength; - GLint skiprows, skippixels, alignment; - unsigned int maxCharWidth, maxCharHeight; - GLubyte *bm; - int i; - - if (rotation != 0 && - rotation != 90 && - rotation != 180 && - rotation != 270) - return; - - dpy = glXGetCurrentDisplay(); - if (!dpy) - return; /* I guess glXMakeCurrent wasn't called */ - win = RootWindow(dpy, DefaultScreen(dpy)); - - fs = XQueryFont(dpy, font); - if (!fs) { - /* - _mesa_error(NULL, GL_INVALID_VALUE, - "Couldn't get font structure information"); - */ - return; - } - - /* Allocate a GL bitmap that can fit any character */ - maxCharWidth = fs->max_bounds.rbearing - fs->min_bounds.lbearing; - maxCharHeight = fs->max_bounds.ascent + fs->max_bounds.descent; - /* use max, in case we're rotating */ - if (rotation == 90 || rotation == 270) { - /* swap width/height */ - bm = (GLubyte *) malloc((maxCharHeight + 7) / 8 * maxCharWidth); - } - else { - /* normal or upside down */ - bm = (GLubyte *) malloc((maxCharWidth + 7) / 8 * maxCharHeight); - } - if (!bm) { - XFreeFontInfo(NULL, fs, 1); - /* - _mesa_error(NULL, GL_OUT_OF_MEMORY, - "Couldn't allocate bitmap in glXUseXFont()"); - */ - return; - } - -#if 0 - /* get the page info */ - pages = fs->max_char_or_byte2 - fs->min_char_or_byte2 + 1; - firstchar = (fs->min_byte1 << 8) + fs->min_char_or_byte2; - lastchar = (fs->max_byte1 << 8) + fs->max_char_or_byte2; - rows = fs->max_byte1 - fs->min_byte1 + 1; - unsigned int first_char, last_char, pages, rows; -#endif - - /* Save the current packing mode for bitmaps. */ - glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes); - glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst); - glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength); - glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows); - glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels); - glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); - - /* Enforce a standard packing mode which is compatible with - fill_bitmap() from above. This is actually the default mode, - except for the (non)alignment. */ - glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE); - glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - /* Create pixmap and GC */ - pixmap = XCreatePixmap(dpy, win, maxCharWidth, maxCharHeight, 1); - { - XGCValues values; - unsigned long valuemask; - values.foreground = BlackPixel(dpy, DefaultScreen(dpy)); - values.background = WhitePixel(dpy, DefaultScreen(dpy)); - values.font = fs->fid; - valuemask = GCForeground | GCBackground | GCFont; - gc = XCreateGC(dpy, pixmap, valuemask, &values); - } - -#ifdef DEBUG_XROT - if (debug_xfonts) - dump_font_struct(fs); -#endif - - for (i = 0; i < count; i++) { - const unsigned int c = first + i; - const int list = listbase + i; - unsigned int charWidth, charHeight; - unsigned int bitmapWidth = 0, bitmapHeight = 0; - GLfloat xOrig, yOrig, xStep, yStep, dtemp; - const XCharStruct *ch; - int xPos, yPos; - int valid; - - /* check on index validity and get the bounds */ - ch = isvalid(fs, c); - if (!ch) { - ch = &fs->max_bounds; - valid = 0; - } - else { - valid = 1; - } - -#ifdef DEBUG_XROT - if (debug_xfonts) { - char s[7]; - sprintf(s, isprint(c) ? "%c> " : "\\%03o> ", c); - dump_char_struct(ch, s); - } -#endif - - /* glBitmap()' parameters: - straight from the glXUseXFont(3) manpage. */ - charWidth = ch->rbearing - ch->lbearing; - charHeight = ch->ascent + ch->descent; - xOrig = -ch->lbearing; - yOrig = ch->descent; - xStep = ch->width; - yStep = 0; - - /* X11's starting point. */ - xPos = -ch->lbearing; - yPos = ch->ascent; - - /* Apply rotation */ - switch (rotation) { - case 0: - /* nothing */ - bitmapWidth = charWidth; - bitmapHeight = charHeight; - break; - case 90: - /* xStep, yStep */ - dtemp = xStep; - xStep = -yStep; - yStep = dtemp; - /* xOrig, yOrig */ - yOrig = xOrig; - xOrig = charHeight - (charHeight - yPos); - /* width, height */ - bitmapWidth = charHeight; - bitmapHeight = charWidth; - break; - case 180: - /* xStep, yStep */ - xStep = -xStep; - yStep = -yStep; - /* xOrig, yOrig */ - xOrig = charWidth - xOrig - 1; - yOrig = charHeight - yOrig - 1; - bitmapWidth = charWidth; - bitmapHeight = charHeight; - break; - case 270: - /* xStep, yStep */ - dtemp = xStep; - xStep = yStep; - yStep = -dtemp; - /* xOrig, yOrig */ - dtemp = yOrig; - yOrig = charWidth - xOrig; - xOrig = dtemp; - /* width, height */ - bitmapWidth = charHeight; - bitmapHeight = charWidth; - break; - default: - /* should never get here */ - ; - } - - glNewList(list, GL_COMPILE); - if (valid && bitmapWidth > 0 && bitmapHeight > 0) { - - fill_bitmap(dpy, pixmap, gc, bitmapWidth, bitmapHeight, - charWidth, charHeight, - xPos, yPos, c, bm, rotation); - - glBitmap(bitmapWidth, bitmapHeight, xOrig, yOrig, xStep, yStep, bm); - -#ifdef DEBUG_XROT - if (debug_xfonts) { - printf("width/height = %u/%u\n", bitmapWidth, bitmapHeight); - dump_bitmap(bitmapWidth, bitmapHeight, bm); - } -#endif - } - else { - glBitmap(0, 0, 0.0, 0.0, xStep, yStep, NULL); - } - glEndList(); - } - - free(bm); - XFreeFontInfo(NULL, fs, 1); - XFreePixmap(dpy, pixmap); - XFreeGC(dpy, gc); - - /* Restore saved packing modes. */ - glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes); - glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst); - glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength); - glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels); - glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); -} - - diff --git a/progs/xdemos/xuserotfont.h b/progs/xdemos/xuserotfont.h deleted file mode 100644 index ea49203b7b9..00000000000 --- a/progs/xdemos/xuserotfont.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef XUSEROTFONT_H -#define XUSEROTFONT_H - -#include <X11/Xlib.h> - - -extern void -glXUseRotatedXFontMESA(Font font, int first, int count, int listbase, - int rotation); - - -#endif diff --git a/progs/xdemos/yuvrect_client.c b/progs/xdemos/yuvrect_client.c deleted file mode 100644 index e2b79a7c0e1..00000000000 --- a/progs/xdemos/yuvrect_client.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Test the GL_NV_texture_rectangle and GL_MESA_ycrcb_texture extensions and GLX_MESA_allocate-memory - * - * Dave Airlie - Feb 2005 - */ - -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <X11/Xlib.h> -#include <X11/keysym.h> -#define GL_GLEXT_PROTOTYPES -#include <GL/glx.h> - -#include "../util/readtex.c" /* I know, this is a hack. */ - -#define TEXTURE_FILE "../images/girl2.rgb" - -static GLfloat Xrot = 0, Yrot = 0, Zrot = 0; -static GLint ImgWidth, ImgHeight; -static GLushort *ImageYUV = NULL; -static void *glx_memory; - -static void DrawObject(void) -{ - glBegin(GL_QUADS); - - glTexCoord2f(0, 0); - glVertex2f(-1.0, -1.0); - - glTexCoord2f(ImgWidth, 0); - glVertex2f(1.0, -1.0); - - glTexCoord2f(ImgWidth, ImgHeight); - glVertex2f(1.0, 1.0); - - glTexCoord2f(0, ImgHeight); - glVertex2f(-1.0, 1.0); - - glEnd(); -} - - -static void scr_Display( void ) -{ - glClear( GL_COLOR_BUFFER_BIT ); - - glPushMatrix(); - glRotatef(Xrot, 1.0, 0.0, 0.0); - glRotatef(Yrot, 0.0, 1.0, 0.0); - glRotatef(Zrot, 0.0, 0.0, 1.0); - DrawObject(); - glPopMatrix(); - -} - - -static void Reshape( int width, int height ) -{ - glViewport( 0, 0, width, height ); - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 ); - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - glTranslatef( 0.0, 0.0, -15.0 ); -} - -static int queryClient(Display *dpy, int screen) -{ -#ifdef GLX_MESA_allocate_memory - char *extensions; - - extensions = (char *)glXQueryExtensionsString(dpy, screen); - if (!extensions || !strstr(extensions,"GLX_MESA_allocate_memory")) { - return 0; - } - - return 1; -#else - return 0; -#endif -} - -static int -query_extension(char* extName) { - char *p = (char *) glGetString(GL_EXTENSIONS); - char *end = p + strlen(p); - while (p < end) { - int n = strcspn(p, " "); - if ((strlen(extName) == n) && (strncmp(extName, p, n) == 0)) - return GL_TRUE; - p += (n + 1); - } - return GL_FALSE; -} - -static void Init( int argc, char *argv[] , Display *dpy, int screen, Window win) -{ - GLuint texObj = 100; - const char *file; - void *glx_memory; - - if (!query_extension("GL_NV_texture_rectangle")) { - printf("Sorry, GL_NV_texture_rectangle is required\n"); - exit(0); - } - - if (!query_extension("GL_MESA_ycbcr_texture")) { - printf("Sorry, GL_MESA_ycbcr_texture is required\n"); - exit(0); - } - - if (!queryClient(dpy, screen)) { - printf("Sorry, GLX_MESA_allocate_memory is required\n"); - exit(0); - } - - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); - glBindTexture(GL_TEXTURE_RECTANGLE_NV, texObj); -#ifdef LINEAR_FILTER - /* linear filtering looks much nicer but is much slower for Mesa */ - glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -#else - glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -#endif - - if (argc > 1) - file = argv[1]; - else - file = TEXTURE_FILE; - - ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight); - if (!ImageYUV) { - printf("Couldn't read %s\n", TEXTURE_FILE); - exit(0); - } - - glx_memory = glXAllocateMemoryMESA(dpy, screen, ImgWidth * ImgHeight * 2, 0, 0 ,0); - if (!glx_memory) - { - fprintf(stderr,"Failed to allocate MESA memory\n"); - exit(-1); - } - - memcpy(glx_memory, ImageYUV, ImgWidth * ImgHeight * 2); - - printf("Image: %dx%d\n", ImgWidth, ImgHeight); - - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, - GL_YCBCR_MESA, ImgWidth, ImgHeight, 0, - GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_APPLE, glx_memory); - - assert(glGetError() == GL_NO_ERROR); - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glEnable(GL_TEXTURE_RECTANGLE_NV); - - glShadeModel(GL_FLAT); - glClearColor(0.3, 0.3, 0.4, 1.0); - -} - -/* - * 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, GLXContext *ctxRet) -{ - 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; - GLXContext ctx; - XVisualInfo *visinfo; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - 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, 0, 0, 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); - } - - ctx = glXCreateContext( dpy, visinfo, NULL, True ); - if (!ctx) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - XFree(visinfo); - - *winRet = win; - *ctxRet = ctx; -} - - -static void -event_loop(Display *dpy, Window win) -{ - while (1) { - while (XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - switch (event.type) { - case Expose: - /* we'll redraw below */ - break; - case ConfigureNotify: - Reshape(event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - { - char buffer[10]; - int r, code; - code = XLookupKeysym(&event.xkey, 0); - r = XLookupString(&event.xkey, buffer, sizeof(buffer), - NULL, NULL); - if (buffer[0] == 27) { - /* escape */ - return; - - } - } - } - } - - } -} - - -int -main(int argc, char *argv[]) -{ - Display *dpy; - Window win; - GLXContext ctx; - 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) { - printf("Error: couldn't open display %s\n", - XDisplayName(dpyName)); - return -1; - } - - make_window(dpy, "yuvrect_client", 0, 0, 300, 300, &win, &ctx); - XMapWindow(dpy, win); - glXMakeCurrent(dpy, win, ctx); - - 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)); - } - - Init(argc, argv, dpy, DefaultScreen(dpy), win); - - scr_Display(); - glXSwapBuffers(dpy, win); - event_loop(dpy, win); - - glXFreeMemoryMESA(dpy, DefaultScreen(dpy), glx_memory); - glXDestroyContext(dpy, ctx); - XDestroyWindow(dpy, win); - XCloseDisplay(dpy); - - return 0; -} |